C语言代码实现推箱子小游戏

本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下

本次游戏是个推箱子第一关最简单的小游戏有详细注释,下面是做出来的游戏界面

游戏操作说明和功能说明:

1、按wasd控制小人的上下左右移动。2、按 r 重新开始游戏3、游戏开始有操作介绍4、游戏结束有胜利提示

游戏原理分析

1、游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。2、按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。3、wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。4、判断人物移动之前我们需要定位到人物的位置,这里我们用find()函数来定义。

首先从头文件开始介绍:

#include<stdio.h> #include<stdlib.h> //malloc()函数#include<string.h> //memcpy()函数#include<conio.h> //getch()函数

函数名称:malloc函数原型: void * malloc(unsigned size);函数功能: 分配size字节的存储区函数返回: 所分配的内存区地址,如果内存不够,返回0

函数函数:memcpy函数原型:void *memcpy(void *dest, const void *src, size_t n);函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中函数返回:函数返回指向dest的指针。

函数名称:getch函数原型: int getch(void);函数功能: 从控制台读取一个字符,但不显示在屏幕上函数返回: 读取的字符

上图是简单的8*8的图,我们定义一个二维数组来保存整张图,用0,1,2,3,4 来代表游戏界面中的每个符号。代码如下:

int map_1[8][8]={  {0,0,1,1,1,0,0,0},  {0,0,1,4,1,0,0,0},  {0,0,1,2,1,1,1,1},  {1,1,1,0,0,2,4,1},  {1,4,0,2,3,1,1,1},  {1,1,1,1,2,1,0,0},  {0,0,0,1,4,1,0,0},  {0,0,0,1,1,1,0,0} }; 

定义全局变量:

int x, y;int map[8][8] = {0};

声明函数原型:

int count1();  // 星星的个数int count2(); // 箱子到了星星的位置的个数int up();  int down();int left();int right();int shuchu();int find();   //找到自己int zhujiemian(); //输出主界面

接着我们来给每个数字赋值他们所代表的符号, 代码如下:

int shuchu() {  for(x=0; x<8; x++)  {   for(y=0; y<8; y++)   {    if(map[x][y] == 1)     printf("■"); //输出砖块的样子    if(map[x][y] == 3)     printf("⊙"); //输出自己的位置    if(map[x][y] == 2)     printf("□"); //输出箱子    if(map[x][y] == 4)     printf("☆"); //输出箱子要到的位置    if(map[x][y] == 0)     printf(" "); //输出空白    if(map[x][y] == 5)      printf("★"); //输出箱子到了该到的位置   }   printf("\n");  }  return 0; }

接着我们需要一个开始游戏之前的一个主界面来提示游戏玩法, 代码如下:

 //制作主界面int zhujiemian() {  printf("*************************\n"   "****请按任意键游戏开始~*****\n"   "****制作:菜学匠************\n"   "****请按wasd 控制上下左右****\n"   "****请按r重新开始游戏*******\n"   "*************************\n");   }

接着要想操作人物移动首先要找到界面中人物的位置:

 //找到自己的位置 int find() {  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 3)     return 0;   }   return 0; }

再来记录游戏开始之前星星的个数, 和箱子到了星星位置的个数:

//星星的个数 int count1() {  int n=0;  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 4)     n++;   } return n; } //箱子到了位置的个数 int count2() {  int m=0;  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 5)     m++;   }   return m; }

接着来给wasd 四个方向上的人物移动做判断, 确定人物的移动:

// 按w的时候的输出结果 int up() {  if(map[x][y] == 3) //找到自己的位置  {   if(map[x-1][y] == 0) //判断下一格子是不是空   {    map[x-1][y] = 3;    map[x][y] = 0;   }   if(map[x-1][y] == 2 && map[x-2][y] == 4) /*判断下一格子是不是箱子,下下个格子是不是箱子要到的地方*/   {    map[x][y] = 0;    map[x-1][y] = 3;    map[x-2][y] = 5;   }  }  return 0; } //按d的时候的输出结果 int down() {  if(map[x][y] == 3)    //找到自己  {   if(map[x+1][y] == 0)  //判断下个格子是否空格   {   map[x+1][y] = 3;   map[x][y] = 0;   }   if(map[x+1][y] == 2 && map[x+2][y] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/   {    map[x][y] = 0;    map[x+1][y] = 3;    map[x+2][y] = 5;   }  }  return 0; } //按a的时候的输出结果 int left() {  if(map[x][y] == 3)  {   if(map[x][y-1] == 0)  //判断下个格子是否空格   {    map[x][y-1] = 3;    map[x][y] = 0;   }  if(map[x][y-1] == 2 && map[x][y-2] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/    {   map[x][y] = 0;   map[x][y-1] = 3;   map[x][y-2] = 5;  }  if(map[x][y-2] == 0 && map[x][y-1] == 2) /*判断下个格子是不是箱子且箱子后面的格子是不是空格*/  {   map[x][y] = 0;   map[x][y-1] = 3;   map[x][y-2] = 2;  }  }  return 0; } //按d的时候的输出结果 int right() {  if(map[x][y] == 3)  {   if(map[x][y+1] == 0)  //判断下个格子是否空格   {    map[x][y+1] =3;    map[x][y] = 0;   }   if(map[x][y+1] == 2 && map[x][y+2] == 4)/*判断下个格子是不是箱子且箱子后面的是不是星星*/   {    map[x][y] = 0;    map[x][y+1] = 3;    map[x][y+2] = 5;   }  }  return 0; } 

最后就是最重要的主函数了:

int main() {  int n,m;  system("title 推箱子游戏~"); //给一个标题  memcpy(map, map_1, sizeof(map_1));   zhujiemian();  getch();  system("cls");    //清屏  n=count1();       while(1)  {   system("cls");   shuchu();   m= count2();   find();   switch(getch())   {    case 'w':up(); break;    case 's':down(); break;    case 'a':left(); break;    case 'd':right(); break;    case 'r':memcpy(map, map_1, sizeof(map_1)); break;   }   if(n==m)   {   system("cls");   printf("游戏胜利~\n");   getch();   return 0;   }  } }

接下来给出整个完整的程序,经过gcc 编译可以运行,代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h> int x=0,y=0; int map[8][8]={0}; // 定义的游戏界面模型 int map_1[8][8]={  {0,0,1,1,1,0,0,0},  {0,0,1,4,1,0,0,0},  {0,0,1,2,1,1,1,1},  {1,1,1,0,0,2,4,1},  {1,4,0,2,3,1,1,1},  {1,1,1,1,2,1,0,0},  {0,0,0,1,4,1,0,0},  {0,0,0,1,1,1,0,0} }; int count1(); int count2(); int (); up(); int down(); int left(); int right int shuchu(); int find(); int zhujiemian(); int main() {  int n,m;  system("title 推箱子游戏~");  memcpy(map, map_1, sizeof(map_1));  zhujiemian();  getch();  system("cls");  n=count1();  while(1)  {   system("cls");   shuchu();   m= count2();   find();   switch(getch())   {    case 'w':up(); break;    case 's':down(); break;    case 'a':left(); break;    case 'd':right(); break;    case 'r':memcpy(map, map_1, sizeof(map_1)); break;   }   if(n==m)   {   system("cls");   printf("游戏胜利~\n");   getch();   return 0;   }  } } // 按w的时候的输出结果 int up() {  if(map[x][y] == 3) //找到自己的位置  {   if(map[x-1][y] == 0) //判断下一格子是不是空   {    map[x-1][y] = 3;    map[x][y] = 0;   }   if(map[x-1][y] == 2 && map[x-2][y] == 4) //判断下一格子是不是箱子,下下个格子是不是箱子要到的地方   {    map[x][y] = 0;    map[x-1][y] = 3;    map[x-2][y] = 5;   }  }  return 0; } //按d的时候的输出结果 int down() {  if(map[x][y] == 3)  {   if(map[x+1][y] == 0)   {   map[x+1][y] = 3;   map[x][y] = 0;   }   if(map[x+1][y] == 2 && map[x+2][y] == 4)   {    map[x][y] = 0;    map[x+1][y] = 3;    map[x+2][y] = 5;   }  }  return 0; } //按a的时候的输出结果 int left() {  if(map[x][y] == 3)  {   if(map[x][y-1] == 0)   {    map[x][y-1] = 3;    map[x][y] = 0;   }  if(map[x][y-1] == 2 && map[x][y-2] == 4)  {   map[x][y] = 0;   map[x][y-1] = 3;   map[x][y-2] = 5;  }  if(map[x][y-2] == 0 && map[x][y-1] == 2)  {   map[x][y] = 0;   map[x][y-1] = 3;   map[x][y-2] = 2;  }  }  return 0; } //按d的时候的输出结果 int right() {  if(map[x][y] == 3)  {   if(map[x][y+1] == 0)   {    map[x][y+1] =3;    map[x][y] = 0;   }   if(map[x][y+1] == 2 && map[x][y+2] == 4)   {    map[x][y] = 0;    map[x][y+1] = 3;    map[x][y+2] = 5;   }  }  return 0; }  int shuchu() {  for(x=0; x<8; x++)  {   for(y=0; y<8; y++)   {    if(map[x][y] == 1)     printf("■"); //输出砖块的样子    if(map[x][y] == 3)     printf("⊙"); //输出自己的位置    if(map[x][y] == 2)     printf("□"); //输出箱子    if(map[x][y] == 4)     printf("☆"); //输出箱子要到的位置    if(map[x][y] == 0)     printf(" "); //输出空白    if(map[x][y] == 5)      printf("★"); //输出箱子到了该到的位置   }   printf("\n");  }  return 0; } //找到自己的位置 int find() {  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 3)     return 0;   }   return 0; } //箱子要到的位置的个数 int count1() {  int n=0;  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 4)     n++;   } return n; } //箱子到了位置的个数 int count2() {  int m=0;  for(x=0; x<8; x++)   for(y=0; y<8; y++)   {    if(map[x][y] == 5)     m++;   }   return m; } //制作主界面 int zhujiemian() {  printf("*************************\n"   "***请按任意键游戏开始~***\n"   "*********制作:小菜*******\n"   "**请按wasd 控制上下左右**\n"   "**请按r重新开始游戏******\n"   "*************************\n"); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

如若今生再相见,哪怕流离百世,迷途千年,也愿。

C语言代码实现推箱子小游戏

相关文章:

你感兴趣的文章:

标签云: