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

基于C/C++综合训练 ----- 贪吃蛇

文章目录

  • 一、定义结构体对象
  • 二、游戏初始化
    • 1. 蛇初始化
    • 2. 食物初始化
    • 3. 围墙初始化
    • 4. 界面初始化
  • 三、逻辑编程
    • 1. 启动游戏
    • 2. 打印成绩
    • 3. main函数
  • 四、细节处理
  • 五、程序源码


该篇环境为Visual Studio2022

游戏简述 :在控制终端绘画出一个矩阵表示游戏界面(围墙),“ @ ”表示蛇头,“ * ”表示蛇身,“ # ”表示食物。通过向控制终端输入"a"、“s”、“w”、"d"分别表示贪吃蛇向左、向下、向上、向右移动,食物为随机出现(同一时刻只有一个食物出现),每吃掉一块食物,蛇的移动速度加快且游戏分数+10,若蛇撞到墙或吃到自身会导致游戏结束并打印游戏分数在终端上。

在这里插入图片描述

一、定义结构体对象

该游戏可划分为俩个对象,“贪吃蛇”和“食物”对象
而“贪吃蛇”对象 又可划分为“一节蛇头”和“多节蛇身”

1. 定义蛇身结构体

struct BODY {int X;   //x 和 y 表示蛇身的一个位置点(坐标)int Y;
};

2. 定义蛇对象
其中 body[0]为蛇头,其余都表示蛇身

struct SNAKE {struct BODY body[WIDE * HIGH];    //WIDE和HIGH表示游戏界面的宽和高int size;
}snake;

3. 定义食物对象

struct FOOD {int X;    //表示食物的位置点int Y;
}food;

二、游戏初始化

1. 蛇初始化

void initSnake(void) {snake.size = 2;snake.body[0].X = WIDE / 2;		 //蛇头初始化snake.body[0].Y = HIGH / 2;snake.body[1].X = WIDE / 2 - 1;  //蛇的一节身体初始化snake.body[1].Y = HIGH / 2;return;
}

2. 食物初始化

void initFood(void) {food.X = rand() % WIDE;  food.Y = rand() % HIGH;  return;
}

3. 围墙初始化

//画墙
void initWall(void) {for (size_t i = 0; i <= HIGH; i++){for (size_t j = 0; j <= WIDE; j++){if (j == WIDE)cout << "|";else if (i == HIGH)cout << "_";elsecout << " ";}cout << endl;}
}

4. 界面初始化

void initUI(void) {COORD coord = {0};         //光标移动的位置//画蛇for (size_t i = 0; i < snake.size; i++){coord.X = snake.body[i].X;coord.Y = snake.body[i].Y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);if(i==0)putchar('@');else putchar('*');}//去除蛇尾coord.X = lastX;coord.Y = lastY;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar(' ');//画食物coord.X = food.X;coord.Y = food.Y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar('#');
}

三、逻辑编程

1. 启动游戏

void playGame(void) {char key = 'd';//判断蛇撞墙while (snake.body[0].X >= 0 && snake.body[0].X < WIDE&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH) {initUI();  //更新蛇//接收用户按键输入if (_kbhit()) {     //为真时,说明用户按下按键   _kbhit()不阻塞判断用户输入key = _getch();   //                         _getch()不回显读取一个字符}switch (key) {case 'w':	kx = 0;  ky = -1; break;case 's':	kx = 0;  ky = +1; break;case 'a':	kx = -1; ky = 0;  break;case 'd':	kx = +1; ky = 0;  break;default:	break;}//蛇头撞身体 蛇头==任一一节身体for (size_t i = 1; i < snake.size; i++){if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)return;    //游戏结束}//蛇头撞食物if (snake.body[0].X == food.X && snake.body[0].Y == food.Y) {initFood();     //食物消失		snake.size++;   //身体增长score += 10;    //加分sleepSecond -= 25;//加速}//存储蛇尾坐标lastX = snake.body[snake.size - 1].X;lastY = snake.body[snake.size - 1].Y;//蛇移动,前一节身体给后一节身体赋值for (size_t k = snake.size - 1; k > 0; k--){snake.body[k].X = snake.body[k - 1].X;snake.body[k].Y = snake.body[k - 1].Y;}snake.body[0].X += kx;   //蛇头坐标根据用户按键 修改snake.body[0].Y += ky;Sleep(sleepSecond);}return;
}

2. 打印成绩

void showScore(void) {//将光标默认位置移动至 不干扰游戏的位置COORD coord;coord.X = 0;coord.Y = HIGH + 2;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);cout << "Game Over!!!" << endl;cout << "成绩为:" << score << endl<<endl<<endl;
}

