牛刀小试 - 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
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端怎么监听手机键盘是否弹起

摘要&#xff1a; 开发移动端中&#xff0c;经常会遇到一些交互需要通过判断手机键盘是否被唤起来做的&#xff0c;说到判断手机键盘弹起和收起&#xff0c;应该都知道&#xff0c;安卓和ios判断手机键盘是否弹起的写法是有所不同的&#xff0c;下面讨论总结一下两端的区别以及…

EMQX 单机及集群搭建

目录 1. 通过 Yum 源安装&#xff08;CentOS7 单机安装&#xff09; 1.1. 通过以下命令配置 EMQX Yum 源&#xff1a; 1.2. 运行以下命令安装 EMQX&#xff1a; 1.3. 运行以下命令启动 EMQX&#xff1a; 1.4. 访问 http://192.168.88.130:18083&#xff0c;默认用户名: adm…

C++ 重点内容:友元

目录 友元函数&#xff1a; 友元成员函数&#xff1a; 友元类&#xff1a; 友元是否有悖于OOP? 总结&#xff1a; 类因为具有封装和信息隐藏的特性&#xff08;类外函数无法访问类的私有、保护成员&#xff09;&#xff0c;C提出友元解决特定的编程需要&#xff1b;友元分…

idea用version标签配置版本号报错版本号missing

问题描述&#xff1a; 用<mybatis-plus.version>3.3.2</mybatis-plus.version>配置pom的版本号&#xff0c;报错 dependencies.dependency.version for com.baomidou:mybatis-plus-boot-starter:jar is missing. line 33, column 21详细报错如下&#xff1a; 详…

安卓开发——Activity及常用布局和控件的使用

Activity及常用布局和控件的使用 一、实验目的 掌握Android常用布局和控件的使用。 Activity组件使用和Intent机制&#xff0c;加强对Activity生命周期的理解 二、实验设备及器件 Android Studio&#xff0c;图标&#xff1a;http://10.37.59.210/download/icon/MobileShopI…

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

【复现 3D Gaussian Splatting】protobuf的版本太高而导致编译错误

输入训练&#xff1a; (base) C:\Users\15893\gaussian-splatting>python train.py -s data/tandt/train报错内容如下&#xff1a; If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0.If you …

Spring: alibaba代码规范校验工具checkstyle

文章目录 一、idea配置checkstyle插件二、激活CheckStyle三、配置自动格式化功能 一、idea配置checkstyle插件 下载 Intellij IDEA Checkstyle 插件&#xff1a;File -> setting -> plugin通过关键字CheckStyle-IDEA搜索并安装。 安裝完成后重启idea 二、激活CheckSty…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)-机器人、强化学习

专属领域论文订阅 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 具身智能&#xff0c;机器人强化学习开放词汇&…

模拟问题刷题

模拟类题目是机试题中出现频率很高的一种类型&#xff0c;这类题目的特点是并不涉及特别高 深的知识&#xff0c;只需利用程序实现题目的要求。由于这类题目通常不需要经过太多的思考&#xff0c;所以能够很纯粹地考查考生的编程能力。 1. 图形排版 图形排版是最为常见的模拟…

利用aiohttp异步爬虫实现网站数据高效抓取

前言 大数据时代&#xff0c;网站数据的高效抓取对于众多应用程序和服务来说至关重要。传统的同步爬虫技术在面对大规模数据抓取时往往效率低下&#xff0c;而异步爬虫技术的出现为解决这一问题提供了新的思路。本文将介绍如何利用aiohttp异步爬虫技术实现网站数据抓取&#x…

【UE插件DTRabbitMQ】 虚幻引擎蓝图连接RabbitMQ服务器使用插件说明

本插件可以使用蓝图连接 RabbitMQ服务器&#xff0c;并推送或者监听消息。 下载地址在文章最后。 1. 节点说明 Create RabbitMQ Client - 创建RabbitMQ客户端对象 创建一个RabbitMQ客户端对象&#xff0c;返回的对象需要提升为变量&#xff0c;以后就是用这个对象去操作。 Con…

Leetcode2826. 将三个组排序

Every day a Leetcode 题目来源&#xff1a;2826. 将三个组排序 解法1&#xff1a;贪心 二分查找 最长递增子序列的变种题。 利用 Leetcode300. 最长递增子序列 的方法&#xff0c;求出数组 nums 的最长递增子序列 g&#xff0c;最后答案为 nums.size() - g.size()。 代码…

【JaveWeb教程】(34)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(7)配置文件的设置

目录 SpringBootWeb案例054. 配置文件4.1 参数配置化4.2 yml配置文件4.3 ConfigurationProperties SpringBootWeb案例05 前面我们已经实现了员工信息的条件分页查询以及删除操作&#xff0c;以及实现新增和修改员工。 本节的主要内容&#xff1a; 配置文件的设置 4. 配置文件…

nginx反向代理负载均衡

一&#xff0c;kali作为负载服务器 打开kali nginx服务&#xff0c;访问页面如下 使用docker拉取nginx&#xff0c;并做出端口映射 ┌──(root?kali)-[/etc/nginx] └─# docker pull nginx ┌──(root㉿kali)-[/etc/nginx] └─# docker run -p 11111:80 --name Jdr -d ng…

C++ STL之priority_queue的使用及模拟实现

文章目录 1. 介绍2. priority_queue的使用3. priority_queue的模拟实现 1. 介绍 英文解释&#xff1a; 也就是说&#xff1a; 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆&#xff0c…

算子:详细篇

目录 一、执行环境 1.1 创建执行环境 1.2 执行模式 二、源算子 2.1 从集合中读取数据 2.2 从文件读取数据 2.3 从socket读取数据 2.4 从kafka读取数据 三、转换算子 3.1 基本转换算子 &#xff08;1&#xff09;映射(map) &#xff08;2&#xff09;过滤(filter) &#xff08…

新建react项目,react-router-dom配置路由,引入antd

提示&#xff1a;reactrouter6.4版本&#xff0c;与reactrouter5.0的版本用法有区别&#xff0c;互不兼容需注意 文章目录 前言一、创建项目二、新建文件并引入react-router-dom、antd三、配置路由跳转四、效果五、遇到的问题六、参考文档总结 前言 需求&#xff1a;新建react项…

自动化测试平台搭建背景及记录

在目前产品的迭代过程中&#xff0c;公司现有的自动化测试体系存在很多问题&#xff0c;大多数情况是人工进行用例回归测试&#xff0c;低效且易出错&#xff0c;导致测试流程在效率和品质方面均未达到理想状态。同时&#xff0c;业务上线周期的日益缩短也导致产品质量的不稳定…