当前位置: 首页 > 编程笔记 >

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

孙琨
2023-03-14
本文向大家介绍C语言代码实现推箱子小游戏,包括了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++实现推箱子小游戏,包括了C++实现推箱子小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 游戏效果 简单易懂的推箱子闯关小游戏。 游戏代码 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍C++实现简单推箱子小游戏,包括了C++实现简单推箱子小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现简单推箱子的具体代码,供大家参考,具体内容如下 游戏演示 代码展示 更多有趣的经典小游戏实现专题,分享给大家: C++经典小游戏汇总 python经典小游戏汇总 python俄罗斯方块游戏集合 JavaScript经典游戏 玩不停 java经典小游戏汇总

  • 本文向大家介绍C语言代码实现扫雷小游戏,包括了C语言代码实现扫雷小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 主页面: 游戏页面: 虽然页面比较low,但我已经尽力了 具体代码实现: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍C语言代码实现三子棋游戏,包括了C语言代码实现三子棋游戏的使用技巧和注意事项,需要的朋友参考一下 三子棋小游戏,供大家参考,具体内容如下 一、基本框架 1、初始界面:这个界面是让用户选择玩或者不玩。 2、游戏界面:进入游戏之后,需要显示棋盘。 二、游戏的基本逻辑 首先,用户下一个X。然后判断,是用户赢了,还是电脑赢了,还是平局,还是继续下。然后,电脑下一个O。接着判断,判断形式和用户

  • 本文向大家介绍C语言代码实现2048游戏,包括了C语言代码实现2048游戏的使用技巧和注意事项,需要的朋友参考一下 我是大一新生,在寒假的实训课上老师让我们用c语言分组编程一个小游戏,我们组选的是“2048”。由于我们组上有一个大神,于是我们把大部分的工作交给了大神做,但是实训完成之后我感觉到碌碌无为,什么也没学到,自己对于c语言的理解也仅仅局限于书本之上,想到那些大神们已经基本可以自己编程一些小

  • 本文向大家介绍C语言实现五子棋小游戏,包括了C语言实现五子棋小游戏的使用技巧和注意事项,需要的朋友参考一下 首先我们先来看一个稍微简单些的实现方式: 演示截图 我们再来看一个更复杂些的

  • 本文向大家介绍C语言扫雷游戏的实现代码,包括了C语言扫雷游戏的实现代码的使用技巧和注意事项,需要的朋友参考一下 这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹、扫描炸弹、标记炸弹、百分百第一次不被炸死等功能。 编译器:vs2015 功能模块图 源代码 Tips:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次

  • 本文向大家介绍C语言实现三子棋小游戏详解,包括了C语言实现三子棋小游戏详解的使用技巧和注意事项,需要的朋友参考一下 在用C语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利。 以下为源代码: 1.首先打印出菜单。 2.创建一个二维数组board用来储存三子棋的元素,并对其进行初始化。 3.打印九宫格棋盘。 4.使用P