3. main函数

int main(void) {//去除光标CONSOLE_CURSOR_INFO cci;cci.dwSize = sizeof(cci);cci.bVisible = FALSE;  //设置为false则光标不可见SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);srand(time(NULL));  //播种随机数种子initWall();      //画墙initSnake();   //初始化蛇initFood();    //初始化食物initUI();      //画蛇和食物playGame();   //启动游戏showScore();  //打印分数system("pause");return 0;
}

四、细节处理

在该游戏的制作过程中,有以下几个方面的细节处理:

  • 1. 绘画问题
    每绘画蛇和食物图像时,都需要将光标移动到指定地方才能成功绘画。
    COORD 为光标移动处理结果体
COORD coord;
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  • 2. 去除光标闪烁问题
    CONSOLE_CURSOR_INFO 为光标显示处理结构体
CONSOLE_CURSOR_INFO cci;    
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;  //设置为false则光标不可见
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  • 3. 蛇尾隐藏
    蛇每吃掉一块食物,蛇身便会增长一节,急需对蛇尾做隐藏处理
//存储蛇尾坐标
lastX = snake.body[snake.size - 1].X;
lastY = snake.body[snake.size - 1].Y;coord.X = lastX;
coord.Y = lastY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); //移动光标
putchar(' '); //用“ ”覆盖蛇尾
  • 4. 接收用户按键输入
    _kbhit()不阻塞判断用户输入
    _getch()不回显读取一个字符
if (_kbhit()) {     //为真时,说明用户按下按键   key = _getch();                         
}
  • 5. 延迟
    若不对移动时进行Sleep处理,则蛇移动速度飞快,游戏一下就结束了。
Sleep(sleepSecond);

五、程序源码

若需程序源码可留言邮箱至评论区或直接私信 即可。

相关文章:

基于C/C++综合训练 ----- 贪吃蛇

文章目录一、定义结构体对象二、游戏初始化1. 蛇初始化2. 食物初始化3. 围墙初始化4. 界面初始化三、逻辑编程1. 启动游戏2. 打印成绩3. main函数四、细节处理五、程序源码该篇环境为Visual Studio2022 游戏简述 &#xff1a;在控制终端绘画出一个矩阵表示游戏界面(围墙)&…...

Unity 混合操作(Blending)

渲染图形时&#xff0c;在执行所有着色器并应用所有纹理后&#xff0c;像素将写入到屏幕。这些像素与已有像素的组合方式由 Blend 命令控制。用于生成透明对象。《Unity Shader入门精要》大致解释&#xff1a;片元通过了模板测试和深度测试之后&#xff0c;会进行混合步骤。如果…...

Hive建表高阶语句

CTAS -as select方式建表CREATE TABLE ctas_employee as SELECT * FROM employee;CTE (CTAS with Common Table Expression)CREATE TABLE cte_employee AS WITH r1 AS (SELECT name FROM r2 WHERE name Michael), r2 AS (SELECT name FROM employee WHERE gender Male), r3 …...

面向新时代,海泰方圆战略升级!“1465”隆重发布!

过去四年&#xff0c;海泰方圆“1344”战略一直在引领公司前行&#xff0c;搭建了非常坚实的战略框架基座&#xff0c;并推动全员在实践和行动中达成深度共识。 “1344”战略 1个定位&#xff0c;代表着当前机构用户的一组共性需求&#xff0c;密码安全数据治理信创工程。 3…...

带你感受一次JVM调优实战

本文分成两部分&#xff0c;先了解理论&#xff0c;然后再进行实战。 理论篇 1.1 调优目标 JVM调优的两大目标是&#xff1a; 提高应用程序的性能和吞吐量&#xff1a; 通过优化JVM的垃圾回收机制、调整线程池大小和优化代码&#xff0c;可以提高应用程序的性能和吞吐量。…...

ALG和STUN

目录 ALG 应用层网关讲解 Client1使用FTP主动模式建立FTP Client1使用FTP被动模式建立FTP STUN讲解 ALG 应用层网关讲解 用来替换应用层信息 Client1使用FTP主动模式建立FTP 主动模式&#xff1a;服务器收到客户端发来的请求FTP的地址和端口 服务器使用20端口直接向客户端建…...

原生HTML放大镜

该放大区域用背景图片放大 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compat…...

C++——模板

文章目录1 泛型编程2 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的实例化2.3.1 隐式实例化2.3.1.1 定义2.3.1.2 代码演示2.3.1.3 运行结果2.3.1.4 缺点2.3.2 显式实例化2.3.2.1 格式2.3.2.2 代码演示2.3.2.3 运行结果2.4 模板参数的匹配原则2.4.12.4.22.4.33 类模板…...

