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

代码在vs2013上测试运行。

思想:

1):地图用二维数组实现,箱子、墙壁、人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可。

2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可。

#include

#include

#include

#include

//二维数组:0表示地图上的空地,1代表墙壁,3代表箱子的目的地,4代表箱子,6代表人,7代表箱子与目的地重合;9代表人在箱子的目的地

int g_map[10][12] =

{

{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },

{ 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0 },

{ 1, 0, 4, 0, 1, 0, 1, 1, 1, 1, 1, 1 },

{ 1, 0, 4, 6, 1, 0, 1, 0, 0, 0, 3, 1 },

{ 1, 1, 1, 4, 1, 1, 1, 0, 0, 0, 3, 1 },

{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 1 },

{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },

{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },

{ 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },

{ 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }

}; //g_开头代表全局变量 m_代表成员变量 n:整形

void drawMap(); //画地图

void up(); //上移

void down(); //下移

void left(); //左移

void right(); //右移

void gameOver(); //结束游戏

POINT GetGamerPostion();//获取玩家坐标

int main()

{

//设置窗口标题

SetConsoleTitleA("推箱子");

//修改窗口大小

system("mode con cols=30 lines=12");

while (1)

{

//清屏

system("cls");

//打印地图

drawMap();

gameOver();

char ch = _getch(); //从控制台获取输入 getchar()函数获取按键后要按enter确认,并且输入的字符要在控制台上显示

switch (ch)

{

case 'w':case 72://上

up();

break;

case 's':case 80://下

down();

break;

case 'a':case 75://左

left();

break;

case 'd':case 77://右

right();

break;

}

}

//system("pause");

return 0;

}

void drawMap()

{

for (int i = 0; i < 10; i++)

{

for (int j = 0; j < 12; j++)

{

switch (g_map[i][j])

{

case 0://空地

printf(" ");

break;

case 1://墙壁

printf("■");

break;

case 3://箱子的目的地

printf("☆");

break;

case 4://箱子

printf("□");

break;

case 6://人

printf("♀");

break;

case 7://箱子与目的地重合

printf("★");

break;

case 9://人站在目的地

printf("♀");

break;

}

}

printf("\n");

}

}

void up()

