千机游戏提供最新游戏下载和手游攻略!

探秘纯粹C语言编写的酷炫推箱子小游戏全解析

发布时间:2024-08-29浏览:75

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

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

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

1.如果人前面是空地。

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

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

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

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

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

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

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

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

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

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

[cpp] view plain copy

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

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

int i,j;

int main()

{

char input;

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

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

int map[10][12] = {

{2,2,2,2,2,1,1,1,1,1,2,2},

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

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

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

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

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

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

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

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

{2,2,2,2,2,2,2,1,1,1,1,1}

};

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

{

system("CLS");

for (i=0;i<12;i++)

{

printf("%d",i);

}

printf("\n");

/*for (i=1;i<10;i++)

{

printf("%d\n",i);

}*/

printf("\n");

draw_map(map);

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

//找初始位置

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

{

for (j=0;j<12;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

}

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

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("\n恭喜你,过关了!!\n"); //过关提示

return 0;

}

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

{

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

{

for(j=0;j<12;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("\n"); //分行输出

}

}

用户评论

孤者何惧

玩这个小游戏推箱子,完全就是技术宅的最爱啊!纯手工制作,太有感觉了。

    有11位网友表示赞同!

别在我面前犯贱

纯C写成这样,厉害了啊!这款小游戏真是独树一帜。

    有20位网友表示赞同!

艺菲

第一次接触纯C写的小游戏,确实不一样,操作起来很有挑战性。

    有7位网友表示赞同!

陌上花

推箱子这个玩法老套了,但纯C写的游戏体验完全不一样。

    有5位网友表示赞同!

゛指尖的阳光丶

最炫酷两个字,用在这款小游戏上太贴切不过了。

    有6位网友表示赞同!

有一种中毒叫上瘾成咆哮i

玩到最后发现原来还有隐藏关卡呢!这小游戏太细心了。

    有11位网友表示赞同!

迷路的男人

没想到小游戏的代码都写得这么精致。

    有10位网友表示赞同!

断秋风

每次玩这款小游戏,都感觉手都在抖,挑战性爆棚。

    有11位网友表示赞同!

青墨断笺み

玩纯C写的小游戏,就是享受那种原始的感觉。

    有9位网友表示赞同!

男神大妈

推荐给朋友一起玩,大家都说很好玩。

    有20位网友表示赞同!

热点资讯