推箱子游戏

#include 
#include 
#include 

int main(int argc,const char* argv[])
{
	// 把游戏截图转换成二维数组
	// 0路 1墙 2人 3目标 4箱子 7箱子+目标 5人+目标
	char map[8][8] = {
		{0,0,1,1,1,1,0,0},
		{0,0,1,3,3,1,0,0},
		{0,1,1,0,3,1,1,0},
		{0,1,0,0,4,3,1,0},
		{1,1,0,4,0,0,1,1},
		{1,0,0,1,4,4,0,1},
		{1,0,0,2,0,0,0,1},
		{1,1,1,1,1,1,1,1},
	};

	// 定义记录推箱者的位置变量
	int mr = 6 , mc = 3;

	// 定义记录步数的变量
	size_t step = 0;

	for(;;)
	{
		// 清理屏幕
		system("clear");
		
		// 统计成功的次数
		int success = 0;

		// 显示界面
		for(int r=0; r<8; r++)
		{
			for(int c=0; c<8; c++)
			{
				switch(map[r][c])
				{
				case 0: printf("  "); break;
				case 1: printf(" #"); break;
				case 2: printf(" @"); break;
				case 3: printf(" O"); break;
				case 4: printf(" ="); break;
				case 5: printf(" @"); break;
				case 7: printf(" ="); success++; break;
				}
			}
			printf("\n");
		}

		// 判断游戏是否结束
		if(4 == success)
		{
			printf("恭喜你过关,共用了%u步!\n",step);
			break;
		}

		// 获取方向键
		switch(getch())
		{
		case 183: 
			// 人的上边是路或目标
			if(0==map[mr-1][mc] || 3==map[mr-1][mc])
			{
				// 旧位置去掉推箱者
				map[mr--][mc] -= 2;
				// 新位置加上推箱者
				map[mr][mc] += 2; 
				// 步数+1
				step++;
			}
			// 人的上边是箱子或箱子+目标 人的上边的上边必须是路或目标
			else if( (4==map[mr-1][mc] || 7==map[mr-1][mc]) && (0==map[mr-2][mc] || 3==map[mr-2][mc]))
			{
				// 旧位置去掉人
				map[mr--][mc] -= 2;
				// 新位置加上人
				map[mr][mc] += 2;
				// 旧位置去掉箱子
				map[mr][mc] -= 4;
				// 新位置加上箱子
				map[mr-1][mc] += 4;
				// 步数+1
				step++;
			}
			break; // 上
		case 184: 
			// 人的下边是路或目标
			if(0==map[mr+1][mc] || 3==map[mr+1][mc])
			{
				// 旧位置去掉推箱者
				map[mr++][mc] -= 2;
				// 新位置加上推箱者
				map[mr][mc] += 2; 
				// 步数+1
				step++;
			}
			// 人的下边是箱子或箱子+目标 人的下边的下边必须是路或目标
			else if( (4==map[mr+1][mc] || 7==map[mr+1][mc]) && (0==map[mr+2][mc] || 3==map[mr+2][mc]))
			{
				// 旧位置去掉人
				map[mr++][mc] -= 2;
				// 新位置加上人
				map[mr][mc] += 2;
				// 旧位置去掉箱子
				map[mr][mc] -= 4;
				// 新位置加上箱子
				map[mr+1][mc] += 4;
				// 步数+1
				step++;
			}
			break; // 下
		case 185: 
			// 人的右边是路或目标
			if(0==map[mr][mc+1] || 3==map[mr][mc+1])
			{
				// 旧位置去掉推箱者
				map[mr][mc++] -= 2;
				// 新位置加上推箱者
				map[mr][mc] += 2; 
				// 步数+1
				step++;
			}
			// 人的右边是箱子或箱子+目标 人的右边的右边必须是路或目标
			else if( (4==map[mr][mc+1] || 7==map[mr][mc+1]) && (0==map[mr][mc+2] || 3==map[mr][mc+2]))
			{
				// 旧位置去掉人
				map[mr][mc++] -= 2;
				// 新位置加上人
				map[mr][mc] += 2;
				// 旧位置去掉箱子
				map[mr][mc] -= 4;
				// 新位置加上箱子
				map[mr][mc+1] += 4;
				// 步数+1
				step++;
			}
			break; // 右
		case 186: 
			// 人的左边是路或目标
			if(0==map[mr][mc-1] || 3==map[mr][mc-1])
			{
				// 旧位置去掉推箱者
				map[mr][mc--] -= 2;
				// 新位置加上推箱者
				map[mr][mc] += 2; 
				// 步数+1
				step++;
			}
			// 人的左边是箱子或箱子+目标 人的左边的左边必须是路或目标
			else if( (4==map[mr][mc-1] || 7==map[mr][mc-1]) && (0==map[mr][mc-2] || 3==map[mr][mc-2]))
			{
				// 旧位置去掉人
				map[mr][mc--] -= 2;
				// 新位置加上人
				map[mr][mc] += 2;
				// 旧位置去掉箱子
				map[mr][mc] -= 4;
				// 新位置加上箱子
				map[mr][mc-1] += 4;
				// 步数+1
				step++;
			}
			break; // 左
		}
	}
}
改良版:
#include 
#include 
#include 

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

	for(;;)
	{
		system("clear");
		
		int success = 0;
		for(int r=0; r<8; r++)
		{
			for(int c=0; c<8; c++)
			{
				switch(map[r][c])
				{
				case 0: printf("  "); break;
				case 1: printf(" #"); break;
				case 3: printf(" O"); break;
				case 2:
				case 5: printf(" @"); break;
				case 7: success++;
				case 4: printf(" ="); break;
				}
			}
			printf("\n");
		}

		if(4 == success)
		{
			printf("恭喜你过关,共用了%u步!\n",step);
			break;
		}

		int r = 0 , c = 0;
		switch(getch())
		{
		case 183: r = -1; break; 
		case 184: r = 1; break;
		case 185: c = 1; break;
		case 186: c = -1; break;
		}

		if(0==map[mr+r][mc+c] || 3==map[mr+r][mc+c])
		{
			map[mr][mc] -= 2;
			mr += r;
			mc += c;
			map[mr][mc] += 2; 
			step++;
		}
		else if((4==map[mr+r][mc+c] || 7==map[mr+r][mc+c]) && 
			    (0==map[mr+r*2][mc+c*2] || 3==map[mr+r*2][mc+c*2]))
		{
			map[mr][mc] -= 2;
			mr += r;
			mc += c;
			map[mr][mc] -= 2;
			map[mr+r][mc+c] += 4;
			step++;
		}
	}
}

你可能感兴趣的:(C代码,vim操作,游戏,c语言)