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");
 }

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

(0)

相关推荐

  • C语言实现推箱子游戏的地图编辑器

    推箱子地图编辑器,供大家参考,具体内容如下 由于我在写推箱子的时候苦于没有地图可以试验程序运行效果,而且去搜了好长时间都没有找到一个储存16*16地图版本的推箱子关卡数据信息的文件. 于是想到了写了一个地图编辑器用来自己设计地图的想法. 原本以为这个伟大的创意只有我才想的出来,结果搜索后才发现还有很多人有着与我相同的想法. 但,其他人写的编辑器大部分都不是C语言版本的,而这一个是C语言版本的. 另外说明一下,该编辑器的想法完全是我个人想法写出来的,不敢保证编辑习惯符合别人的习惯. 但本着,能够实

  • Linux下用C语言实现推箱子游戏

    前面有Linux的常用命令和vim文本编辑器还没有介绍,之后我会补上的. 今天来介绍如何用C语言写一个简单的小游戏,叫做"小老鼠推箱子".虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的.游戏代码不多,所以直接写在一个c文件中.本人小白,有不足之处还望指教 游戏介绍 下图是游戏开始界面,$是小老鼠,#是墙,O是终点,当小老鼠把所有箱子推进终点就代表游戏通过. 游戏思维 游戏地图用一个二维数组去存储.数组中不同的值代表不同的对象(老鼠.墙.

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

    今天我来分享一道对于初学C语言的同学非常有启发作用的编程例题,是用C语言实现单张地图推箱子的小游戏. 这个游戏是基于Linux环境下编程的,所用工具为ubuntu.和gcc编译器. 首先推箱子的地图,我们根据经典游戏推箱子中的其中一幅地图来自做,图片如下. 用图片形式实现这张图片对于初学编程的同学来说,难以实现,所以我们选择用字符代替的形式来实现这张地图. 我们采用2为数组的方式来存储这张地图,具体的数字与字符含义转换如下: 0 printf(" "); 路 2 printf(&quo

  • 基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可. 2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可. #include<stdio.h> #include<stdlib.h> #include<windows.h> #includ

  • C语言实现简单推箱子游戏

    使用C语言实现超简单的推箱子游戏,供大家参考,具体内容如下/p> 感谢您打开了这篇文章,下面我将讲述一下推箱子是如何实现的. 另外附赠适配该程序简单好用 专属推箱子地图编辑器 让您在16 * 16大地图的条件下也能轻松编辑地图. 链接:地图编辑器 本程序在没有检测到地图文件的情况下也能独自运行!代码中储存了推箱子游戏第一关的标准地图,让您在没有地图文件的情况下也能熟悉整个程序的流程! 当然,拥有地图文件会也会获得更好的游戏体验,请自行编辑. 废话不多说! 下面进入技术环节: C语言版 多功能推箱

  • 用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> //行和列 #define ROW 10 #define COL 11 /* run this program using the console pauser or add your own getch, system(&quo

  • C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码,供大家参考,具体内容如下 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图. 手动设置地图 用'0'表示空格,"1"表示墙,"2"表示箱子,"3"表示人,"4"表示终点 这样可以提高代码的移植性 如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了 int

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

    推箱子游戏的运行规则:在街道上上小人推动箱子移动,直到把箱子移动到目的地. 思路分析: 小人及箱子的移动就是小人或者箱子和路的交换: 1 定义二维字符数组,存储地图 2 显示地图,提示游戏玩法 3 记录小人及箱子位置,并定义字符变量接收用户输入方向 4 循环判断语句 1).小人的下一步是否为路,如果为路,则移动并记录小人新位置信息 2).小人的下一步如果不是路,在判断是否为箱子,如果是箱子,在判断箱子的下一个位置是否是路,如果是路,则移动箱子和小人 3). 刷新地图 4) .判断箱子的位置,如果

  • C语言实现推箱子项目

    本文实例为大家分享了C语言实现推箱子的具体代码,供大家参考,具体内容如下 项目展示 首先介绍结构板,结构版是图形版的逻辑基础: 结构版效果图: 地图: 二维数组储存地图,0代表空地,1代表墙,4代表箱子,3代表终点 地图数组: int map[13][14]={ {0,0,0,0,1,1,1,1,1,1,0,0,0,0}, {0,0,0,0,1,0,0,0,0,1,0,0,0,0}, {0,1,1,1,1,0,0,4,4,1,1,1,1,1}, {0,1,0,0,0,1,0,0,0,1,0,0,

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

    本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下 本次游戏是个推箱子第一关最简单的小游戏 有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 1.按wasd控制小人的上下左右移动. 2.按 r 重新开始游戏 3.游戏开始有操作介绍 4.游戏结束有胜利提示 游戏原理分析 1.游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利. 2.按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给

  • C语言实现简单的推箱子小游戏

    本文实例为大家分享了C语言实现简单推箱子小游戏的具体代码,供大家参考,具体内容如下 此推箱子游戏可以实现人物移动,箱子移动,人物不出框,自义定文件关卡,重新开始以及回退复位等功能的实现,由于系统或版本问题,关卡和人物及物体未做美化处理,希望美化的可自行美化. 1.所用到的宏 #include <stdio.h> #include <stdlib.h> #include <getopt.h> #define MAX_ROWS 16 #define MAX_CLOS 16

  • js推箱子小游戏步骤代码解析

    推箱子小游戏大家肯定都玩过,之所以写这篇文章,是觉得这个小游戏足够简单好理解 demo: 步骤解析: 本文代码已经放在了github上面了,里面也进行了很详细的代码注释,可以copy下来,在本地运行一下看看. 1. 渲染地图 html结构: html结构十分简单,只要弄一堆div,来放置地图的class就可以了,我这里初始化了12*9个div,地图里最多九行高度. 这些div都是同样大小,地图渲染出来区别的只是颜色的不同. 地图函数: var box=$('.box div'); //地图使用的

  • 用C++实现推箱子小游戏

    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器. 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其实用全局变量声明会简洁很多. 头文件和main函数分享在最下面了. 提示:以下是本篇文章正文内容,下面案例可供参考 一.初始化游戏数据 void GameInit(int(*&pMap)[10][10], int index)//两张地图数据 { // static:返回静态全局区变量 static int loca

  • C++实现推箱子小游戏源码

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 功能尚为完善. // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<windows.h> #define KEY_DOWN(vk_code) GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0 using

  • java二维数组实现推箱子小游戏

    本文实例为大家分享了java实现推箱子小游戏的具体代码,供大家参考,具体内容如下 二维数组 二维数组:类似于二维表格(有很多层,每一层有多个房间的楼房) 数组声明: 数据类型[][]数据名 = new 数据类型[行数][列数]; 获取二维数组的长度:数组名.lengt 得到的是行数 数组名[行下标].length 得到的是列数 推箱子小游戏 import java.util.Random; import java.util.Scanner; /* * 推箱子的小游戏 */ public clas

  • C++实现推箱子小游戏

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 游戏效果 简单易懂的推箱子闯关小游戏. 游戏代码 #include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; #define VERSION "2.2" #define M 55 int n, m, wall[M][M], hole[M][M], box[M][

  • C/C++编写推箱子小游戏

    本文实例为大家分享了C/C++编写推箱子小游戏的具体代码,供大家参考,具体内容如下 我们用' #'来代表墙,'O'来代表箱子,' * '代表终点,'@'代表箱子已经到达终点,'S来表示人'. 注意:W,A,S,D为方向键,而且要在英文格式下 运行示例: 以下为完整代码: /* 推箱子(示例二) */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <conio.h> i

  • C/C++实现推箱子小游戏

    本文实例为大家分享了C/C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 效果演示 实现功能 如上图所示.按键控制小猪的运动,推箱子到达目的地. 如何实现 1.首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组. 2.定义小猪,箱子,墙,空地等信息在三维数组里的数值. 空地             0       墙               1  目的地           2     箱子             3  猪               4  2+4=6

  • DEVC++实现推箱子小游戏

    推箱子小游戏(基于DEVC++),供大家参考,具体内容如下 #include<iostream> #include<stdio.h> #include<conio.h> #include <windows.h> using namespace std; void Game_Menu(HANDLE hout); void Game_description(HANDLE hout); void gotoxy(HANDLE hout, int x, int y);

随机推荐