android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...

很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后,

23831964d0bb72827d9a0a9cee26fb0e.png

问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。

616032820bca35085899eb0588c697b9.png

通过w,s,a,d实现上下左右的移动

声明画图函数

然后分别对移动位置进行情况判断:

1.如果人前面是空地。

2.如果人前面是目的地。

3.如果人前面是箱子。有以下两种情况:

如果人前面是箱子,而箱子前面是空地。

如果人的前面是箱子,而箱子前面是目的地。

4.如果人前面是已经进入某目的地的箱子。有以下两种情况:

如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

5.对箱子原先位置的判断。

6.对人原先位置进行判断。

【从百科上参考查阅下载的代码,并加以整理】

[cpp] view plain copy

//此小游戏使用C语言编写,编译环境VS2008

#include

#include

#include

int i,j;

void draw_map(int map[10][12]); //声明画图函数

int main()

{

char input;

int count=0; //定义记分变量

/*下面定义一个二维数组,其中的元素是不同图像的ID号,在后面的函数中将讲解不同数字分别代表的图像元素*/

int map[10][12] = {

while (1) //死循环,等待用户命令

{

system("CLS");

for (i=0;i

{

printf("%d",i);

}

printf(" ");

/*for (i=1;i

{

printf("%d ",i);

}*/

printf(" ");

draw_map(map);

printf("当前得分:%d ",count);

//找初始位置

for (i=0;i

{

for (j=0;j

{

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

break;

}

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

break;

}

printf("您的当前坐标(%d,%d)",i,j);

input = getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。

switch (input)

{

case'w':

//如果人前面是空地。 //0代表空地 6代表人 //3代表目的地

if(map[i-1][j]==0)

{

map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

else

map[i][j]=0; //否则原地ID修改为空地ID 。

}

//如果人前面是目的地。

elseif((map[i-1][j]==3)||(map[i-1][j]==9))

{

map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

if(map[i][j]==9) //如果原地也是目的地(ID为)。

map[i][j]=3; //人走后把原地ID修改回目的地ID。

else

map[i][j]=0; //否则原地ID修改为为空地ID

}

//如果人前面是箱子。//4代表箱子 //7箱子进入目的地

elseif(map[i-1][j]==4)

{

//如果人前面是箱子,而箱子前面是空地。

if (map[i-2][j]==0)

{

map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

//下面是对箱子原地进行判断

if(map[i-1][j]==7) //如果箱子原地为目的地。

map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

else

map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

//下面是对人原地进行判断

if(map[i][j]==9) //如果之前是目的地。

map[i][j]=3; //人走了之后修改回目的地ID。

else

map[i][j]=0; //否则就是空地。

}

//如果人的前面是箱子,而箱子前面是目的地。

elseif (map[i-2][j]==3)

{

map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

count++;

//下面是对箱子原先位置的判断,同上。

if(map[i-1][j]==7)

map[i-1][j]=9;

else

map[i-1][j]=6;

//下面是对人原先位置进行判断,同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

//如果人前面是已经进入某目的地的箱子(ID=7)。

elseif(map[i-1][j]==7)

{

//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

if(map[i-2][j]==0)

{

count--;

map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。

//下面是对人原先地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

if(map[i-2][j]==3)

{

map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。

map[i-1][j]=9; //人站在了目的地上。

//下面是对人原先站立地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

break;

case's':

//如果人前面是空地。

if(map[i+1][j]==0)

{

map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

else

map[i][j]=0; //否则原地ID修改为空地ID 。

}

//如果人前面是目的地。

elseif(map[i+1][j]==3)

{

map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

if(map[i][j]==9) //如果原地也是目的地(ID为)。

map[i][j]=3; //人走后把原地ID修改回目的地ID。

else

map[i][j]=0; //否则原地ID修改为为空地ID

}

//如果人前面是箱子。

elseif(map[i+1][j]==4)

{

//如果人前面是箱子,而箱子前面是空地。

if (map[i+2][j]==0)

{

map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

//下面是对箱子原地进行判断

if(map[i+1][j]==7) //如果箱子原地为目的地。

map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

else

map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

//下面是对人原地进行判断

if(map[i][j]==9) //如果之前是目的地。

map[i][j]=3; //人走了之后修改回目的地ID。

else

map[i][j]=0; //否则就是空地。 (加群: 571545210 学习编程,在群里获得更多的学习资料)

}

//如果人的前面是箱子,而箱子前面是目的地。

elseif (map[i+2][j]==3)

{

map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

count++;

//下面是对箱子原先位置的判断,同上。

if(map[i+1][j]==7)

map[i+1][j]=9;

else

map[i+1][j]=6;

//下面是对人原先位置进行判断,同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

//如果人前面是已经进入某目的地的箱子(ID=7)。

elseif(map[i+1][j]==7)

{

//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

if(map[i+2][j]==0)

{

count--;

map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。

//下面是对人原先地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

if(map[i+2][j]==3)

{

map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。

map[i+1][j]=9; //人站在了目的地上。

//下面是对人原先站立地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

break;

case'a':

//如果人前面是空地。

if(map[i][j-1]==0)

{

map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

else

map[i][j]=0; //否则原地ID修改为空地ID 。

}

//如果人前面是目的地。

elseif(map[i][j-1]==3)

{

map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

if(map[i][j]==9) //如果原地也是目的地(ID为)。

map[i][j]=3; //人走后把原地ID修改回目的地ID。

else

map[i][j]=0; //否则原地ID修改为为空地ID

}

//如果人前面是箱子。

elseif(map[i][j-1]==4)

{

//如果人前面是箱子,而箱子前面是空地。

if (map[i][j-2]==0)

{

map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

//下面是对箱子原地进行判断

if(map[i][j-1]==7) //如果箱子原地为目的地。

map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

else

map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

//下面是对人原地进行判断

if(map[i][j]==9) //如果之前是目的地。

map[i][j]=3; //人走了之后修改回目的地ID。

else

map[i][j]=0; //否则就是空地。

}

//如果人的前面是箱子,而箱子前面是目的地。

elseif (map[i][j-2]==3)

{

count++;

map[i][j-2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

//下面是对箱子原先位置的判断,同上。

if(map[i][j-1]==7)

map[i][j-1]=9;

else

map[i][j-1]=6;

//下面是对人原先位置进行判断,同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

//如果人前面是已经进入某目的地的箱子(ID=7)。

elseif(map[i][j-1]==7)

{

//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

if(map[i][j-2]==0)

{

count--;

map[i][j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

map[i][j-1]=9; //人自然而然的就站在了原先的目的地上了。

//下面是对人原先地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

if(map[i][j-2]==3)

{

map[i][j-2]=7; //把箱子推入了另一目的地,自然,ID也应是。

map[i][j-1]=9; //人站在了目的地上。

//下面是对人原先站立地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

break;

case'd':

//如果人前面是空地。

if(map[i][j+1]==0)

{

map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

else

map[i][j]=0; //否则原地ID修改为空地ID 。

}

//如果人前面是目的地。

elseif(map[i][j+1]==3)

{

map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

if(map[i][j]==9) //如果原地也是目的地(ID为)。

map[i][j]=3; //人走后把原地ID修改回目的地ID。

else

map[i][j]=0; //否则原地ID修改为为空地ID

}

//如果人前面是箱子。

elseif(map[i][j+1]==4)

{

//如果人前面是箱子,而箱子前面是空地。

if (map[i][j+2]==0)

{

map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

//下面是对箱子原地进行判断

if(map[i][j+1]==7) //如果箱子原地为目的地。

map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

else

map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

//下面是对人原地进行判断

if(map[i][j]==9) //如果之前是目的地。

map[i][j]=3; //人走了之后修改回目的地ID。

else

map[i][j]=0; //否则就是空地。

}

//如果人的前面是箱子,而箱子前面是目的地。

elseif (map[i][j+2]==3)

{

count++;

map[i][j+2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

//下面是对箱子原先位置的判断,同上。

if(map[i][j+1]==7)

map[i][j+1]=9;

else

map[i][j+1]=6;

//下面是对人原先位置进行判断,同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

//如果人前面是已经进入某目的地的箱子(ID=7)。

elseif(map[i][j+1]==7)

{

//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

if(map[i][j+2]==0)

{

count--;

map[i][j+2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

map[i][j+1]=9; //人自然而然的就站在了原先的目的地上了。

//下面是对人原先地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

if(map[i][j+2]==3)

{

map[i][j+2]=7; //把箱子推入了另一目的地,自然,ID也应是。

map[i][j+1]=9; //人站在了目的地上。

//下面是对人原先站立地进行判断,方法同上。

if(map[i][j]==9)

map[i][j]=3;

else

map[i][j]=0;

}

}

break;

}

if(count==8) //如果分数达到分

{

system("CLS"); //清屏

draw_map(map);

break; //退出死循环

}

}

printf(" 恭喜你,过关了!! "); //过关提示

return 0;

}

void draw_map(int map[10][12])

{

for(i=0;i

{

for(j=0;j

{

switch(map[i][j])

{

case 0:

printf(" "); //数字代表道路

break;

case 1:

printf("#"); //数字代表墙壁

break;

case 2:

printf(" "); //数字是游戏边框的空白部分

break;

case 3:

printf("!"); //数字代表目的地

break;

case 4:

printf("*"); //数字代表箱子

break;

case 7:

printf("$"); //数字代表箱子进入目的地

break;

case 6:

printf("@"); //数字代表人

break;

case 9:

printf("@"); //数字代表人进入目的地

break;

}

}

printf(" "); //分行输出

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库新增幂等操作_使用数据库唯一键实现事务幂等性

幂等性概念在分布式系统中,幂等性是一致性方面的一个重要概念。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。所谓“影响相同”&#xff…

python re模块compile_Python re模块的match方法

pattern re.compile("\d") 将正则表达式编译成一个Pattern规则对象 pattern.match() 从开始位置开始往后查找,返回第一个符合规则的对象 pattern.search() 从任何位置开始往后查找,返回第一个符合规则的对象 pattern.findall() 所有的全部匹配…

考研数学(180°为什么等于π)

之所以要定义弧度制,是因为它的单位相比角度制有很大的优越性. 弧度的大小是两个长度之比,长度的单位是统一的,所以相比以后,可以认为弧度的单位为1,即以实数单位为单位. 弧度可以看做导出单位. 而角度制则不然,角度制单位是1/360周角,然而,1/360是怎么来的?为什么是周角除360…

c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件

SF.5: A .cpp file must include the .h file(s) that defines its interfaceSF.5: .cpp文件必须包含定义它接口的.h文件Reason(原因)This enables the compiler to do an early consistency check.这样可以让编译器尽早进行一致性检查。Example, bad(反面示例)// foo.h:void f…

常用的python脚本_五个python常用运维脚本面试题实例

一、用Python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径 #!/usr/bin/env python import os for root,dirs,files in os.walk(/tmp): for name in files: print (os.path.join(root,name)) os.walk() 原型为:os.walk(top, topdownTrue, …

JAVA进阶教学之(IO流)

目录 1、什么是IO流 2、流的分类 3、流的四大家族首领 4、java.io.*包下需要掌握的16个流 5、FileInputStream的实用方法 6、FileOutputStream的方法 7、文件复制/拷贝 8、FileReader的使用 9、FileWriter的使用 10、复制普通文本文件 11、BufferedReader带有缓冲区…

sonar 代理_Sonar

关于Sonar费用:免费;更新频率:持续更新;搜索来源:亚马逊;关键词总数:美国站约1亿,全球约1.8亿;关键词反查:支持;PPC关键词查询:支持;其他功能:关键词翻译。功能1、亚马逊PPC管理&…

devtools安装_R语言如何批量安装软件包

1. 为什么要批量安装R语言包当你在新的环境下, 安装R语言时,你需要安装很多包,比如tidyverse,比如data.table,这里你可以写一个函数,将所有需要的包写进去,然后进行批量安装2. 程序如下&#xf…

JAVA进阶教学之(序列化和反序列化)

目录 1、序列化Serialize和反序列化的概念 2、序列化和反序列化的代码演示: 3、序列化多个对象(序列化集合) 4、transient关键字将部分属性不参与序列化 1、序列化Serialize和反序列化的概念 在内存和硬盘的数据交互过程中,将…

java如何实现e的次方_Java开发如何更改MySQL数据库datadir目录之MySQL数据库索引实现...

引言MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System&#xff0c…

pythonjieba分词_$好玩的分词——python jieba分词模块的基本用法

jieba(结巴)是一个强大的分词库,完美支持中文分词,本文对其基本用法做一个简要总结。 安装jieba pip install jieba 简单用法 结巴分词分为三种模式:精确模式(默认)、全模式和搜索引擎模式&…

局部变量和成员变量的区别

1.定义的位置不一样【重点】 局部变量:在方法的内部成员变量:在方法的外部,直接写在类当中 2.作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用了成员变量:整个类都可以通用 …

pytorch 训练过程acc_Pytorch之Softmax多分类任务

在上一篇文章中,笔者介绍了什么是Softmax回归及其原理。因此在接下来的这篇文章中,我们就来开始动手实现一下Softmax回归,并且最后要完成利用Softmax模型对Fashion MINIST进行分类的任务。在开始实现Softmax之前,我们先来了解一下…

进程调度实验_Linux应用编程之进程的PID与PPID

关注、星标公众号,直达精彩内容ID:嵌入式情报局作者:情报小哥1进程PID首先介绍PID的相关知识,为后面介绍fork函数进行铺垫。01PID与PPID PID不是控制理论的PID算法,而是Prcess ID的简写。进程PID是当操作系统运行进程时…

操作Windows文件夹时,弹出文件夹正在使用,操作无法完成【解决】

在windows系统上,有时候在删除系统文件或文件夹时出现弹框,提示操作无法完成。这种情况的出现是因为你要删除的文件或文件夹被打开,或者被系统占用。遇到这种情况要怎么处理呢,本文介绍下具体的操作方法来帮助你解决这个问题。 方…

邀请合作如何表达_适时表达想法 才有利于彼此的合作

丹尼跟珍妮合作主持一个podcast节目,两人对这个节目兴致勃勃,并花很多时间投入,珍妮想邀请自己身边朋友一起参加,认为特别来宾可以增加节目的丰富度;丹尼却觉得现在节目才刚开始起步,要建立好两人的节目定位…

python泰坦尼克号数据预测_使用python预测泰坦尼克号生还

简介Titanic是Kaggle竞赛的一道入门题,参赛者需要根据旅客的阶级、性别、年龄、船舱种类等信息预测其是否能在海难中生还,详细信息可以参看https://www.kaggle.com/,本文的分析代码也取自 kaggle 中该竞赛的 kernal。数据介绍给出的数据格式如…

idea代码可以编译但是爆红_推荐一款 IDEA 生成代码神器,写代码再也不用加班了...

作者:HeloWxl链接:https://www.jianshu.com/p/e4192d7c6844Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大。1、安装(EasyCode)我这里的话是已经那装好了。建议大…

html跑马灯_用Excel居然能做“跑马灯”,而且还这么简单!

我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务。支持我,也为自己加油!你没看错,上面这个就是用Excel做出来的,不过要用到窗体和控件。步骤如下&am…

c语言双链表排序交换节点_图解:单链表翻转的三种方式!

当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转。单链表反转,反转后的效果如下:看起来很简单,只需要将单链表所有结点的 next 指向&#xff…