c++推箱子小游戏

上代码:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int  map[2][7][8] =
{
	//0:空的 1:■ :墙
	//3:☆ 4:★  //目的地和箱子
	//5:※		  //人
	//7:⊙		  //目的(3)和箱子(4)在一起
	//8:※		  //人(5)和目的(3)在一起
	//为让多种情况使用一种算法
 
	{
	1, 1, 1, 1, 1, 1, 1, 1,
	1, 0, 0, 0, 0, 0, 0, 1,
	1, 3, 1, 0, 1, 1, 3, 1,
	1, 4, 0, 0, 4, 0, 3, 1,
	1, 0, 1, 0, 1, 1, 4, 1,
	1, 0, 0, 5, 0, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 0, 0, 0, 1,
		1, 3, 1, 0, 1, 1, 3, 1,
		1, 3, 4, 5, 4, 0, 3, 1,
		1, 4, 1, 0, 1, 1, 4, 1,
		1, 0, 0, 0, 0, 0, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	}
};
int cas = 0;	//为0表示第一关
//记录每一关的箱子数 或者是项目和目的在一起的总数
int boxSum[2] = {3,4};
//地图绘图
void drawMap()
{
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (j == 0)
				printf("\t\t");
			switch (map[cas][i][j])
			{
				//	//0:空的 1:■ :墙
			case 0:
				printf("  ");
				break;
			case 1:
				printf("■");
				break;
				//3:☆ 4:★  //目的地和箱子
			case 3:
				printf("☆");
				break;
			case 4:
				printf("★");
				break;
				//5:※		  //人
			case 5:
			case 8:
				printf("※");
				break;
			case 7:
				printf("⊙");
				break;
				//7:⊙		  //目的(3)和箱子(4)在一起
				//8:※		  //人(5)和目的(3)在一起
			}
		}
		printf("\n");
	}
}
//按键处理
void keyDown()
{
	//分析按键过程
	//定位人在哪里
	//人有两种情况:第一个是:人,第二个:人站在目的上
	int i, j;
	for (i = 0; i < 7; i++)
	{
		for (j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
			{
				break;
			}
		}
		if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
		{
			break;
		}
	}
 
	char ch = _getch();	//看不见的字符输入,+头文件 conio.h
	switch (ch)
	{
		//72 80   75 77
	case 'w':
	case 'W':
	case 72:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i - 1][j] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		//如果下一个是箱子,要进一步判断能走
		//注意点:箱子两种状态:箱子,箱子和目的在一起
		else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
			{
				//新的地方箱子来了
				map[cas][i - 2][j] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i - 1][j] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}
 
		}
 
		break;
	case 's':
	case 'S':
	case 80:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i + 1][j] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
			{
				//新的地方箱子来了
				map[cas][i + 2][j] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i + 1][j] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}
 
		}
		break;
 
	case 'a':
	case 'A':
	case 75:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] = map[cas][i][j] - 5;
			//j+=5  j=j+5
 
		}
		else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
			{
				//新的地方箱子来了
				map[cas][i][j - 2] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i][j - 1] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}
 
		}
 
		break;
	case 'D':
	case 'd':
	case 77:
		//下一个地方等于空地或者是目的 能走
		if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
		{
			//3+5=8 :表示目的和人在一起
			//新地方(map[i-1][j])人(5)来了
			map[cas][i][j + 1] += 5;
			//老地方(map[i][j])人(5)走了
			map[cas][i][j] -= 5;
		}
		
		//下一个地方是箱子,判断箱子的下一个地方是不是目的和空地
		else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
		{
			//做箱子的下一个地方判断能不能走
			if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
			{
				//新的地方箱子来了
				map[cas][i][j + 2] += 4;
				//箱子的位置:箱子(-4)走了 人来(+5)
				map[cas][i][j + 1] += 1;
				//原来的地方人走了
				map[cas][i][j] -= 5;
			}
 
		}
		break;
	}
}
//胜负判断
//用什么判断胜负: 箱子到达目的的个数
int gameOver()
{
	int count = 0;
	//所有的地方找一遍
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 7)
				count++;
		}
	}
	return count;
}
//箱子数是零的时候也是胜利
int gameOver2()
{
	int count = 3;
	//所有的地方找一遍
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[cas][i][j] == 3)
				count--;
		}
	}
	return count;
}
 
int main()
{
	while (1)
	{
		printf("\n\t用方向键或w a s d键移动※推动★进入☆\n",cas+1);
		printf("\n\t\t 共两关 第 %d 关\n",cas+1);
		drawMap();
		if (gameOver() == boxSum[cas])
		{
			cas++;
			if (cas == 2)
				break;
			else
			    printf("\n\t\t 该关 OK!按任一键进继续\n");	
		}
		keyDown();
		system("cls");
	}
	printf("游戏结束!");
	printf("\n");
	system("pause");
	return 0;
}

由于写游戏时间较长,更新较慢,请大佬们理解一下

相关推荐
大阳1237 分钟前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
YA33315 分钟前
java基础(九)sql基础及索引
java·开发语言·sql
奇树谦1 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt
weixin_307779131 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
学行库小秘2 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
froginwe112 小时前
HTML 框架:构建网页布局的基石
开发语言
Yn3122 小时前
在 Python 中使用 json 模块的完整指南
开发语言·python·json
没落之殇2 小时前
基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
算法
秋难降2 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
楚韵天工2 小时前
基于GIS的无人机模拟飞行控制系统设计与实现
深度学习·算法·深度优先·无人机·广度优先·迭代加深·图搜索算法