C语言书写羊了个羊第一关(详解版)(二)

简介: C语言书写羊了个羊第一关(详解版)(二)

加载游戏图片(重点)

void updategame()
{
  BeginBatchDraw();               // 双缓冲区, 加载图片的时候, 防止闪烁
  putimage(0, 0, &BG);
  int distanceX = (504 - 61 * 3 - 15 * 2) / 2;
  int distanceY = 270;
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      if (map[i][j] == 0)      //
      {
        continue;
      }
      else
      {
        int x = distanceX + j * (61 + 15);
        int y = distanceY + i * (68 + 15);
        putimage(x, y, &Role[map[i][j] - 1]);
      }
    }
  }
  for (int i = 0; i < 7; i++)
  {
    if (cao[i] != 0)
    {
      int x = 26 + 64.7 * i;
      int y = 696;
      putimage(x, y, &Role[cao[i] - 1]);
    }
  }
  EndBatchDraw();
}

1.在加载图片的过程中,可能会出现图片的闪烁
解决办法:建立一个双缓冲区

用BeighBatchDraw()函数和EedBatchDraw()函数。

将加载图片的步骤,放在两个函数的中间。

2.放置背景图片

3… 放置游戏图片 , 数组中1代表的是 第一张图片, 2代表的是第二张图片, 3代表的是第三张图片,0则不打印图片(即直接continue)

这里需要做一些简单的计算, 通过背景图片的大小和游戏图片的大小,,计算出相对应的距离,让图片放在相应的位置

distancex是图片离,游戏左框框的位置(初始值需要具体计算)

distancey是图片离, 游戏上框框的位置(图片没在中间, 初始值随便恰当给个距离)

15(可以自己随便设置) 为2张图片的间隔距离

4.放置羊槽的图片,羊槽中最多可以放置7张图片, 这里需要在画图工具,用刻度尺,自己量一下羊槽的总距离,在根据元游戏图片的大小,进行一个简单的计算。

羊槽的元素最开始初始化为0, 打印图片,

肯定是cao[i] ! = 0;

图片的点击

typedef struct location
{
  int row;
  int col;
}LO;
bool userClick(LO* Location)
{
  ExMessage m;
  if (peekmessage(&m) && m.message == WM_LBUTTONDOWN)   //检查是否有鼠标左键的消息
  {
    int distanceX = (504 - 61 * 3 - 15 * 2) / 2;
    int distanceY = 270;
    int col = (m.x - distanceX) / (61 + 15);
    int row = (m.y - distanceY) / (68 + 15);
    if (row >= 0 && row < 3 && col >= 0 && col < 3)
    {
      Location->row = row;
      Location->col = col;
      return true;
    }
    printf("%d %d\n", col, row);
  }
  return false;
}

函数作用:通过鼠标的左键点击图片,并且记录鼠标点击位置

这里使用了结构体(int row int col 分别代表行和列), 通过指针传递,同时函数用的是bool类型,为真肯定句调用,为假就不调用。

1.先定义一个结构体。

2.用easxy库, 检查有无鼠标左键的消息。

3.鼠标点击的范围的设置(只能在游戏那个三维数组中才能够生效)。

4.这里也需要做一些计算,算出三维数组的位置,而结构体记录鼠标点击的位置。

游戏图片的删除,消掉与转移(重点)

void work(LO* Location)
{
  int index = map[Location->row][Location->col];
  int i = 0;
  //for (; i < 7 && cao[i]; i++); //如果第一个槽为0,结束, 如果第一个槽不为0, 就继续++,直到找到槽为0的时候,此时i的值结束。
  //if (i < 7)
  //{
  //  cao[i] = index;
  //
  //}
  for (int i = 0; i < 7; i++)
  {
    if (cao[i] == 0)
    {
      cao[i] = index;
      break;
    }
  }
  int cout = 0;
  for (int i = 0; i < 7; i++)
  {
    if (cao[i] == map[Location->row][Location->col])
    {
      cout++;
    }
  }
  if (cout == 3)
  {
    for (int i = 0; i < 7; i++)
    {
      if (cao[i] == map[Location->row][Location->col])
      {
        cao[i] = 0;
      }
    }
  }
  map[Location->row][Location->col] = 0;
}

