牛刀小试 - C++ 推箱子小游戏

参考文档

C++笔记:推箱子小游戏

copy函数 memcpy()函数用法(可复制数组)

使用memcpy踩出来的坑,值得注意

完整代码

/*********************************************************************
程序名:推箱子小游戏
说明:
*********************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
#include <iostream>
#include <conio.h> //函数getch()所需头文件 
#include <windows.h>
#include <string.h>
#include <iomanip> //输入输出流控制符setw()所在头文件,设置字段宽度为n位 
using namespace std;

//宏定义二维数组下标
#define R 10
#define C 10
/*二维数组地图
1.表示墙体
3.表示目的地
4.表示箱子
5.表示人
0.表示空地
*/
//存储当前使用的地图
int map[R][C] = { 0 };

int map1[R][C] = {
	{ 0, 0, 1, 1, 1, 0, 0, 0 },
	{ 0, 0, 1, 3, 1, 0, 0, 0 },
	{ 0, 0, 1, 0, 1, 1, 1, 1 },
	{ 1, 1, 1, 0, 0, 4, 3, 1 },
	{ 1, 3, 4, 4, 0, 1, 1, 1 },
	{ 1, 1, 1, 5, 4, 1, 0, 0 },
	{ 0, 0, 0, 1, 3, 1, 0, 0 },
	{ 0, 0, 0, 1, 1, 1, 0, 0 }
};

int map2[R][C] = {
	{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
	{ 1, 5, 0, 0, 1, 0, 0, 0, 0, 0 },
	{ 1, 0, 4, 4, 1, 0, 1, 1, 1, 0 },
	{ 1, 0, 4, 0, 1, 0, 1, 3, 1, 0 },
	{ 1, 1, 1, 0, 1, 1, 1, 3, 1, 0 },
	{ 0, 1, 1, 0, 0, 0, 0, 3, 1, 0 },
	{ 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 },
	{ 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 },
	{ 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 }
};

int map3[R][C] = {
	{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },
	{ 0, 0, 1, 1, 0, 0, 1, 0, 5, 1 },
	{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
	{ 0, 0, 1, 4, 0, 4, 0, 4, 0, 1 },
	{ 0, 0, 1, 0, 4, 1, 1, 0, 0, 1 },
	{ 1, 1, 1, 0, 4, 0, 1, 0, 1, 1 },
	{ 1, 3, 3, 3, 3, 3, 0, 0, 1, 0 },
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
};

void Game_Menu();/*初始化模块,显示游戏开始菜单*/
void Game_Description();/*初始化模块,显示游戏操作说明*/
int DrawMap();/*画图模块,绘制地图*/
void Move();/*移动模块,操作人物和箱子的移动*/
int finish();/*判断游戏是否挑战成功*/ 
void setmap(int n);/*游戏关卡设置 */
void color(int m);/*设置文本显示时的颜色*/

BOOL flag = true;/*定义布尔值的标记,方便在游戏时直接退出*/ 
int pass = 1;			//关卡值 


int main() {
	Game_Menu();
	setmap(pass);

	bool g = true;
	while (g)
	{
		switch (getch())
		{
		case 'Q':
		case 'q':
			g = false;
		case 'S':
		case 's':
			while (flag)
			{
				system("cls"); // 清屏
				Game_Description();
				DrawMap();
				Move();//调用该函数时会有等待键盘输入的中断 
				if (finish())
				{
					system("cls");
					DrawMap();
					cout << "游戏胜利!" << endl;
					system("PAUSE");
					pass++;
					setmap(pass);
				}
			}
			break;
		}
	}
}

void Game_Menu()//游戏菜单,初始化模块,显示游戏开始菜单
{
	system("cls");
	cout << "/************************************\\\n";
	cout << "*                                    *\n";
	cout << "*            经 典 小 游 戏          *\n";
	cout << "*               推 箱 子             *\n";
	cout << "*         1.按 S 或 s 键 开 始       *\n";
	cout << "*         2.按 Q 或 q 键 退 出       *\n";
	cout << "*                                    *\n";
	cout << "\\***********************************/\n";
	getch();
}

void Game_Description()/*初始化模块,显示游戏操作说明*/
{
	cout << "/************************************\\\n";
	cout << "*                                    *\n";
	cout << "*              操 作 提 示           *\n";
	cout << "*        操作上移:  W   w   ↑      *\n";
	cout << "*        操作下移:  S   s   ↓      *\n";
	cout << "*        操作左移:  A   a   ←      *\n";
	cout << "*        操作右移:  D   d   →      *\n";
	cout << "*                                    *\n";
	cout << "*        退    出:  Q   q           *\n";
	cout << "*                                    *\n";
	cout << "*                                    *\n";
	cout << "\\***********************************/\n";
}

int DrawMap()	//画图模块,绘制地图
{
	cout << "关卡:" << pass << endl;
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			switch (map[i][j])
			{
			case 0:
				color(0xF);
				cout << "  ";  //空地
				break;
			case 1:
				color(8);
				cout << "■";//墙体
				break;
			case 3:
				color(0xE);
				cout << "☆";//目的地
				break;
			case 4:
				color(4);
				cout << "□";//箱子 
				break;   
			case 5:
				color(3);
				cout << "♀"; //人
				break;
			case 7:     //4+3   箱子到达目的地
				color(6);
				cout << "★";
				break;
			case 8:     //5+3  人与目的地重合
				color(3);
				cout << "♀";
				break;
			default:
				break;
			}
		}
		cout << '\n';
	}
	return 0;
}