Chapter2.1:线性表基础

该系列属于计算机基础系列中的《数据结构基础》子系列&#xff0c;参考书《数据结构考研复习指导》(王道论坛 组编)&#xff0c;完整内容请阅读原书。 1.线性表的定义和基本操作 1.1 线性表的定义 线性表是具有相同数据类型的n(n≥0)n(n≥0)n(n≥0)个数据元素的有限序列&…...

Spring源码解析-Spring 循环依赖

Spring源码解析简图&#xff1a; Spring 如何解决循环依赖&#xff0c;⽹上的资料很多&#xff0c;但是感觉写得好的极少&#xff0c;特别是源码解读⽅⾯&#xff0c;我就⾃⼰单独出⼀ 篇&#xff0c;这篇⽂章绝对肝&#xff01; 文章目录&#xff1a; 一. 基础知识 1.1 什么…...

从零开始学架构——架构设计的目的

软件架构的历史背景 软件架构真正流行是从20世纪90年代开始的&#xff0c;由于在Rational和Microsoft内部的相关活动&#xff0c;软件架构的概念开始越来越流行。 卡内基梅隆高校的玛丽肖(Mary Shaw)和戴维加兰 (David Garlan)对软件架构做了许多讨论,他们在 1994 年的一篇文章…...

Python 异步: 异步生成器(16)

动动发财的小手&#xff0c;点个赞吧&#xff01; 生成器是 Python 的基本组成部分。生成器是一个至少有一个“yield”表达式的函数。它们是可以暂停和恢复的函数&#xff0c;就像协程一样。 实际上&#xff0c;Python 协程是 Python 生成器的扩展。Asyncio 允许我们开发异步生…...

.net6 web api使用EF Core,根据model类自动生成表

1.安装EF Core和mysql数据库的nuget包 Microsoft.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2.创建models文件夹&#xff0c;在文件夹下创建实体类 public class Users{public int Id { get; set; }[Column(TypeName "varchar(200)"), Required]publ…...

计算机科学导论笔记(五)

目录 七、操作系统 7.1 引言 7.1.1 操纵系统 7.1.2 自举过程 7.2 演化 7.3 组成部分 7.3.1 用户界面 7.3.2 内存管理器 7.3.3 进程管理器 7.3.4 设备管理器 7.3.5 文件管理器 7.4 操作系统 7.4.1 UNIX 7.4.2 Linux 7.4.3 Windows 七、操作系统 7.1 引言 计算机…...

通过命令打Java可执行jar包

文章目录1.背景2.操作步骤2.1. 准备好java源文件2.2 确认java源文件中是否有包名2.3 编译java文件2.4 初步打包2.5 解压jar包&#xff0c;得到MANIFEST.MF文件2.6 修改MANIFEST.MF文件2.7 再次打包3.验证4.打包参数参考5.参考文章1.背景 今天&#xff0c;无意中翻出了N年之前年…...

java基础系列(九) 接口和抽象类

一. 接口 简单的说&#xff0c;接口就是一种被规范的标准&#xff0c;只要符合这个标准都可以通用&#xff0c;接口的表现 在于对行为的抽象. 1.1 创建接口的格式 格式1: public interface 接口名 格式2: interface 接口名 1.2 在JDK1.8之后, 在接口中可以定义实现的方…...

Docker启动问题docker is starting…

环境window 10 家庭最新版直接上官网安装的 Docker DeskTop问题启动应用后setting打开一直转圈圈&#xff1b;主界面一直显示 docker is starting…解决方案3.1 先确定hyper-v是否开启搜hyper-v&#xff0c;点击启动或关闭Windows功能如下,选中Hyper-V服务3.2 进入任务管理期&a…...

Django/Vue实现在线考试系统-03-开发环境搭建-MySQL安装

1.概述 MySQL是一种关系型数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库…...

python实现波士顿房价预测

波士顿房价预测 目标 这是一个经典的机器学习回归场景&#xff0c;我们利用Python和numpy来实现神经网络。该数据集统计了房价受到13个特征因素的影响&#xff0c;如图1所示。 对于预测问题&#xff0c;可以根据预测输出的类型是连续的实数值&#xff0c;还是离散值&#xff…...

Pinia不酸,保甜

为什么是Pinia 怎么说呢&#xff0c;其实在过往的大部分项目里面&#xff0c;我并没有引入过状态管理相关的库来维护状态。因为大部分的业务项目相对来说比较独立&#xff0c;哪怕自身功能复杂的时候&#xff0c;可能也仅仅是通过技术栈自身的提供的状态管理能力来处理业务场景…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...

Yii2项目自动向GitLab上报Bug

Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...