当前位置: 首页 > news >正文

简易贪吃蛇

简易贪吃蛇

Snake Game

一个使用C++实现的控制台简易贪吃蛇小游戏,刚开始做项目训练。

使用方式

使用W,S,A,D来实现上下左右移动,Q退出,P暂停。

注意事项

  • 要C++ 11或以上的版本
  • 作者是在读大学生,如果你对我的代码有任何问题或优化方法,请务必告知❤️❤️

代码

#include <iostream>
#include <random>
#include <vector>
#include <Windows.h>
#include <conio.h>
#include <fstream>
using namespace std;const int WIDTH  = 22;
const int LENGTH = 32;// 蛇头的朝向
enum Direction {UP,DOWN,LEFT,RIGHT
};class GameMap {
public:char gameMap[WIDTH][LENGTH];	// 游戏地图int food_x, food_y;	// 食物的坐标int Score;	// 得分int Round;	// 轮次int AllTimeHigh_score;	// 历史最高得分public:GameMap(){for (int j = 0; j < LENGTH; j++) gameMap[0][j] = gameMap[WIDTH - 1][j] = '-';	// 上下边界for (int i = 1; i < WIDTH-1; i++) gameMap[i][0] = gameMap[i][LENGTH - 1] = '|';	// 左右边界for (int i = 1; i < WIDTH - 1; i++) for (int j = 1; j < LENGTH - 1; j++) gameMap[i][j] = ' ';	// 中间清空Score = Round = AllTimeHigh_score = 0;	// 初始化,Round用0是因为程序员的第一是0generate_food();}void generate_food(){random_device rd;mt19937 gen(rd());uniform_int_distribution<> dist_x(1, WIDTH - 2);	food_x = dist_x(gen);uniform_int_distribution<> dist_y(1, LENGTH - 2);	food_y = dist_y(gen);gameMap[food_x][food_y] = '$';}void show(){system("cls");  // 清屏刷新cout << "All-time high score: " << loadHighScore() << ", Round: " << Round << ", Score: " << Score << endl;for (int i = 0; i < WIDTH; i++){for (int j = 0; j < LENGTH; j++) cout << gameMap[i][j];cout << endl;}}int loadHighScore(){ifstream ifs("AllTimeHighScore.txt", ios::in);int hs = 0;if (ifs >> hs) return hs;return 0;}void saveHighScore(int hs){ofstream ofs("AllTimeHighScore.txt", ios::out);ofs << hs;}
};class Snake : public GameMap {
private:vector<pair<int, int>> mySnake;	// 蛇的坐标int head_x, head_y;	// 蛇头Direction Dir;		// 蛇头朝向public:Snake(){head_x = 10, head_y = 15;mySnake.push_back(make_pair(head_x, head_y));mySnake.push_back(make_pair(head_x, head_y-1));	// 初始时设置蛇的长度为2gameMap[head_x][head_y] = '0';gameMap[head_x][head_y] = 'o';Dir = RIGHT;}bool control_direction(){if (_kbhit()){char key = _getch();switch (key){case 'w': if(Dir != DOWN)	Dir = UP;		break;case 's': if(Dir != UP)		Dir = DOWN;		break;case 'a': if(Dir != RIGHT)	Dir = LEFT;		break;case 'd': if(Dir != LEFT)	Dir = RIGHT;	break;case 'p': system("pause");	break;case 'q': return false;}}return true;}bool move(){// 更新头部switch (Dir){case UP:    head_x--; break;case DOWN:  head_x++; break;case LEFT:  head_y--; break;case RIGHT: head_y++; break;}mySnake.insert(mySnake.begin(), make_pair(head_x, head_y));// 撞墙检测if (head_x <= 0 || head_x >= WIDTH-1 || head_y <= 0 || head_y >= LENGTH-1){cout << "You hit the wall!" << endl;return false;}// 撞到自己检测for (int i = 1; i < (int)mySnake.size(); i++)if (mySnake[i].first == head_x && mySnake[i].second == head_y){cout << "You are eating yourself!" << endl;return false;}// 吃到食物了if (head_x == food_x && head_y == food_y){if (Round < 3) Score += 5;else if (Round < 7) Score += 10;else if (Round < 10) Score += 15;else if (Round < 30) Score += 20;else if (Round < 50) Score += 25;else if (Round < 100) Score += 30;else Score += 50;generate_food();Round++;}// 没吃到,要删除蛇尾else{gameMap[mySnake.back().first][mySnake.back().second] = ' ';mySnake.pop_back();}gameMap[head_x][head_y] = '0';gameMap[mySnake[1].first][mySnake[1].second] = 'o';return true;}void run(){while (true){bool q = control_direction();if (!move() || !q){cout << "Game over!" << endl;if (Score > AllTimeHigh_score) saveHighScore(Score);return;}show();if (Round < 3) Sleep(1000);else if (Round < 7) Sleep(700);else if (Round < 10) Sleep(500);else if (Round < 30) Sleep(400);else if (Round < 50) Sleep(300);else if (Round < 100) Sleep(200);else Sleep(100);}}
};int main()
{Snake snake;snake.run();return 0;
}