void Move()
{
	int r, c;	//保存人物位置
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			if (map[i][j] == 5 || map[i][j] == 8)
			{
				r = i;
				c = j;
			}
		}
	}
	cout << "您当前的坐标为:(" << r << "," << c << ")" << endl;
	int ch;//保存键盘输入的ASCII值
	ch = getch();//接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符
	switch (ch)
	{
	case 'W':/*上移*/
	case 'w':
	case 72:
		if (map[r - 1][c] == 0 || map[r - 1][c] == 3)//人物上方是空地(0)或者目的地 (3),对应情况5和情况6 
		{
			map[r - 1][c] += 5;  // 人物向上移动,上方0(空地)变为5(箱子)
			map[r][c] -= 5;	    // /5(原人物)-5变为0(空地) 
		}
		else if(map[r - 1][c] == 4 || map[r - 1][c] == 7)//人物上方是箱子,箱子在空格上或者箱子在目的地处,对应情况1,2,3,4 
		{
			if (map[r - 2][c] == 0 || map[r - 2][c] == 3)//箱子上方是空格或者前面是目的地,细化为情况1,2或情况3,4
			{
				map[r - 2][c] += 4;//箱子向上移动,上一个0(空地)就变为 4(箱子)
				map[r - 1][c] += 1;//4(原箱子)+1变为 5(人物)
				map[r][c] -= 5; // /5(原人物)-5变为0(空地) 
			}
		}
		break;
	case 'S':
	case 's':
	case '80':
		if (map[r + 1][c] == 0 || map[r + 1][c] == 3)//人下方是空地或目的地 
		{
			map[r + 1][c] += 5;
			map[r][c] -= 5;
		}
		else if (map[r + 1][c] == 4 || map[r + 1][c] == 7)//人下方是箱子 ,箱子在空地或者目的地上 
		{
			if (map[r + 2][c] == 0 || map[r + 2][c] == 3)//箱子下方是空地和目的地
			{
				map[r + 2][c] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子)
				map[r + 1][c] += 1;//4(原箱子)+1变为 5(人物)
				map[r][c] -= 5;//5(原人物)-5变为0(空地) 
			}
		}
		break;
	case 'A':
	case 'a':
	case 75:
		if (map[r][c - 1] == 0 || map[r][c - 1] == 3)//人左方是空地或目的地 
		{
			map[r][c - 1] += 5;
			map[r][c] -= 5;
		}
		else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)//人左方是箱子 ,箱子在空地或者目的地上
		{
			if (map[r][c - 2] == 0 || map[r][c - 2] == 3)//箱子左方是空地和目的地
			{
				map[r][c - 2] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子)
				map[r][c - 1] += 1;//4(原箱子)+1变为 5(人物)
				map[r][c] -= 5;//5(原人物)-5变为0(空地) 
			}
		}
		break;
	case 'D':
	case 'd':
	case 77:
		if (map[r][c + 1] == 0 || map[r][c + 1] == 3)//人右方是空地或目的地 
		{
			map[r][c + 1] += 5;
			map[r][c] -= 5;
		}
		else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)//人右方是箱子 ,箱子在空地或者目的地上
		{
			if (map[r][c + 2] == 0 || map[r][c + 2] == 3)//箱子右方是空地和目的地
			{
				map[r][c + 2] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子)
				map[r][c + 1] += 1;//4(原箱子)+1变为 5(人物)
				map[r][c] -= 5;//5(原人物)-5变为0(空地) 
			}
		}
		break;
	case 'Q':
	case 'q':
		flag = false;

	default:
		break;
	}
}

