记录C语言第一个小项目---推箱子小游戏

 

目录

代码展示

效果展示

结语


代码展示

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//获取按键消息处理函数
#include<stdbool.h>//布尔函数调用
//推箱子的元素有 空地0  墙1  目的地2  箱子3  玩家4  箱子在目的地 5  玩家在目的地 6
//定义一个二维数组,用来表示推箱子的游戏地图
enum Mine//枚举元素
{
	SPACE,//空地
	WALL,//墙
	DEST,//目的地
	BOX,//箱子
	PLAYER//玩家
};
//当前关卡
int level = 0;
int map[3][10][10]= 
{
	{
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
		{ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
		{ 0, 0, 0, 1, 2, 1, 1, 1, 1, 0 },
		{ 0, 1, 1, 1, 3, 3, 0, 2, 1, 0 },
		{ 0, 1, 2, 3, 4, 0, 1, 1, 1, 0 },
		{ 0, 1, 1, 1, 1, 3, 1, 0, 0, 0 },
		{ 0, 0, 0, 0, 1, 2, 1, 0, 0, 0 },
		{ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 },
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
	},
	{
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
		{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
		{ 0, 1, 0, 2, 1, 1, 2, 0, 1, 0 },
		{ 1, 0, 0, 0, 3, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 3, 0, 0, 0, 1 },
		{ 0, 1, 0, 0, 3, 3, 0, 0, 1, 0 },
		{ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
		{ 0, 0, 0, 1, 2, 2, 1, 0, 0, 0 },
		{ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
	},
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 2, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 3, 3, 0, 0, 3, 3, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 2, 0, 0, 2, 2, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
	},
};
void gamedraw()
{
	for (int i = 0; i < 10; i++)
	{
		for (int k = 0; k < 10; k++)
		{
		  switch (map[level][i][k])
			{
				case SPACE:
					printf("  ");//一个汉字占两个字符
					break;
				case WALL:
					printf("墙");
					break;
				case DEST:
					printf("☆");
					break;
				case BOX:
					printf("□");
					break;
				case PLAYER:
					printf("♀");
					break;
				case PLAYER + DEST:
					printf("♂");
					break;
				case BOX + DEST:
					printf("★");
					break;
				}
		}
		printf("\n");
	}
}
//按键消息处理函数
void keyEvent()
{
	//获取玩家位置
	int i = 0 ,k = 0;
	for ( i = 0; i < 10; i++)
	{
		for ( k = 0; k < 10; k++)
		{
			if (map[level][i][k] == PLAYER || map[level][i][k]==PLAYER+DEST)
			{
				goto end;
			}
		}
	}
end:;
	//怎么获取按键消息,使用vs自带的库
	char ch = _getch();//上下左右 72 80 75 77
	switch (ch)
	{
	case 72:
	case 'w':
	case 'W':
		//能不能移动 玩家的前面是空地或者目的地就直接移动 
		if (map[level][i - 1][k] == SPACE||map[level][i - 1][k] == DEST)
		{
			map[level][i - 1][k] += PLAYER;
			map[level][i][k] -= PLAYER;
		}
		else if (map[level][i - 1][k] == BOX || map[level][i - 1][k] == BOX + DEST)//如果前面是箱子 则还要判断箱子的前面是什么
		{
			if (map[level][i - 2][k] == SPACE || map[level][i - 2][k] == DEST)
			{
				//把箱子移动到前面一个位置
				map[level][i - 2][k] += BOX;
				//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
				map[level][i - 1][k] = map[level][i - 1][k] - BOX + PLAYER;
				//将玩家原位置消除
				map[level][i][k] -= PLAYER;
		  }
		}
		break;
	case 80:
	case 's':
	case 'S':
		//能不能移动 玩家的下面是空地或者目的地就直接移动 
		if (map[level][i +1][k] == SPACE || map[level][i +1][k] == DEST)
		{
			map[level][i +1][k] += PLAYER;
			map[level][i][k] -= PLAYER;
		}
		else if (map[level][i +1][k] == BOX || map[level][i +1][k] == BOX + DEST)//如果下面是箱子 则还要判断箱子的下面是什么
		{
			if (map[level][i +2][k] == SPACE || map[level][i +2][k] == DEST)
			{
				//把箱子移动到下面一个位置
				map[level][i +2][k] += BOX;
				//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
				map[level][i +1][k] = map[level][i +1][k] - BOX + PLAYER;
				//将玩家原位置消除
				map[level][i][k] -= PLAYER;
			}
		}
		break;
	case 75:
	case 'a':
	case 'A':
		//能不能移动 玩家的左面是空地或者目的地就直接移动 
		if (map[level][i][k-1] == SPACE || map[level][i][k-1] == DEST)
		{
			map[level][i][k-1] += PLAYER;
			map[level][i][k] -= PLAYER;
		}
		else if (map[level][i][k-1] == BOX || map[level][i][k-1] == BOX + DEST)//如果左面是箱子 则还要判断箱子的左面是什么
		{
			if (map[level][i][k-2] == SPACE || map[level][i][k-2] == DEST)
			{
				//把箱子移动到左面一个位置
				map[level][i][k-2] += BOX;
				//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
				map[level][i][k-1] = map[level][i][k-1] - BOX + PLAYER;
				//将玩家原位置消除
				map[level][i][k] -= PLAYER;
			}
		}
		break;
	case 77:
	case 'd':
	case 'D':
		//能不能移动 玩家的右面是空地或者目的地就直接移动 
		if (map[level][i][k +1] == SPACE || map[level][i][k +1] == DEST)
		{
			map[level][i][k +1] += PLAYER;
			map[level][i][k] -= PLAYER;
		}
		else if (map[level][i][k +1] == BOX || map[level][i][k +1] == BOX + DEST)//如果右面是箱子 则还要判断箱子的右面是什么
		{
			if (map[level][i][k +2] == SPACE || map[level][i][k +2] == DEST)
			{
				//把箱子移动到右面一个位置
				map[level][i][k +2] += BOX;
				//让原来位置的箱子-去箱子然后加上玩家 玩家就移动到箱子的原位置
				map[level][i][k +1] = map[level][i][k +1] - BOX + PLAYER;
				//将玩家原位置消除
				map[level][i][k] -= PLAYER;
			}
		}
		break;
	}
	printf("%d    %c\n", ch, ch);
}
//判断是否过关
bool jude()
{
	for (int i = 0; i < 10; i++)
	{
		for (int k = 0; k < 10; k++)
		{
			if (map[level][i][k] == BOX)
			{
				return false;
			}
		}
	}
	return true;
}
int main()
{
	for (;;)//死循环刷新
	{
		system("cls");//清屏
   gamedraw();//绘制
   if (jude())
 {
	   level++;//关卡下一关 0 1 2
	   if (level > 2)
	   {
printf("oh!!! 天哪亲爱的你已经过关了~~");
	_getch();
	break;
	   }
	
 }
   keyEvent();
  
	}
	getchar();	
	return 0;
}

效果展示

结语

这是本人在学习c语言初级阶段真正意义上的第一个小项目,虽然简单,但很有纪念价值。望以此自勉。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值