C++贪吃蛇(控制台版)

C++自学精简实践教程 目录(必读)

目录

主要考察

需求

输入文件

运行效果

实现思路

枚举类型 enum class

启动代码

输入文件data.txt 的内容

参考答案

学生实现的效果


主要考察

模块划分

文本文件读取

UI与业务分离

控制台交互

数据抽象

需求

用户输入字母表示方向,实现贪吃蛇游戏。

规则:碰到边缘和碰到蛇自己都算游戏结束。

输入文件

第一行,包括两个整数,表示游戏棋盘大小。分别表示行数和列数。

后面的内容是一个行数乘以列数的二维数组。

数组的元素为0表示这里没有食物,也没有蛇的身体。

数组的元素为 @ 表示蛇的头。

数组元素为 # 表示蛇的身体。

程序启动一开始运行的时候,蛇没有身体,只有头。

运行效果

实现思路

正式实现代码Snake.cpp只有180行不到。

枚举类型 enum class

enum class 通常用来提供字面值常量。也就是一些固定值。比如,表示方向的东、南、西、北。表示空间的上、下、左、右、前、后。

启动代码

#include <list>
#include <utility>
#include <fstream>
#include <sstream>
#include <iostream>
#include <random>//随机数
#include <chrono>//日期时间
using namespace std;class Snake
{// 游戏的任意位置 只有三种情况:什么也没有;蛇的身体;食物enum class MatrixValueEnum{NOTHING = '0', SNAKE_BODY = '#', FOOD = '2'};
public:// 从文件中加载界面数据,存放到内部容器中,再根据容器内容绘制界面bool LoadPlayDataFromFile(const std::string& file);// 开始游戏void Play(void);
private:// 用户输入一个字符(e/s/f/d),决定将蛇的头部往哪个方向移动bool GoAhead(char userInputDirection);// 核心函数// 移动蛇的头的坐标(x,y) = (x,y) + (i,j)bool GoAhead(int i, int j);//撞到墙壁或者蛇自己的身体就结束游戏bool IsGameOver(int, int) const;// 获取蛇的头的坐标std::pair<int, int> GetCurrentPosition(void) const;// 计算蛇的头移动一次后的新坐标std::pair<int, int> GetNextPosition(int, int) const;// 打印贪吃蛇游戏void PrintMatrix(void) const;// 判断 (i,j) 处是否是一个食物bool ExistFood(int i, int j) const;// 在界面上生成一个新的食物给蛇吃void CreateFood(void);
private:std::vector<std::vector<char>> m_playMatrix;// 整个游戏的数据(二维数组)std::list<std::pair<int, int>> m_snakeBody;// 蛇的身体数据
};bool Snake::LoadPlayDataFromFile(const std::string& file)
{std::ifstream fin(file);if (!fin){std::cout << "can not open file " << file << endl;return false;}std::string line;std::getline(fin, line);std::istringstream iss(line);// 字符串流 https://zhuanlan.zhihu.com/p/441027904int row = 0, column = 0;//读取行数和列数//(1) your codefor (size_t i = 0; i < row; i++){std::vector<char> lineData;std::getline(fin, line);std::istringstream issLineData(line);for (size_t j = 0; j < column; j++){char data;//读取一个元素// (2) your code//将组成蛇的头#存放到蛇m_snakeBody容器中//在文件里,一开始蛇的身体只有一个头,需要把这个数据存起来//(3) your code  判断两个char相等即可// 参考:https://zhuanlan.zhihu.com/p/357348144}//将第一行数据存放到二维数组中,作为第一维的一个元素(子数组)//(4) your code}if (m_snakeBody.size() != 1){cout << "snake body is empty! init game failed." << endl;return false;}return true;
}bool Snake::IsGameOver(int x, int y) const
{//判断游戏是否已经结束了// x y 是蛇的头打算要去的目的地,这个目的地会导致gomeover// 比如超出了游戏界面(下标越界)// 比如撞到了蛇的身体//(5) your codereturn true;
}
std::pair<int, int> Snake::GetCurrentPosition(void) const
{//返回蛇 的头的坐标,是m_snakeBody的第一个元素的值//(6) your code  下面的代码需要自己修改,不可以直接使用std::pair<int, int> front;return front;
}
std::pair<int, int> Snake::GetNextPosition(int i, int j) const
{//根据蛇的头的位置,以及一个移动的向量 (i,j) 得到蛇头部打算要去的新目的地的坐标auto old = GetCurrentPosition();//(7) your code 下面的代码需要自己修改,不可以直接使用int x = 0;int y = 0;return std::make_pair(x, y);
}
bool Snake::ExistFood(int i, int j) const
{//返回 坐标(i,j)处是否是有蛇的食物可以吃//(8) your code 下面的代码需要自己修改,不可以直接使用return false;
}
void Snake::CreateFood(void)
{// 生成一个新的食物给蛇来吃// 随机生成一个新的位置,但是这个位置可能已经是蛇的身体了// 所以,需要用一个循环不断的重复在一个新生成的随机位置放置食物// 直到放置成功为止do{unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();std::mt19937 g(seed);  // mt19937 is a standard mersenne_twister_engine//生成新的随机的坐标//随机数的用法:https://blog.csdn.net/calmreason/article/details/72655060//(9) your code 下面的代码需要自己修改,不可以直接使用int x = 0;int y = 0;// 在新坐标处放置一个食物,记得检查可以放才能放// 一旦放好,记得退出循环,让程序继续执行//(10) your code} while (true);
}
bool Snake::GoAhead(char userInputDirection)
{switch (userInputDirection){case 'w':case 'W':return GoAhead(-1, 0);//upcase 'a':case 'A':return GoAhead(0, -1);//leftcase 'd':case 'D':return GoAhead(0, +1);//rightcase 's':case 'S':return GoAhead(+1, 0);//downdefault:return true;}
}
bool Snake::GoAhead(int i, int j)
{auto nextPosition = GetNextPosition(i, j);//垂直方向x不变,竖直方向y减少1// 首先判断游戏是否已经结束if (IsGameOver(nextPosition.first, nextPosition.second)){return false;}// 判断nextPosition 处是否有食物// 如果有食物,就吃掉这个食物// 并生成一个新的食物if (ExistFood(nextPosition.first, nextPosition.second)){// (11) your code//直接吃掉,尾巴不用移动m_playMatrix[nextPosition.first][nextPosition.second] = static_cast<char>(MatrixValueEnum::SNAKE_BODY);CreateFood();//随机生成一个食物}// 如果 nextPosition 处没有食物,就移动蛇的身体else{// (12) your code//尾巴移动 auto tail = m_snakeBody.back();m_playMatrix[tail.first][tail.second] = static_cast<char>(MatrixValueEnum::NOTHING);m_snakeBody.pop_back();}
}void Snake::Play(void)
{CreateFood();//随机生成一个食物while (true){/*清屏,这不是C++的一部分,是系统调用。这个语句执行的快慢与代码无关,与控制台用户自己设置的缓冲区大小有关。*/system("cls");PrintMatrix();std::cout << "direction: W(up) A(left) S(down) D(right)\n";std::cout << "$: food\n";std::cout << "@: snake head\n";std::cout << "#: snake tail\n";char direction;std::cin >> direction;//往前走一步,如果判断无法往前走到用户指定的位置,就退出程序// (13) your codeif (!GoAhead(direction)){std::cout << "Game Over!" << std::endl;break;}}
}
void Snake::PrintMatrix(void) const
{auto headPosition = m_snakeBody.front();for (size_t i = 0; i < m_playMatrix.size(); i++){for (size_t j = 0; j < m_playMatrix[i].size(); j++){if (i == headPosition.first && j == headPosition.second){std::cout << "@" << " ";}else if (m_playMatrix[i][j] == static_cast<char>(MatrixValueEnum::FOOD)){std::cout << "$" << " ";}else if (m_playMatrix[i][j] == static_cast<char>(MatrixValueEnum::NOTHING)){std::cout << "_" << " ";}else{std::cout << m_playMatrix[i][j] << " ";}}std::cout << std::endl;}
}int main(int argc, char** argv)
{Snake snake;if (snake.LoadPlayDataFromFile("data.txt")){snake.Play();}return 0;
}

输入文件data.txt 的内容

7 7
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 # 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

参考答案

贪吃蛇(控制台版)(答案)

其他参考:

Qt版本的一个贪吃蛇实现 Qt Snake C++

学生实现的效果

视频资源加载失败

视频资源加载失败

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

炒股的策略方法

炒股的策略方法 炒股常见问题 你炒股的时候有没有遇到这样的问题&#xff1f; &#xff08;1&#xff09;需要时刻盯着大盘和个股的走势&#xff0c;一分心&#xff0c;一走神&#xff0c;就错过了机会&#xff1f;工作时没有时间和精力去看大盘走势和个股的走势&#xff0c;…

国内四大炒股软件APP 全面技术解析

随着人们的焦点逐步由电脑PC端转为手机端之后&#xff0c;国内炒股软件也逐步开始推出手机炒股APP&#xff0c;但是面对如此众多的都以“最牛、最佳”等冠名的APP真的实至名归吗&#xff1f;为了大家不再走弯路&#xff0c;不沉迷智能选股&#xff0c;笔者将近期比较火的几款炒…

炒股知识讲解

炒股知识目录 笔者致读者朋友的话一、炒股基础知识1.什么是股票?2.股票的分类a.第一类b.第二类c.第三类 3.股票市场a.一级市场b.二级市场c.三级市场d.四级市场e.场外交易市场f.二板市场 4.各股票市场的开盘时间中国A股市场开盘时间&#xff1a;中国香港股市开盘时间&#xff1…

鸿蒙策略炒股软件安全么,鸿蒙即将全量开源 引爆国产软件板块!

华为正在全方位加速构建鸿蒙生态。在5月18日举行的HarmonyOS Connect伙伴峰会上&#xff0c;华为正式宣布升级智慧全场景生态战略&#xff0c;对鸿蒙硬件生态伙伴进行“产品渠道运营”全方位赋能。 在上述峰会上&#xff0c;华为消费者业务AI与智慧全场景业务部副总裁杨海松给鸿…

同花顺手机显示切换服务器,手机炒股超人时代到来 手机Level-2功能点评

您可能感兴趣的话题&#xff1a; 同花顺手机炒股3G版 核心提示&#xff1a;手机炒股也能看上证深证level-2数据啦&#xff01;深受股民喜爱的同花顺 (300033) 手机炒股正式推出了手机Level-2版&#xff0c;不但优化并新加了股民用户需求较多的功能&#xff0c;还进一步改善软件…

webassembly009 transformers.js 网页端侧推理

之前试用过两个网页端的神经网络框架&#xff0c;一个是 Tensorflow PlayGround&#xff0c;它相当与实现了一个网页端的简单的训练框架&#xff0c;有关节点的数据结构可看这篇。另一个是onnx的网页端(nodejs绿色免安装try onnx on web(chrome))&#xff0c;需要自己转换onnx模…

2022安全员-A证试题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022安全员-A证上岗证题库为安全员-A证考试题库新版习题库&#xff01;2022安全员-A证试题及在线模拟考试根据安全员-A证最新教材汇编。安全员-A证考试真题随时根据安全生产模拟考试一点通上提前熟悉考试环境。 1、【…

2022山东省安全员C证复训题库及模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022山东省安全员C证理论题库是山东省安全员C证试卷高频考题覆盖&#xff01;2022山东省安全员C证复训题库及模拟考试依据山东省安全员C证最新教材汇编。山东省安全员C证考试模拟题随时根据安全生产模拟考试一点通上快…

2022安全员-A证考题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-A证上岗证题目系安全员-A证考试模拟题理论知识考试题库&#xff01;2022安全员-A证考题及在线模拟考试依据安全员-A证新版考试题库。安全员-A证复审模拟考试通过安全生产模拟考试一点通上查看全部题库。…

2022年安全员-C证考试练习题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-C证上岗证题目为安全员-C证操作考试题新版教材大纲题库&#xff01;2022年安全员-C证考试练习题及在线模拟考试根据安全员-C证新版教材大纲编写。安全员-C证模拟考试题库随时根据安全生产模拟考试一点通…

2022年安全员-A证考试试题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-A证复训题库系安全员-A证理论题库的多种练习模式&#xff01;2022年安全员-A证考试试题及在线模拟考试根据安全员-A证新版考试题库。安全员-A证操作考试题通过安全生产模拟考试一点通上模拟考试。 1、【…

2022年安全员-C证考试题库及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022安全员-C证复训题库系安全员-C证练习题考前押题&#xff01;2022年安全员-C证考试题库及在线模拟考试根据安全员-C证新版考试题库。安全员-C证考试题目通过安全生产模拟考试一点通智能考场练习。 1、【多选题】《…

2022安全员-A证考试题模拟考试题库及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-A证考题为安全员-A证复训题库考前押题&#xff01;2022安全员-A证考试题模拟考试题库及在线模拟考试根据安全员-A证考试大纲。安全员-A证全部考试题库通过安全生产模拟考试一点通随机组卷。 1、【多选题…

2022起重机械指挥考试题库及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年起重机械指挥试题为起重机械指挥复习题新版习题库&#xff01;2022起重机械指挥考试题库及在线模拟考试依据起重机械指挥新考试大纲。起重机械指挥考试模拟题通过安全生产模拟考试一点通上模拟考试。 1、【多选…

2022年山东省安全员C证国家题库模拟考试平台操作

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022山东省安全员C证复审题库系山东省安全员C证试卷精选题库&#xff01;2022年山东省安全员C证国家题库模拟考试平台操作根据山东省安全员C证新版教材大纲编写。山东省安全员C证复审模拟考试通过安全生产模拟考试一点…

2022年驾驶员考试网约车驾驶员多选题专项训练及答案

题库来源&#xff1a;优题宝公众号 2022年驾驶员考试网约车驾驶员多选题专项训练及答案&#xff0c;由优题宝公众号根据最新驾驶员考试网约车驾驶员大纲与历年驾驶员考试网约车驾驶员真题汇总编写&#xff0c;包含驾驶员考试网约车驾驶员常考重点题型与知识点&#xff0c;有助…

2022年上海市安全员C证考试题及模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022上海市安全员C证复训题库是上海市安全员C证操作考试题新版习题库&#xff01;2022年上海市安全员C证考试题及模拟考试依据上海市安全员C证考试大纲。上海市安全员C证练习题随时根据安全生产模拟考试一点通上模拟考…

2022年安全员-A证操作证考试题库及模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022安全员-A证考题是安全员-A证复训题库上机考试练习题&#xff01;2022年安全员-A证操作证考试题库及模拟考试根据安全员-A证新版教材大纲编写。安全员-A证上岗证题目随时根据安全生产模拟考试一点通上模拟考试。 1…

2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年道路运输企业安全生产管理人员上岗证题库为道路运输企业安全生产管理人员判断题上机考试练习题&#xff01;2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试根据道路运输企业安全生产管理人员新版…

2022年最新浙江交安安全员考试题库及答案

百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 98.下列关于钢斜梯使用&#xff0c;正确的要求有&#xff08;&#xff09;。 A.长度不宜大于15m B.扶手…