c 语言推箱子vs,基于C语言实现推箱子游戏
本文实例为大家分享了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语言实现推箱子游戏相关推荐
- linux c语言 信号,linux下基于C语言的信号编程实例
搜索热词 本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include #include #include #include #include void si ...
- r语言 线性回归 相关系数_基于R语言的lmer混合线性回归模型
原文 基于R语言的lmer混合线性回归模型tecdat.cn 混合模型适合需求吗? 混合模型在很多方面与线性模型相似.它估计一个或多个解释变量对响应变量的影响.混合模型的输出将给出一个解释值列表,其 ...
- go语言打印日期_基于 Go 语言开发在线论坛(八):消息、视图及日期时间本地化...
我们接着上篇在线论坛的进度,由于之前所有页面和消息文本都是英文的,而我们开发的应用基本都是面向中文用户的,所以需要对项目进行本地化,今天正好借着这个入门项目给大家介绍下如何在 Go Web 应用中进行 ...
- c语言编程TLC2543AD采集,基于C语言的89C51与TLC2543AD转换器的驱动程序的设计 实训报告...
电子信息技术综合实训报告 竞赛题名称:基于C语言的89C51与TLC2543AD转换器的驱动程序的设计 队员名称: 评阅人签名:设计思路描述: 设计思路: 硬件部分基于80C51单片机和TLC2543 ...
- c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc
基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...
- c语言 字数统计 字符串,基于C语言的字数统计
摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词.数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的.这里提出了一种较好的字 ...
- c语言图书管理系统解析,基于C语言的图书管理系统的设计与实现解析.doc
毕业论文 题目:基于C语言的图书管理系统的设计与实现 英文题目:Design and Implementation of Books Management System Based on C Lang ...
- 基于c语言的物业管理系统设计,基于C#语言的小区物业管理系统的设计与实现
摘要: 随着人们生活水平和消费水平的不断提高,人们在追求物质生活的同时,更注重生活的质量,小区物业管理作为一种服务行业,与人们的生活息息相关,是人们生活质量的最基本需求.因此,小区物业管理系统的研究和 ...
- r语言pls分析_基于R语言的PLS算法的实现解读.pptx
基于R语言的PLS算法的实现及研究 目录 使用的开发工具 偏最小二乘的设计思想 基于R语言.MATLAB的偏最小二乘的实现 通径分析 测定系数 实验分析 使用的开发工具 R 语言(R是用于统计分析.绘 ...
最新文章
- 详解:Drools规则引擎探究
- 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )
- mysql 脏数据查询_MySQL数据库02
- 前端工具lighthouse
- 一个vue请求接口渲染页面的例子
- fcn+caffe+siftflow实验记录
- [Ext JS 4]性能优化
- C语言编写FFT程序
- tensorflow cnn文本分类
- 安信可nbiot模块_安信可wifi模块
- 测试电脑整机功耗软件,最真实的耗电!PConline权威整机功耗评测
- 有趣好玩的python编程网站
- 微信公众号怎么发送模板消息 微信公众平台模板消息免费发送的技巧
- gulp打包Replace Autoprefixer browsers option to Browserslist config. Use browserslis
- 如何解决 win10 2016Excel 显示界面全为英文的情况
- 新手如何快速入门IT行业?
- Nakagami分布
- 这样软件开发人才级别的划分你同意吗
- 软件上线后出现了BUG怎么办?新梦想IT
- Kyng Alisaunder