int finish()
{
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			if (map[i][j] == 4)//当整个二维数组没有4(箱子) ,表明箱子都到位,返回1
			{
				return 0;
			}
		}
	}
	return 1;
}

void setmap(int n){
	if (n == 1)
	{
		memcpy(map, map1, sizeof(map1));
	}
	if (n == 2) {
		memcpy(map, map2, sizeof(map2));
	}
	if (n == 3) {
		memcpy(map, map3, sizeof(map3));
	}
}

void color(int m)
{
	HANDLE consolehend;
	consolehend = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台缓冲区句柄
	SetConsoleTextAttribute(consolehend, m);//参数一为控制台缓冲区句柄,参数二为要设置的颜色
}

运行示例

s
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类和对象 第三部分第三小节:const修饰成员函数

一.常函数&#xff1a; &#xff08;一&#xff09;成员函数后面加const后我们成这个函数为常函数 &#xff08;二&#xff09;常函数内不可以修改成员函数属性 额外补充&#xff1a; this指针的本质&#xff0c;是指针常量&#xff0c;指针指向的是不可以修改的 但是指针指向的…

DB2数据库基本介绍

文章目录 一、DB2数据库1、简介2、特点&#xff08;来自alai&#xff09;3、DB2 Connect4、下载使用5、使用场景 参考文章 一、DB2数据库 百度 1、简介 DB2是IBM一种分布式数据库解决方案。说简单点&#xff1a;DB2就是IBM开发的一种大型关系型数据库平台。它支持多用户或应用…

MIT_线性代数笔记:线性代数常用概念及术语总结

目录 1.系数矩阵2.高斯消元法3.置换矩阵 Permutation4.逆矩阵 Inverse5.高斯-若尔当消元法6.矩阵的 LU 分解7.三角矩阵8.正定矩阵 1.系数矩阵 线性代数的基本问题就是解 n 元一次方程组。例如&#xff1a;二元一次方程组 2 x − y 0 − x 2 y 3 \begin{align*} & 2x -…

数字图像处理(入门篇)十五 OpenCV-Python计算和绘制图像的二维直方图

目录 1 方案 2 实践 彩色图像有三个通道,分别是红、绿和蓝,可以同时为两个颜色通道计算二维直方图,这个过程可以使用 cv2.calcHist() 函数来实现。 1 方案 ①导入依赖库 import cv2 import matplotlib.pyplot as plt ②读取输入图片 <

C语言第八弹---一维数组

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…

23款奔驰GLE350升级小柏林音响 无损音质效果

小柏林之声音响是13个喇叭1个功放&#xff0c;功率是590W&#xff0c;对应普通音响来说&#xff0c;已经是上等了。像著名的哈曼卡顿音响&#xff0c;还是丹拿音响&#xff0c;或者是BOSE音响&#xff0c;论地位&#xff0c;论音质柏林之声也是名列前茅。星骏汇小许Xjh15863 升…

微信小程序(十六)slot插槽

注释很详细&#xff0c;直接上代码 上一篇 温馨提醒&#xff1a;此篇需要自定义组件的基础&#xff0c;如果不清楚请先看上一篇 新增内容&#xff1a; 1.单个插槽 2.多个插槽 单个插糟 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class">…

