前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子

纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子

作者头像
企鹅号小编
发布2018-01-23 17:37:06
2.7K0
发布2018-01-23 17:37:06
举报
文章被收录于专栏:编程

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

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

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

声明画图函数

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

1.如果人前面是空地。

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

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

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

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

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

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

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

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

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

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

代码语言:cpp
复制

//此小游戏使用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(" "); //分行输出
}
}

本文来自企鹅号 - 小辰带你看世界媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 小辰带你看世界媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档