C语言项目二——推箱子

推箱子:

1、确定数字与字符的对应关系

    0 printf(" ");  路
    1 printf("@");  人
    2 printf("#");  墙
    3 printf("$");  箱子
    4 printf("O");  目标点
    5 printf("@"); 
    7 printf("$");

2、定义地图

char map[8][8] ={
    {0,0,2,2,2,2,0,0},
    {0,0,2,4,4,2,0,0},
    {0,2,2,0,4,2,2,0},
    {0,2,0,0,3,4,2,0},
    {2,2,0,3,0,0,2,2},
    {2,0,0,2,3,3,0,2},
    {2,0,0,1,0,0,0,2},
    {2,2,2,2,2,2,2,2}
    };

3、定义记录小人位置的变量 6 3

4、进入死循环

    1、清理屏幕
    2、显示地图 把数字转换为对应的符号显示
    3、获取方向键并处理
        1、前面是墙壁
        2、前面是路或者目标,参考走迷宫移动
            目标位置 += 1         //人站在路上就等于人 0+1=1
            原位置  -= 1				//人离开了路就等于路 1-1=0
        3、前面是在路上的箱子,或者在目标点上的箱子
            1、箱子前面是墙壁
            2、箱子前面必须是路或者目标点
                人前面的前面 +=3 		//人前面是箱子,箱子的前面是路,人推箱子箱子站在路上,3=0+3
                人前面       -=2            //箱子被人推走人站在原本箱子的地方 1=3-2
                原来的位置   -=1

4、如果放置完毕,游戏结束


#include <stdio.h>
#include <getch.h>
#include <stdlib.h>

int main(int argc,const char* argv[])
{
	char map[8][8] ={
		{0,0,2,2,2,2,0,0},
		{0,0,2,4,4,2,0,0},
		{0,2,2,0,4,2,2,0},
		{0,2,0,0,3,4,2,0},
		{2,2,0,3,0,0,2,2},
		{2,0,0,2,3,3,0,2},
		{2,0,0,1,0,0,0,2},
		{2,2,2,2,2,2,2,2}
		};

	// 小人的位置坐标
	char m_x = 6,m_y = 3;

	// 进入死循环
	for(;;)
	{
		// 清理屏幕
		system("clear");
		
		int cnt = 0;

		// 显示地图
		for(int i=0; i<8; i++)
		{
			for(int j=0; j<8; j++)
			{
				switch(map[i][j])
				{
					case 0:	printf("  "); break;
					case 1: printf("@ "); break;
					case 2: printf("# "); break;
					case 3: printf("$ "); break;
					case 4: printf("O "); break;
					case 5: printf("@ "); break;//人站在目标点上1+4
					case 7: printf("$ "); cnt++; break;//箱子推到目标点上3+4
				}
			}
			printf("\n");
		}
		if(4 == cnt)
		{
			printf("游戏结束\n");
			return 0;
		}

		switch(getch())
		{
			case 183:
				if(0 == map[m_x-1][m_y] || 4 == map[m_x-1][m_y])
				{
					map[m_x-1][m_y] += 1;
					map[m_x--][m_y] -= 1;
				}
				else if(3 == map[m_x-1][m_y] || 7 == map[m_x-1][m_y])
				{
					if(0 == map[m_x-2][m_y] || 4 == map[m_x-2][m_y])
					{
						map[m_x-2][m_y] += 3;
						map[m_x-1][m_y] -= 2;
						map[m_x--][m_y] -=1;
					}
				}
				break;
			case 184:
				if(0 == map[m_x+1][m_y] || 4 == map[m_x+1][m_y])
				{
					map[m_x+1][m_y] += 1;
					map[m_x++][m_y] -= 1;
				}
				else if(3 == map[m_x+1][m_y] || 7 == map[m_x+1][m_y])
				{
					if(0 == map[m_x+2][m_y] || 4 == map[m_x+2][m_y])
					{
						map[m_x+2][m_y] += 3;
						map[m_x+1][m_y] -= 2;
						map[m_x++][m_y] -=1;
					}
				}
				break;
			case 185:
				if(0 == map[m_x][m_y+1] || 4 == map[m_x][m_y+1])
				{
					map[m_x][m_y+1] += 1;
					map[m_x][m_y++] -= 1;
				}
				else if(3 == map[m_x][m_y+1] || 7 == map[m_x][m_y+1])
				{
					if(0 == map[m_x][m_y+2] || 4 == map[m_x][m_y+2])
					{
						map[m_x][m_y+2] += 3;
						map[m_x][m_y+1] -= 2;
						map[m_x][m_y++] -=1;
					}
				}
				break;
			case 186:
				if(0 == map[m_x][m_y-1] || 4 == map[m_x][m_y-1])
				{
					map[m_x][m_y-1] += 1;
					map[m_x][m_y--] -= 1;
				}
				else if(3 == map[m_x][m_y-1] || 7 == map[m_x][m_y-1])
				{
					if(0 == map[m_x][m_y-2] || 4 == map[m_x][m_y-2])
					{
						map[m_x][m_y-2] += 3;
						map[m_x][m_y-1] -= 2;
						map[m_x][m_y--] -=1;
					}
				}
				break;
		}
	}

}

此项目采用数字加减来替代符号,更容易使用,适合多层重叠的应用,但复杂一点需要认真揣摩算数关系,在迷宫项目里死循环刷新行走道路的基础上加以实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值