下面接着上一篇随笔《用C写一个简单的推箱子游戏(一)》来写

tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么写:

e)   tuidong()函数:判断移动人物的前方的情况

1)   第一部分:

 1 int count,caw=0;//行和列
2 int i,j,tui;
3 for(i=0;i<9;i++)
4 {
5 for (j=0;j<11;j++)
6 {
7 if(map[i][j]==2||map[i][j]==6)
8 {
9 count=i;
10 caw=j;
11 }
12 }
13 }
14 tui=getch();

说明:

①为了判断游戏人物位置,首先需要将人物位置记录下来,此处用count和caw变量记录初始位置;

②使用getch()函数而不用getchar()函数的原因是:getchar()函数输入一个字符后需要回车来进行下一个字符的输入,比较麻烦,而getch()函数则不需要回车就能连续输入多个字符。所以采用getch()函数对玩家键盘输入的内容进行记录,并将值赋给tui。

2)   第二部分

 1 switch(tui)
2 {
3 case 'w'://向上
4 if(map[count-1][caw]==0||map[count-1][caw]==4)
5 {
6 map[count][caw]-=2;
7 map[count-1][caw]+=2;
8 }
9 else if(map[count-1][caw]==3||map[count-1][caw]==7)
10 {
11 if(map[count-2][caw]==0||map[count-2][caw]==4)
12 {
13 map[count][caw]-=2;
14 map[count-1][caw]-=1;
15 map[count-2][caw]+=3;
16 }
17 }
18 break;
19 case 's'://向下
20 ……(同理)
21 case 'a'://向左
22 ……(同理)
23 case 'd'://向右
24 ……(同理)
25 default://错误输入
26 printf("你的输入有误,请输入方向键");
27 }

说明:

①这里只取向上的代码进行解释,其他方向原理同理;

②游戏人物前面的位置有以下几种情况:

1.人的前面是空地;

2.人的前面是终点位置;

3.人的前面是箱子

3.1.箱子的前面是空地;

3.2.箱子的前面是终点位置。

③第一个判断条件map[count-1][caw]==0||map[count-1][caw]==4就是判断前面第1和第2两种情况的。如果满足这两种情况,则执行map[count][caw]-=2和map[count-1][caw]+=2的操作,即:将人的位置变为空地并将前方一格变为人或者人在终点的标志。不满足则执行下一个判断。

④第二个判断条件map[count-1][caw]==3||map[count-1][caw]==7就是判断前面第3种情况。人的前面有箱子,这个箱子可以是在空地之上,也可以是在终点位置之上(这个是为了区分两种情况:一种是如果箱子在空地之上,那么人过后可以直接变为空地,但是另外一种情况就是,当箱子是在终点之上时,人通过终点后,仍然需要有终点标记)。而在人的前面有箱子(不管是箱子在空地之上还是在终点之上)这种情况下,因为箱子的前面情况不同,结果也会不同。比如说箱子前是墙壁或者是箱子,那么人是不能推动的,而如果前面是终点或者是空地则是可以推动的。因此,在判断完人前有箱子之后,还要进一步判断箱子前的情况,所以,就需要加上第二个判断条件(即前面3.1和3.2情况):当满足map[count-2][caw]==0||map[count-2][caw]==4情况时,进行如下操作:map[count][caw]-=2;map[count-1][caw]-=1;map[count-2][caw]+=3。

第一个是将人的位置变为空地,第二个是将箱子标志/箱子在终点标志变为人标志/人在终点的标志,第三个是将箱子前的空地/箱子前的终点位置变为箱子/箱子在终点的标志。

f)   winshu()函数:判断输赢的函数

1 int winshu()
2 {int k = 0;//初始化
3 int j,i;
4 for(i=0;i<9;i++)
5 {for (j=0;j<11;j++)
6 {if(map[i][j]==3)
7 k++;}}
8 if(k==0)
9 printf("恭喜你,你赢了!\n");}

这段函数是在每次移动指令输入后打印屏幕前进行判断的函数,所以它引用在drawmain()函数里面(见前面的d部分)。其判断依据很简单,我们把没有到达的箱子命名为空箱子,其判断依据就是当空箱子为零时,玩家就赢了。

将以上所有函数组合起来就可以完成这个简单的推箱子小游戏了,这个只是一关,如果想要增加关卡数,可以采用三维数组,新增的数组用来记录关卡数即可。

用C写推箱子游戏源码》已发布,密码请关注微信公众号“优秀物联人”后台回复“验证码”即可获得(密码不定时更换)。

用C写一个简单的推箱子游戏(二)的更多相关文章

  1. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

  2. three.js 制作一个三维的推箱子游戏

    今天郭先生发现大家更喜欢看我发的three.js小作品,今天我就发一个3d版本推箱子的游戏,其实webGL有很多框架,three.js并不合适做游戏引擎,但是可以尝试一些小游戏.在线案例请点击博客原文 ...

  3. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  4. 用while循环写一个简单的猜数字游戏

    import random #练习:模拟猜数字的游戏 """ 计算机出一个1~100之间的随机数由人来猜 计算机根据人猜的数字分别给出 大一点/小一点/猜中了 的提示 & ...

  5. JavaScript写一个小乌龟推箱子游戏

    推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...

  6. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  7. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  8. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

  9. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

随机推荐

  1. Java并发编程:volatile关键字解析【转载】

    介绍 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  2. 20190930-02 Redis持久化方式一:RDB及修改RDB的默认持久化策略 000 032

  3. fabric1.4 网络操作

    建立第一个网络 进入对应目录 $ cd fabric-samples/first-network 在first-network目录下有两个自动化脚本byfn.sh和eyfn.sh, 这两个脚本的启动顺 ...

  4. python基础 画图

    python 画图 matplotlib 库只保存图片,不显示图片? 在导入库时,添加如下代码 import matplotlib matplotlib.use('Agg')  各种 symbol ? ...

  5. odoo10同一模型的不同视图不同群组权限控制

    先描述下需求: 一个模型定义两个calendar视图,其中A视图G1群组可以CRUD操作,但是不显示特殊字段spec_field,对于B视图G1群组只能查看,G2群组只能修改其中的特殊字段spec_f ...

  6. [转载] 微软发布 SURFACE DUO ANDROID SDK 和模拟器

    模拟器截图 微软今天发布了双屏折叠设备 Surface Duo Android 开发工具(SDK 和模拟器),Windows 10X 开发工具和模拟器之后 2 月 11 日发布,并宣布了新的针对双屏体 ...

  7. jmeter中接口测试出现乱码或不识别中文解决办法

    在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...

  8. django之models报错

    django 执行python manage.py makemigrations报错:TypeError: __init__() missing 1 required positional argum ...

  9. 3.CDN加速简介

    什么是CDN CDN的全称是Content Delivery Network,即内容分发网络.CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问 ...

  10. [LeetCode]55. 跳跃游戏(贪心)

    题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: tr ...