【Unity3D日常开发】Unity3D中UGUI的Text、Dropdown输入特殊符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到需要显示特殊符号的情况&#xff0c;比如上标、…

今天来看看工商业储能收益模式有哪些

安科瑞武陈燕acrelcy 2023 年有望成为工商业储能的发展元年&#xff0c;主要原因2023年工商业储能的经济性有望大幅提升。工商业储能下游主要为工商业企业&#xff0c;投资是否具有经济性是工商业需求的核心因素之一&#xff0c;而2023年工商业储能经济性或将显著提升&#xf…

conda-建立多个python环境

1. 安装 下载地址&#xff1a;Miniconda — miniconda documentation 2. 安装好了会自动配置环境变量&#xff0c;如果没有配置手动配置 3. 检查conda环境 4. 设置conda配置文件 在‪C:\Users\Administrator下新建文件【.condarc】 channels: //镜像地址- https://mirrors.…

Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?

文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题&#xff0c;下面这道题目大家应该不陌生&#xff1a; Integer i 127; Integer j 127;Integer m 128; Integer n 128;System.out.println(i j); // 输出为 true System.o…

4个值得推荐的WPF UI组件库

WPF介绍 WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式和模板、动画效果等功能&#xff0c;让开发者可以创建出吸引人且交互性强的应用程序。 HandyControl HandyControl是一套WPF控件库&…

社交媒体与新闻:Facebook在信息传播中的角色

社交媒体的崛起不仅改变了人们的日常交流方式&#xff0c;也对新闻传播产生了深远的影响。在众多社交媒体平台中&#xff0c;Facebook以其庞大的用户基础和强大的社交网络机制&#xff0c;成为信息传播的中流砥柱。本文将深入探讨Facebook在社交媒体与新闻传播的交汇点上扮演的…

C语言第九弹---二维数组

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 二维数组 1、二维数组的创建 1.1、二维数组的概念 ​1.2、⼆维数组的创建 2、二维数组的初始化 2.1、不完全初始化 ​2.2、完全初始化 ​2.3、按照行初始化 ​2.4、…

C++入门学习(十五)运算符

算术运算符&#xff1a;用于处理四则运算赋值运算符&#xff1a;用于将表达式的值赋给变量比较运算符&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或假值逻辑运算符&#xff1a;用于根据表达式的值返回真值或假值 一、加减乘除 #include <iostream> #incl…

老师怎么发期末成绩才不会被投诉

众所周知&#xff0c;发布期末成绩是每位老师的必经之路&#xff0c;但也是诸多投诉的导火索。如何才能避免被投诉呢&#xff1f;且听我慢慢道来。 成绩不是老师的“独角戏”。它关乎学生一学期的努力&#xff0c;也关乎家长的期待。因此&#xff0c;成绩的发布需要充分考虑学…

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

Cesium事件处理

文章目录 0.引言1.鼠标事件1.1鼠标左键事件1.2鼠标右键事件1.3鼠标移动事件1.4鼠标滚轮事件 2.键盘事件3.相机事件4.场景渲染事件 0.引言 无论是二维GIS应用系统还是三维GIS应用系统&#xff0c;都离不开各种事件的应用&#xff0c;特别是鼠标左键单击事件、鼠标左键双击事件等…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏系统监控?

如何使⽤Python进⾏系统监控&#xff1f; 使⽤Python进⾏系统监控涉及以下⼀般步骤&#xff1a; 选择监控指标&#xff1a; ⾸先&#xff0c;确定希望监控的系统指标&#xff0c;这可以包括 CPU 利⽤率、内存使⽤情况、磁盘空间、⽹络流量、服务可⽤性等。选择监控⼯具&#x…

Spirngboot3+Vue3-0125

Spirngboot3Vue3-0125 扫描配置文件 Value ConfigurationProperties(prefix "email") 扫描bean ComponentScan bean注册 -三方的bean Bean注册bean Bean("自定义名称") Import 设置bean注册的条件 Conditional -自己的bean Repository Service Controlle…