如果你喜欢的话,能不能给我的github处也点各⭐:https://github.com/Shu-Jvan/Snake-Game

http://www.jsqmd.com/news/747396/

相关文章:

  • Windows平台APK安装解决方案:无缝运行Android应用的核心技术与实践指南
  • MetaMask扩展性能优化终极指南:快速解决插件加载缓慢问题
  • 【优化求解】基于ADMM求解插电式混合动力汽车凸优化能源管理问题附matlab代码
  • 揭秘AI系统提示词泄露:从DALL-E 3案例看用户行为分析的终极指南
  • 终极性能对决:ASP.NET Boilerplate 数据访问层 EF Core vs Dapper vs ADO.NET 谁更快?
  • Grist安全审计终极指南:10个关键步骤保护你的数据免受未授权访问
  • 岐金兰声明:佛学、心灵哲学与旧唯物主义的茧房
  • Ruler技能管理详解:扩展AI助手领域专业知识的终极方案
  • 别再只调阈值了!用OpenCV的Sobel梯度法,轻松应对低对比度图像缺陷检测难题
  • 别再死磕EMD和VMD了!试试这个2023年SCI顶刊新算法:特征模态分解(FMD)的Matlab保姆级教程
  • PKHeX自动化插件完整指南:如何轻松创建合法宝可梦
  • F - Plan Holidays
  • 告别Keepalived!在Windows Server上用自带NLB给Nginx做高可用,实测踩坑记录
  • hcxdumptool完整教程:从零开始掌握无线安全测试
  • EasyWeChat日志聚合分析终极指南:使用Kibana深度洞察微信API调用模式
  • TensorFlow图卷积网络终极指南:自定义损失函数与评估指标完全教程
  • 如何将Theatre动画导出为AVIF:下一代图像格式的完整指南
  • 终极Gin-Admin安全配置指南:JWT认证与RBAC权限的完美组合
  • AI提示词行业标准制定终极指南:从泄露系统提示词到规范化发展
  • 终极指南:如何用crypto-js实现GDPR、HIPAA等数据保护法规合规要求
  • 终极指南:如何利用Python构建专业的空气质量与水质监测系统
  • uni-app 初入门
  • DevilutionX崩溃恢复终极指南:快速解决游戏异常的10个实用技巧
  • Manim CE v.. 发布:动画构建更丝滑,随机性终于“可控”了!
  • 如何使用Zerox OCR实现合同条款智能提取与风险预警:2024年完整指南
  • 3分钟终极汉化:免费中文语言包让Axure RP界面秒变母语
  • 从‘炼丹’到‘精调’:用torch.optim.Adam训练Stable Diffusion模型时,我的weight_decay和amsgrad设置心得
  • 树莓派安装openeuler24
  • 【SCI一区算法】动麦优化算法(AOO)求解23个基准测试函数,出图超多附MATLAB代码
  • 序列模型