当前位置: 首页 > 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;可能也仅仅是通过技术栈自身的提供的状态管理能力来处理业务场景…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...