很老的一款单机小游戏推箱子,使用纯C语言实现并不是很容易,在编写调试过程中遇到了很多问题。下面把纯C推箱子代码解释并分享给大家,希望大家一起学习,代码已分享到我的CSDN上传中,大家也可以在我的百度网盘中免费下载。
由于开发时间比较短,我这里没有加载图片,关卡也就一关,大家可以根据以前玩的推箱子关卡,自己修改界面数组来创造新的推箱子小游戏。
运行游戏界面如下:
定义游戏界面存储数组,并对数组初始化赋值:
/*推箱子小游戏的桌面数组,其中 0 代表着空白的地方;
1 代表着墙;2 代表着人;3 代表着箱子;4 代表着箱子的中点位置。*/
int push_box[9][11]={
{0,1,1,1,1,1,1,1,1,1,0},
{0,1,0,0,0,1,0,0,0,1,0},
{0,1,0,3,3,3,3,3,0,1,0},
{0,1,0,3,0,3,0,3,0,1,1},
{0,1,0,0,0,2,0,0,3,0,1},
{1,1,0,1,1,1,1,0,3,0,1},
{1,0,4,4,4,4,4,1,0,0,1},
{1,0,4,4,4,4,4,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0}
};
判断游戏是否结束,当判断箱子全部进入到规定取与,则判定为赢,显示Win界面:
int win_loss()//判断游戏结果
{
int k=0;
for(int i=0;i<9;i++)
{
for (int j=0;j<11;j++)
{
if(push_box[i][j]==3)
k++;
}
}
if(k==0)//箱子全部进入规定区域则判断为赢
{
system("cls");//清屏
printf("\n\n\n");
printf(" Congratulation!\n");
printf(" You win the game!\n");
exit(0);
}
}
相应键盘事件,当按下键盘后,移动小人位置,改变数组:
int move_position()//小人位置的变化,当有键盘事件时,改变游戏界面数组
{
int count,caw;//行和列
for(int i=0;i<9;i++)//确定人的位置
{
for (int j=0;j<11;j++)
{
if(push_box[i][j]==2||push_box[i][j]==6)
{
count=i;
caw=j;
}
}
}
int tui=getch();//getchar()输入一个字符后需要回车来进行下一个字符的输入,getch()则不需要回车就能连续输入多个字符。
switch(tui)
{
case 'w':
case 'W':
case 72://上
if(push_box[count-1][caw]==0||push_box[count-1][caw]==4)
{
push_box[count][caw]-=2;
push_box[count-1][caw]+=2;
}
else if(push_box[count-1][caw]==3||push_box[count-1][caw]==7)
{
if(push_box[count-2][caw]==0||push_box[count-2][caw]==4)
{
push_box[count][caw]-=2;
push_box[count-1][caw]-=1;
push_box[count-2][caw]+=3;
}
}
break;
case 's':
case 'S':
case 80://下
if(push_box[count+1][caw]==0||push_box[count+1][caw]==4)
{
push_box[count][caw]-=2;
push_box[count+1][caw]+=2;
}
else if(push_box[count+2][caw]==0||push_box[count+2][caw]==4)
{
if(push_box[count+1][caw]==3||push_box[count+1][caw]==7)
{
push_box[count][caw]-=2;
push_box[count+1][caw]-=1;
push_box[count+2][caw]+=3;
}
}
break;
case 'a':
case 'A':
case 75://左
if(push_box[count][caw-1]==0||push_box[count][caw-1]==4)
{
push_box[count][caw]-=2;
push_box[count][caw-1]+=2;
}
else if(push_box[count][caw-2]==0||push_box[count][caw-2]==4)
{
if(push_box[count][caw-1]==3||push_box[count][caw-1]==7)
{
push_box[count][caw]-=2;
push_box[count][caw-1]-=1;
push_box[count][caw-2]+=3;
}
}
break;
case 'd':
case 'D':
case 77://右
if(push_box[count][caw+1]==0||push_box[count][caw+1]==4)
{
push_box[count][caw]-=2;
push_box[count][caw+1]+=2;
}
else if(push_box[count][caw+2]==0||push_box[count][caw+2]==4)
{
if(push_box[count][caw+1]==3||push_box[count][caw+1]==7)
{
push_box[count][caw]-=2;
push_box[count][caw+1]-=1;
push_box[count][caw+2]+=3;
}
}
break;
}
}
通过printf绘制界面,将数组打印到窗口中:
int newinterface()//绘制游戏界面
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<11;j++)
{
switch(push_box[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■"); //墙
break;
case 2:
printf("♀"); //小人
break;
case 3:
printf("☆"); //箱子
break;
case 4:
printf("◎"); //终点地方
break;
case 6:
printf("♂");//人加终点位置
break;
case 7:
printf("★") ;//箱子加终点位置
break;
}
}
printf("\n");
}
}
主函数,调用上述函数:
int newinterface()//绘制游戏界面
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<11;j++)
{
switch(push_box[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■"); //墙
break;
case 2:
printf("♀"); //小人
break;
case 3:
printf("☆"); //箱子
break;
case 4:
printf("◎"); //终点地方
break;
case 6:
printf("♂");//人加终点位置
break;
case 7:
printf("★") ;//箱子加终点位置
break;
}
}
printf("\n");
}
}
推箱子小游戏源码:
main.c
/** \推箱子小游戏
*
* \作者:Dog语言
* \文件:main.h
* \日期:2020-8-20
* \版本:V1.0.0
*
*/
#include<stdio.h>
#include<conio.h>
#include<windows.h>
/*推箱子小游戏的桌面数组,其中 0 代表着空白的地方;
1 代表着墙;2 代表着人;3 代表着箱子;4 代表着箱子的中点位置。*/
int push_box[9][11]={
{0,1,1,1,1,1,1,1,1,1,0},
{0,1,0,0,0,1,0,0,0,1,0},
{0,1,0,3,3,3,3,3,0,1,0},
{0,1,0,3,0,3,0,3,0,1,1},
{0,1,0,0,0,2,0,0,3,0,1},
{1,1,0,1,1,1,1,0,3,0,1},
{1,0,4,4,4,4,4,1,0,0,1},
{1,0,4,4,4,4,4,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0}
};
int win_loss()//判断游戏结果
{
int k=0;
for(int i=0;i<9;i++)
{
for (int j=0;j<11;j++)
{
if(push_box[i][j]==3)
k++;
}
}
if(k==0)//箱子全部进入规定区域则判断为赢
{
system("cls");//清屏
printf("\n\n\n");
printf(" Congratulation!\n");
printf(" You win the game!\n");
exit(0);
}
}
int move_position()//小人位置的变化,当有键盘事件时,改变游戏界面数组
{
int count,caw;//行和列
for(int i=0;i<9;i++)//确定人的位置
{
for (int j=0;j<11;j++)
{
if(push_box[i][j]==2||push_box[i][j]==6)
{
count=i;
caw=j;
}
}
}
int tui=getch();//getchar()输入一个字符后需要回车来进行下一个字符的输入,getch()则不需要回车就能连续输入多个字符。
switch(tui)
{
case 'w':
case 'W':
case 72://上
if(push_box[count-1][caw]==0||push_box[count-1][caw]==4)
{
push_box[count][caw]-=2;
push_box[count-1][caw]+=2;
}
else if(push_box[count-1][caw]==3||push_box[count-1][caw]==7)
{
if(push_box[count-2][caw]==0||push_box[count-2][caw]==4)
{
push_box[count][caw]-=2;
push_box[count-1][caw]-=1;
push_box[count-2][caw]+=3;
}
}
break;
case 's':
case 'S':
case 80://下
if(push_box[count+1][caw]==0||push_box[count+1][caw]==4)
{
push_box[count][caw]-=2;
push_box[count+1][caw]+=2;
}
else if(push_box[count+2][caw]==0||push_box[count+2][caw]==4)
{
if(push_box[count+1][caw]==3||push_box[count+1][caw]==7)
{
push_box[count][caw]-=2;
push_box[count+1][caw]-=1;
push_box[count+2][caw]+=3;
}
}
break;
case 'a':
case 'A':
case 75://左
if(push_box[count][caw-1]==0||push_box[count][caw-1]==4)
{
push_box[count][caw]-=2;
push_box[count][caw-1]+=2;
}
else if(push_box[count][caw-2]==0||push_box[count][caw-2]==4)
{
if(push_box[count][caw-1]==3||push_box[count][caw-1]==7)
{
push_box[count][caw]-=2;
push_box[count][caw-1]-=1;
push_box[count][caw-2]+=3;
}
}
break;
case 'd':
case 'D':
case 77://右
if(push_box[count][caw+1]==0||push_box[count][caw+1]==4)
{
push_box[count][caw]-=2;
push_box[count][caw+1]+=2;
}
else if(push_box[count][caw+2]==0||push_box[count][caw+2]==4)
{
if(push_box[count][caw+1]==3||push_box[count][caw+1]==7)
{
push_box[count][caw]-=2;
push_box[count][caw+1]-=1;
push_box[count][caw+2]+=3;
}
}
break;
}
}
int newinterface()//绘制游戏界面
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<11;j++)
{
switch(push_box[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■"); //墙
break;
case 2:
printf("♀"); //小人
break;
case 3:
printf("☆"); //箱子
break;
case 4:
printf("◎"); //终点地方
break;
case 6:
printf("♂");//人加终点位置
break;
case 7:
printf("★") ;//箱子加终点位置
break;
}
}
printf("\n");
}
}
int main()//主函数
{
while(1)
{
system("cls");//对其进行清屏
newinterface();
move_position();
win_loss();
}
exit(0);
}