{

//获取玩家坐标

POINT pos = GetGamerPostion();

//1.人的前面是空地

if (g_map[pos.x - 1][pos.y] == 0)

{

g_map[pos.x - 1][pos.y] = 6; //空地变为人

if (g_map[pos.x][pos.y] == 9) //还原原来人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//2.人的前面是目的地

if (g_map[pos.x - 1][pos.y] == 3)

{

g_map[pos.x - 1][pos.y] = 9; //原来目的地的位置变为人站在目的地

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//3.人的前面是箱子,

if (g_map[pos.x - 1][pos.y] == 4)

{

//a.箱子前面是空地

if (g_map[pos.x - 2][pos.y] == 0)

{

g_map[pos.x - 2][pos.y] = 4; //空地变为箱子

g_map[pos.x - 1][pos.y] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子前面目的地

if (g_map[pos.x - 2][pos.y] == 3)

{

g_map[pos.x - 2][pos.y] = 7; //目的地变为箱子和目的地重合

g_map[pos.x - 1][pos.y] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

//4.人的前面是箱子和目的地的重合

if (g_map[pos.x - 1][pos.y] == 7)

{

//a.箱子和目的地的重合前面是空地

if (g_map[pos.x - 2][pos.y] == 0)

{

g_map[pos.x - 2][pos.y] = 4; //空地变为箱子

g_map[pos.x - 1][pos.y] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子和目的地的重合前面是另一个目的地

if (g_map[pos.x - 2][pos.y] == 3)

{

g_map[pos.x - 2][pos.y] = 7; //目的地变为箱子和目的地重合

g_map[pos.x - 1][pos.y] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

}

//下移

void down()

{

//获取玩家坐标

POINT pos = GetGamerPostion();

//1.人的前面是空地

if (g_map[pos.x + 1][pos.y] == 0)

{

g_map[pos.x + 1][pos.y] = 6; //空地变为人

if (g_map[pos.x][pos.y] == 9) //还原原来人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//2.人的前面是目的地

if (g_map[pos.x + 1][pos.y] == 3)

{

g_map[pos.x + 1][pos.y] = 9; //原来目的地的位置变为人站在目的地

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//3.人的前面是箱子,

if (g_map[pos.x + 1][pos.y] == 4)

{

//a.箱子前面是空地

if (g_map[pos.x + 2][pos.y] == 0)

{

g_map[pos.x + 2][pos.y] = 4; //空地变为箱子

g_map[pos.x + 1][pos.y] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子前面目的地

if (g_map[pos.x + 2][pos.y] == 3)

{

g_map[pos.x + 2][pos.y] = 7; //目的地变为箱子和目的地重合

g_map[pos.x + 1][pos.y] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

//4.人的前面是箱子和目的地的重合

if (g_map[pos.x + 1][pos.y] == 7)

{

//a.箱子和目的地的重合前面是空地

if (g_map[pos.x + 2][pos.y] == 0)

{

g_map[pos.x + 2][pos.y] = 4; //空地变为箱子

g_map[pos.x + 1][pos.y] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子和目的地的重合前面是另一个目的地

if (g_map[pos.x + 2][pos.y] == 3)

{

g_map[pos.x + 2][pos.y] = 7; //目的地变为箱子和目的地重合

g_map[pos.x + 1][pos.y] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

}

//右移

void right()

{

//获取玩家坐标

POINT pos = GetGamerPostion();

//1.人的前面是空地

if (g_map[pos.x][pos.y + 1] == 0)

{

g_map[pos.x ][pos.y + 1] = 6; //空地变为人

if (g_map[pos.x][pos.y] == 9) //还原原来人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//2.人的前面是目的地

if (g_map[pos.x][pos.y + 1] == 3)

{

g_map[pos.x][pos.y + 1] = 9; //原来目的地的位置变为人站在目的地

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//3.人的前面是箱子,

if (g_map[pos.x][pos.y + 1] == 4)

{

//a.箱子前面是空地

if (g_map[pos.x][pos.y + 2] == 0)

{

g_map[pos.x][pos.y + 2] = 4; //空地变为箱子

g_map[pos.x][pos.y + 1] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子前面目的地

if (g_map[pos.x][pos.y + 2] == 3)

{

g_map[pos.x][pos.y + 2] = 7; //目的地变为箱子和目的地重合

g_map[pos.x][pos.y + 1] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

//4.人的前面是箱子和目的地的重合

if (g_map[pos.x][pos.y + 1] == 7)

{

//a.箱子和目的地的重合前面是空地

if (g_map[pos.x][pos.y + 2] == 0)

{

g_map[pos.x][pos.y + 2] = 4; //空地变为箱子

g_map[pos.x][pos.y + 1] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子和目的地的重合前面是另一个目的地

if (g_map[pos.x][pos.y + 2] == 3)

{

g_map[pos.x][pos.y + 2] = 7; //目的地变为箱子和目的地重合

g_map[pos.x][pos.y + 1] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

}

//左移

void left()

{

//获取玩家坐标

POINT pos = GetGamerPostion();

//1.人的前面是空地

if (g_map[pos.x][pos.y - 1] == 0)

{

g_map[pos.x][pos.y - 1] = 6; //空地变为人

if (g_map[pos.x][pos.y] == 9) //还原原来人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//2.人的前面是目的地

if (g_map[pos.x][pos.y - 1] == 3)

{

g_map[pos.x][pos.y - 1] = 9; //原来目的地的位置变为人站在目的地

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//3.人的前面是箱子,

if (g_map[pos.x][pos.y - 1] == 4)

{

//a.箱子前面是空地

if (g_map[pos.x][pos.y - 2] == 0)

{

g_map[pos.x][pos.y - 2] = 4; //空地变为箱子

g_map[pos.x][pos.y - 1] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子前面目的地

if (g_map[pos.x][pos.y - 2] == 3)

{

g_map[pos.x][pos.y - 2] = 7; //目的地变为箱子和目的地重合

g_map[pos.x][pos.y - 1] = 6; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

//4.人的前面是箱子和目的地的重合

if (g_map[pos.x][pos.y - 1] == 7)

{

//a.箱子和目的地的重合前面是空地

if (g_map[pos.x][pos.y - 2] == 0)

{

g_map[pos.x][pos.y - 2] = 4; //空地变为箱子

g_map[pos.x][pos.y - 1] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

//b.箱子和目的地的重合前面是另一个目的地

if (g_map[pos.x][pos.y - 2] == 3)

{

g_map[pos.x][pos.y - 2] = 7; //目的地变为箱子和目的地重合

g_map[pos.x][pos.y - 1] = 9; //原来箱子位置变为人

if (g_map[pos.x][pos.y] == 9) //还原人的位置

{

g_map[pos.x][pos.y] = 3;

}

else

g_map[pos.x][pos.y] = 0;

}

}

}

//结束游戏

void gameOver()

{

if (g_map[3][10] == 7 && g_map[4][10]==7 && g_map[5][10]==7)

{

MessageBox(NULL, L"获得胜利", L"提示",0);

}

}

//寻找玩家位置

POINT GetGamerPostion()

{

POINT pos = { -1, -1 }; //表示没有找到玩家

for (int i = 0; i < 10; i++)

{

for (int j = 0; j < 12; j++)

{

if (g_map[i][j] == 6 || g_map[i][j] == 9)

{

pos.x = i;

pos.y = j;

return pos;

}

}

}

return pos;

}

是不是觉得一点都不美观?和正常的推箱子游戏差太多了?其实很简单,只需要把箱子那些图片准备好,用贴图技术贴在这个框架里就OK啦!

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

c 语言推箱子vs,基于C语言实现推箱子游戏相关推荐

  1. linux c语言 信号,linux下基于C语言的信号编程实例

    搜索热词 本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include #include #include #include #include void si ...

  2. r语言 线性回归 相关系数_基于R语言的lmer混合线性回归模型

    原文 基于R语言的lmer混合线性回归模型​tecdat.cn 混合模型适合需求吗? 混合模型在很多方面与线性模型相似.它估计一个或多个解释变量对响应变量的影响.混合模型的输出将给出一个解释值列表,其 ...

  3. go语言打印日期_基于 Go 语言开发在线论坛(八):消息、视图及日期时间本地化...

    我们接着上篇在线论坛的进度,由于之前所有页面和消息文本都是英文的,而我们开发的应用基本都是面向中文用户的,所以需要对项目进行本地化,今天正好借着这个入门项目给大家介绍下如何在 Go Web 应用中进行 ...

  4. c语言编程TLC2543AD采集,基于C语言的89C51与TLC2543AD转换器的驱动程序的设计 实训报告...

    电子信息技术综合实训报告 竞赛题名称:基于C语言的89C51与TLC2543AD转换器的驱动程序的设计 队员名称: 评阅人签名:设计思路描述: 设计思路: 硬件部分基于80C51单片机和TLC2543 ...

  5. c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc

    基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...

  6. c语言 字数统计 字符串,基于C语言的字数统计

    摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词.数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的.这里提出了一种较好的字 ...

  7. c语言图书管理系统解析,基于C语言的图书管理系统的设计与实现解析.doc

    毕业论文 题目:基于C语言的图书管理系统的设计与实现 英文题目:Design and Implementation of Books Management System Based on C Lang ...

  8. 基于c语言的物业管理系统设计,基于C#语言的小区物业管理系统的设计与实现

    摘要: 随着人们生活水平和消费水平的不断提高,人们在追求物质生活的同时,更注重生活的质量,小区物业管理作为一种服务行业,与人们的生活息息相关,是人们生活质量的最基本需求.因此,小区物业管理系统的研究和 ...

  9. r语言pls分析_基于R语言的PLS算法的实现解读.pptx

    基于R语言的PLS算法的实现及研究 目录 使用的开发工具 偏最小二乘的设计思想 基于R语言.MATLAB的偏最小二乘的实现 通径分析 测定系数 实验分析 使用的开发工具 R 语言(R是用于统计分析.绘 ...

最新文章

  1. 详解:Drools规则引擎探究
  2. 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )
  3. mysql 脏数据查询_MySQL数据库02
  4. 前端工具lighthouse
  5. 一个vue请求接口渲染页面的例子
  6. fcn+caffe+siftflow实验记录
  7. [Ext JS 4]性能优化
  8. C语言编写FFT程序
  9. tensorflow cnn文本分类
  10. 安信可nbiot模块_安信可wifi模块
  11. 测试电脑整机功耗软件,最真实的耗电!PConline权威整机功耗评测
  12. 有趣好玩的python编程网站
  13. 微信公众号怎么发送模板消息 微信公众平台模板消息免费发送的技巧
  14. gulp打包Replace Autoprefixer browsers option to Browserslist config. Use browserslis
  15. 如何解决 win10 2016Excel 显示界面全为英文的情况
  16. 新手如何快速入门IT行业?
  17. Nakagami分布
  18. 这样软件开发人才级别的划分你同意吗
  19. 软件上线后出现了BUG怎么办?新梦想IT
  20. Kyng Alisaunder

热门文章

  1. csu1335 高桥与低桥
  2. 春招:我居然三天就拿到了offer?
  3. 有钱就放余额宝的人,这个习惯恐怕要改一改!
  4. c语言反三角函数值域,反三角函数的定义域和值域
  5. 关于LINUX系统netterm终端登陆乱码问题。
  6. 知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)
  7. JavaScript代码到底是怎么执行的?
  8. golang fmt包中的占位符
  9. TypeScript 基础数据类型与接口
  10. EBS杂项出库事务处理