1.这里用 int index 来接受 鼠标点击数组元素的大小(通过结构体记录鼠标点击的位置)

2.图片的转移, 图片转移到羊槽上去,就如果羊槽中的元素为0,

就让它 = index,让它从左到右,挨个打印照片, 具体操作这里写了2种方法,代码注释读的部分是方法二

3.图片的消除,在羊槽中3个一样的便会消除, 这里我用cout这个变量来记录的图片重复出现的次数, (用循环)如果羊槽中数组的值等于游戏三维数组的值,那么cout++。 (用循环)if cout == 3, 那么羊槽中 这个元素与三维数组元素相等的,cao[i] = 0;,消掉

4.图片的删除,就让鼠标点击的那个三维数组的值

游戏结束

bool gameover()

{

for (int i = 0; i < 3; i++)
{
  for (int j = 0; j < 3; j++)
    if (map[i][j] == 1)
    {
      return false;
    }
    else if (map[i][j] == 2)
    {
      return false;
    }
    else if (map[i][j] == 3)
    {
      return false;
    }
}
return true;

}

游戏结束,也是用bool 类型来判断,结束的话就返回 true

游戏结束的标志:,三维数组中的值 不等于1,不等于2,不等于3(都不等于的话,代表着,三维数组值都为0,没有了图片,都在羊槽中被消掉了)

主函数

int main()
{
  initgraph(504, 900);
  initmenu();
  initgame();
  LO Location;
  while (1)
  {   
    if (userClick(&Location))
    {
      work(&Location);
    }
    updategame();
    if (gameover())
    {
      setbkmode(TRANSPARENT);
      settextcolor(YELLOW);
      settextstyle(50, 0, "楷体");
      outtextxy(30, 300, "不愧是你!!");
      outtextxy(100, 400, "恭喜通关!!");
      outtextxy(200, 500, "你赢了!!");
      break;
    }
  }
  system("pause");
  return 0;
}

当然主函数中,调用游戏结束那部分,后面也用了easyx库的东西,打印字,以及字体的颜色,模式,大小。

注意:别忘了用initgraph()函数,创建一个窗口。

头文件和定义的变量,以及函数的声明

#include<stdio.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib, "winmm.lib")
#include<time.h>
#include<stdlib.h>
#include<conio.h>
IMAGE MENU1;
IMAGE MENU2[4];
IMAGE MENU3;
IMAGE BG;
IMAGE Role[3];
int map[3][3];
int cao[7];
void initmenu();
void initgame();
void initMap();
void updategame();
bool gameover();
typedef struct location
{
  int row;
  int col;
}LO;
bool userClick(LO* location);
void work(LO* Location);

这部分代码,很简单,有的就是一些固定的格式,就不在讲解了

源码和图片素材领取(百度网盘)

百度网盘图片素材和源码链接

提取码:1111

老铁们,这是压缩包,下载后,直接解压就行。

点个关注,点个赞。
你们的关注和点赞以及收藏真的对我很重要, 后续会与大家分享更多优质的博客


相关文章
|
定位技术 C语言 C++
C语言书写推箱子(坤坤版easyx库)
C语言书写推箱子(坤坤版easyx库)
|
C语言
C语言:二进制、八进制、十六进制整数的书写及输出
C语言:二进制、八进制、十六进制整数的书写及输出
|
定位技术 C语言 C++
C语言书写羊了个羊第一关(详解版)(一)
C语言书写羊了个羊第一关(详解版)
|
消息中间件 人工智能 算法
C语言程序书写规范
C语言程序书写规范 我做C语言底层开发,积累了一些代码书写的经验供大家参考: 1.C语言书写规范 1.1符号命名规则
|
2月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
238 15
|
8月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
369 23
|
7月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
177 1
一文彻底搞清楚C语言的函数
|
8月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
304 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
8月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
147 24
|
8月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
364 16