纯C语言编程-游戏之推箱子

很老的一款单机小游戏推箱子,使用纯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);
 }

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值