【C/C++ 11】贪吃蛇游戏
一、题目
贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。
蛇头碰到墙壁或者碰到蛇身就游戏结束。
食物随机生成,蛇吃到食物之后蛇身变长,蛇速加快。
二、算法
1. 初始化游戏地图并打印,地图的边缘是墙,地图的每个坐标都有属性(EMPTY、WALL、FOOD、HEAD、BODY),通过<Window.h>库里面的函数控制光标跳转和颜色。
2. 初始化蛇,蛇是一个单独的类,类里面的属性有蛇头、蛇身、长度、速度,蛇头一个SnakeNode节点,蛇身是一个SnakeNode指针,每个SnakeNode都是一个x、y坐标,用于表示蛇在地图上的位置。
3. 随机生成食物,蛇移动的下一步如果是食物则得分,若下一步是墙壁或蛇身则游戏失败。
4. 通过键盘输入控制方向,若键盘没有输入则保持方向不变。
三、代码
#define _CRT_SECURE_NO_WARNINGS 1#pragma warning (disable:4996)
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <ctime>
#include <vector>
using namespace std;#define ROW 22
#define COL 42#define EMPTY 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4#define COL_WALL 6
#define COL_FOOD 12
#define COL_SNAKE 10#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27
#define ENTER 13int g_map[ROW][COL] = { 0 };
int g_grade = 0;void CursorJump(int x, int y)
{COORD pos; //定义光标位置的结构体变量pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //设置光标位置
}void Color(int x)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //设置颜色// 6——土黄色 7——白色 10——绿色 12——红色
}void SysInit()
{srand((unsigned int)time(NULL));system("title 贪吃蛇");system("mode con cols=84 lines=23"); //设置终端窗口大小CONSOLE_CURSOR_INFO curInfo; //光标信息结构体变量curInfo.dwSize = 1;curInfo.bVisible = FALSE; //光标光标隐藏不可见SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo); //设置光标信息
}void MapInit()
{for (int i = 0; i < ROW; ++i){for (int j = 0; j < COL; ++j){CursorJump(2 * j, i);if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1){Color(COL_WALL);g_map[i][j] = WALL;cout << "■";}else{g_map[i][j] = EMPTY;cout << " ";}}}Color(7);CursorJump(0, ROW);cout << "当前得分是:" << g_grade;
}void RandFood()
{int row, col;do{row = rand() % ROW;col = rand() % COL;} while (g_map[row][col] != EMPTY);g_map[row][col] = FOOD;Color(COL_FOOD);CursorJump(2 * col, row);cout << "●";
}class Snack
{
public:Snack(){len = 2;rate = 3000;head.x = COL / 2;head.y = ROW / 2;g_map[head.y][head.x] = HEAD;body.resize(ROW * COL, Pos(0, 0));for (int i = 0; i < len; ++i){body[i].x = head.x - i - 1;body[i].y = head.y;g_map[body[i].y][body[i].x] == BODY;}}void PrintSnake(int flag){if (flag){// 打印蛇Color(COL_SNAKE);CursorJump(2 * head.x, head.y);cout << "◆";for (int i = 0; i < len; ++i){CursorJump(2 * body[i].x, body[i].y);cout << "◇";}}else{// 覆盖蛇if (body[len - 1].x != 0){CursorJump(2 * body[len - 1].x, body[len - 1].y);cout << " ";}}}void Judge(int x, int y){if (g_map[head.y + y][head.x + x] == FOOD){// 得分g_grade += 10;len++;if (rate > 1000)rate -= 50;Color(7);CursorJump(0, ROW);cout << "当前得分是:" << g_grade;RandFood();}else if (g_map[head.y + y][head.x + x] == WALL|| g_map[head.y + y][head.x + x] == BODY){// 失败Sleep(2000);Color(7);system("cls");cout << " GAME OVER! " << endl;cout << " 游戏失败! " << endl;exit(0);}}void Move(int x, int y){Judge(x, y);PrintSnake(0);int tail = len - 1;g_map[body[tail].y][body[tail].x] = EMPTY;while (tail > 0){body[tail].x = body[tail - 1].x;body[tail].y = body[tail - 1].y;--tail;}body[0].x = head.x;body[0].y = head.y;g_map[body[0].y][body[0].x] = BODY;head.x += x;head.y += y;g_map[head.y][head.x] = HEAD;PrintSnake(1);}void Run(int x, int y){int t = 0;while (1){if (t == 0)t = rate;while (--t){if (kbhit() != 0)break;}if (t == 0)Move(x, y);elsebreak;}}void Play(){int dir = RIGHT;int old = dir;while (1){switch (dir){case 'w':case 'W':case UP:Run(0, -1);old = dir;break;case 's':case 'S':case DOWN:Run(0, 1);old = dir;break;case 'a':case 'A':case LEFT:Run(-1, 0);old = dir;break;case 'd':case 'D':case RIGHT:Run(1, 0);old = dir;break;case SPACE:system("pause>nul");break;case ESC:system("cls");cout << " ESC 退出游戏" << endl;exit(0);}dir = getch();switch (dir){case 'w':case 'W':case UP:case 's':case 'S':case DOWN:if (old == UP || old == DOWN)dir = old;break;case 'a':case 'A':case LEFT:case 'd':case 'D':case RIGHT:if (old == LEFT || old == RIGHT)dir = old;break;case SPACE:case ESC:break;default:dir = old;}}}private:struct Pos{int x, y;Pos() {}Pos(int x1, int y1): x(x1), y(y1){}};Pos head;vector<Pos> body;int len;int rate;
};int main()
{SysInit();MapInit();RandFood();Snack s;s.Play();return 0;
}
四、测试
相关文章:

【C/C++ 11】贪吃蛇游戏
一、题目 贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。 蛇头碰到墙壁或者碰到蛇身就游戏结束。 食物随机生成,蛇吃到食物之后蛇身变长,蛇速加快。 二、算法 1. 初始化游戏地图并打印,地图的边缘是墙,地图的每个坐…...
【日常总结 - java】list 与 字符串(用逗号隔开)相互转换
一、list 转 字符串 第一种:使用谷歌Joiner方法 (推荐) 第二种:循环插入逗号 第三种:stream流 (推荐) 第四种:lambda表达式遍历并加入逗号 二、字符串 转 list 方法一:使用split()方法 方法二:使用C…...

《幻兽帕鲁》好玩吗?幻兽帕鲁能在Mac上运行吗?
最近一款叫做《幻兽帕鲁》的新游戏走红,成为了Steam游戏平台上,连续3周的销量冠军,有不少Mac电脑用户,利用Crossover成功玩上了《幻兽帕鲁》,其实Crossover已经支持很多3A游戏,包括《赛博朋克2077》《博德之…...

【数据分享】1929-2023年全球站点的逐日平均能见度(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,说到常用的降水数据,最详细的降水数据是具体到气象监测站点的降水数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全…...

浅谈——开源软件的影响力
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏:…...

MySQL-事务(TRANSACTION)
文章目录 1. 事务概述2. 事务的四大特性(ACID)3. 控制事务4. 并发事务产生的问题5. 事务的隔离级别6. 拓展6.1 InnoDB如何解决幻读?6.2 MySQL实现事务的原理? 1. 事务概述 定义:数据库的事务( Transaction…...
Vue 实现动态路由
Vue 实现动态路由 Vue中实现动态路由主要涉及到两个方面:一是路由的动态添加,二是基于路由的参数变化来动态渲染组件。这通常在使用Vue Router时进行配置和实现。以下是实现动态路由的一些基本步骤和概念: 安装和设置Vue Router npm insta…...

docker elasticsearch8启动失败
docker elasticsearch8.12.0启动后提示这个,并且始终无法访问localhost:9200 received plaintext http traffic on an https channel, closing connection Netty4HttpChannel 解决方案:重新创建 elasticsearch容器,加上 -e xpack.security.…...

《Python 网络爬虫简易速速上手小册》第1章:Python 网络爬虫基础(2024 最新版)
文章目录 1.1 网络爬虫简介1.1.1 重点基础知识讲解1.1.2 重点案例:社交媒体数据分析1.1.3 拓展案例1:电商网站价格监控1.1.4 拓展案例2:新闻聚合服务 1.2 网络爬虫的工作原理1.2.1 重点基础知识讲解1.2.2 重点案例:股票市场数据采…...

使用 IntelliJ IDEA 配合 Docker 对 Weblogic 中间件进行远程调试
使用idea对jar包远程调试: 打开一个springboot的项目进行远程调试设置: 运行: 其实我不太明白远程调试的意义,本地直接debug不好嘛。。。 点击debug的按钮,打断点测试: 跑到断点处: 远程de…...

ArcGIS学习(三)数据可视化
ArcGIS学习(三)数据可视化 1.矢量数据可视化 需要提前说明的是,在ArcGIS中,所有的可视化选项设置都是在“图层属性”对话框里面的“符号系统”中实现的。 对于矢量数据的可视化,主要有四种可视化方式: 按“要素”可视化按“类别”可视化按“数量”可视化按“图表”可视…...
【使用 Python 进行 NLP】 第 2 部分 NLTK
一、说明 Python 有一些非常强大的 NLP 库,NLTK — 自然语言工具包 — NLTK 是一个强大的开源库,用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推理。…...

【软件设计师笔记】深入探究操作系统
【软件设计师笔记】计算机系统基础知识考点(传送门) 💖 【软件设计师笔记】程序语言设计考点(传送门) 💖 🐓 操作系统的作用 1.通过资源管理提高计算机系统的效率 2.改善人机界面向用户提供友好的工作环境 🐓 操作系统的特征 …...

python常用pandas函数nlargest / nsmallest及其手动实现
目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出…...

web前端-------弹性盒子(2)
上一讲我们谈的是盒子的容器实行,今天我们来聊一聊弹性盒子的项目属性; *******************(1)顺序属性 order属性,用于定义容器中项目的出现顺序。 顺序属性值,为整数,可以为负数ÿ…...
图论练习4
内容:染色划分,带权并查集,扩展并查集 Arpa’s overnight party and Mehrdad’s silent entering 题目链接 题目大意 个点围成一圈,分为对,对内两点不同染色同时,相邻3个点之间必须有两个点不同染色问构…...

flutter go_router 官方路由(一)基本使用
1 项目中添加最新的依赖 go_router: ^13.1.0如下图所示,我当前使用的flutter版本为3.16.0 然后修改应用的入口函数如下: import package:flutter/material.dart; import package:go_router/go_router.dart;void main() {runApp(const MyApp()); }cla…...

QT中,对于大小端UDP网络发送的demo,帧头帧尾
简单demo: 发送端: #include <QUdpSocket> #include <QtEndian>#pragma pack(1) struct Test {unsigned char t1:1;unsigned char t2:2;unsigned char t3:3;unsigned char t4:2;quint8 a 1;quint16 b 2;quint16 c 3;//double b …...
ip网络的三类地址及其相互关系
随着互联网的普及和发展,IP网络已成为全球范围内最重要的信息交换平台。在IP网络中,IP地址是每个设备在网络中的唯一标识,是实现网络通信的关键。虎观代理小二二将详细介绍IP网络中的三类地址,即A类、B类和C类地址,以及…...
开源计算机视觉库OpenCV详细介绍
开源计算机视觉库OpenCV详细介绍 1. OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它最初由Intel开发,现在由一个庞大的社区维护和更新。OpenCV旨在提供一个通用、跨平台的计算机…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...