牛刀小试 - C++实现贪吃蛇

参考文档

借鉴了这位大佬的博客及代码,键入代码后发现有很多报错,依次解决后成功运行

c++ 实现贪吃蛇(含技术难点解析和完整代码)

技术点:
C++中_kbhit()函数与_getch()函数
Windows API 坐标结构 COORD
句柄 HANDLE
获取句柄 GetStdHandle
光标的位置控 SetConsoleCursorPosition制
光标定位函数 gotoxy()与清屏函数clrscr()

报错解决

(1) warning C4244: “参数”: 从“time_t”转换到“unsigned int”,可能丢失数据
原因:一个简单的C的Hello World,如果用高版本的VS来编译,会有这种提示,这个是高版的VS默认不让使用scanf,fopen等函数,说是scanf,fopen等函数不安全,而代替其函数的是scanf_s,fopen_s等函数,后边有个"_s"的形式

解决:想要使用,可以在源文件开头加个:

#define _CRT_SECURE_NO_WARNINGS

预编时处理一下,加个宏而已,让其忽略安全检测
(2) warning C4996: ‘kbhit‘: The POSIX name for this item is deprecated.
原因:暂未得知
解决:将kbhit()改为_kbhit(),将getch()改为_getch()

(3)运行报错:
在这里插入图片描述
原因:变量没有初始化。

在这里插入图片描述
解决:随便赋个初值,注意不能与操作按键的值一致

完整代码


/*********************************************************************
程序名: 贪吃蛇
*********************************************************************/
/*********************************************************************
程序名: 贪吃蛇
*********************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<windows.h>
#include <conio.h>
using namespace std;
#define frame_width 50
#define frame_height 25typedef struct{int x, y;
} Food;
typedef struct{int x[100], y[100], len, state;
} Snake;void gotoxy(int x, int y);  //最重要的一个函数,控制光标的位置
void print_map();
void get_newfood();//生成新食物
bool check_foodinsnake();//检查新食物有没有在蛇身上
void move_snake(); // 移动食物
void check_foodeating();//是否吃到食物
bool check_snakealive();//贪吃蛇是否还存活//需要用到的全局变量
int score;
Snake snake;
Food food;
bool check_eaten;int main()
{system("color 0B");do{printf("1:start\t2:exit\n");char com2;cin >> com2;if (com2 == '2')break;system("cls");score = 0, check_eaten = 0;print_map();//贪吃蛇的每回合运行控制while (1){check_foodeating();//system("pause");move_snake();Sleep(max(50, 300 - score));//控制速度(与长度呈反比)if (!check_snakealive())break;}printf("Game Over!\n");} while (1);
}void gotoxy(int x, int y)
{COORD pos;//COORD是一种自带结构体,表示一个字符在控制台屏幕上的坐标HANDLE han = GetStdHandle(STD_OUTPUT_HANDLE); //从标准输出设备里取出一个句柄pos.X = y, pos.Y = x;SetConsoleCursorPosition(han, pos);//定位光标的函数
}void print_map()
{//打印墙壁for (int i = 0; i<frame_height; i++){gotoxy(i, 0);printf("#");gotoxy(i, frame_width);//因为这个标记是长度,从零开始所以最后要减1printf("#");}for (int i = 0; i<frame_width; i++){gotoxy(0, i);printf("#");gotoxy(frame_height, i);printf("#");}//蛇身初始化snake.len = 3;snake.state = 'w';snake.x[1] = frame_height / 2;snake.y[1] = frame_width / 2;gotoxy(snake.x[1], snake.y[1]);printf("@");for (int i = 2; i <= snake.len; i++){snake.x[i] = snake.x[i - 1] + 1;snake.y[i] = snake.y[i - 1];gotoxy(snake.x[i], snake.y[i]);printf("@");}//打印初始食物get_newfood();//打印右边状态栏gotoxy(2, frame_width + 3);printf("WELCOME TO THE GAME OF RETRO SNAKE");gotoxy(4, frame_width + 3);printf("UP:   w");gotoxy(6, frame_width + 3);printf("DOWN: s");gotoxy(8, frame_width + 3);printf("LEFT: a");gotoxy(10, frame_width + 3);printf("RIGHT:d");gotoxy(12, frame_width + 3);printf("Your score:%d", score);gotoxy(28, frame_width + 3);printf("Made by majin");
}bool check_foodinsnake()
{for (int i = 1; i <= snake.len; i++)if (snake.x[i] == food.x&&snake.y[i] == food.y)return 1;return 0;
}void get_newfood()
{do{srand(time(0));food.x = rand() % (frame_height - 1) + 1;food.y = rand() % (frame_width - 1) + 1;} while (check_foodinsnake());gotoxy(food.x, food.y);cout << "$" << endl;
}void move_snake()
{char com = 'n';while (_kbhit())//键盘有输入com = _getch();//从控制台读取一个字符,但不显示在屏幕上//没有吃到去除蛇尾if (!check_eaten){gotoxy(snake.x[snake.len], snake.y[snake.len]);printf(" ");}//将除蛇头外的其他部分向前移动for (int i = snake.len; i>1; i--)snake.x[i] = snake.x[i - 1],snake.y[i] = snake.y[i - 1];//移动蛇头switch (com){case 'w':{if (snake.state == 's') //如果命令与当前方向相反不起作用snake.x[1]++;elsesnake.x[1]--, snake.state = 'w';break;}case 's':{if (snake.state == 'w')snake.x[1]--;elsesnake.x[1]++, snake.state = 's';break;}case 'a':{if (snake.state == 'd')snake.y[1]++;elsesnake.y[1]--, snake.state = 'a';break;}case 'd':{if (snake.state == 'a')snake.y[1]--;elsesnake.y[1]++, snake.state = 'd';break;}default: //按其余键保持状态前进{if (snake.state == 's')snake.x[1]++;else if (snake.state == 'w')snake.x[1]--;else if (snake.state == 'd')snake.y[1]++;else if (snake.state == 'a')snake.y[1]--;break;}}gotoxy(snake.x[1], snake.y[1]);printf("@");check_eaten = 0;gotoxy(frame_height, 0);
}void check_foodeating()
{if (snake.x[1] == food.x&&snake.y[1] == food.y){score += 10;check_eaten = 1;gotoxy(12, frame_width + 3);printf("Your score:%d", score);snake.len++;get_newfood();}
}bool check_snakealive()
{//检查有没有撞到墙if (snake.x[1] == 0 || snake.x[1] == frame_height - 1 || snake.y[1] == 0 || snake.y[1] == frame_width - 1)//撞墙return 0;//检查有没有吃到自己for (int i = 2; i <= snake.len; i++)if (snake.x[i] == snake.x[1] && snake.y[i] == snake.y[1])return 0;return 1;
}

运行示例

1

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有能力,但是不赚钱,往往是因为没有这三个能力!2024最适合创业的细分行业,2024最适合创业的行业

很多人非常有能力&#xff0c;在学校是学霸&#xff0c;在公司是高管&#xff0c;但是出来自己创业就不行了。觉得是自己的能力不够&#xff0c;其实不是你的能力不够&#xff0c;而是你欠缺下面这三种能力。如果你能掌握这三种能力&#xff0c;就算之前是普通人尝试创业&#…

Hotspot源码解析-第十二章-线程栈保护页

了解保护页&#xff0c;先从几个问题开始吧 1、为什么线程栈有栈帧了&#xff0c;还要有保护页&#xff1f; 答&#xff1a;在操作系统中内存可以看成是一个大数组&#xff0c;这就有一个问题&#xff0c;线程之间可能会互相踩了别人的内存空间&#xff0c;所以栈空间也存在这…

UI自动化测试之Jenkins配置

背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中和…

word中MathType公式编号

直接上效果图&#xff1a; 步骤如下&#xff1a; 安装MathTypeword中安装MathType选项卡。设置MathType选项卡添加分隔符插入公式&#xff0c;自动生成右编码 接下来介绍每一步。 文章目录 1. 安装MathType2. Word中安装MathType选项卡3. 配置MathType选项4. 添加分隔符5. 插…

Halcon阈值处理的几种分割方法threshold/auto_threshold/binary_threshold/dyn_threshold

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

在宝塔Linux中安装Docker

前言 帮助使用宝塔的用户快速上手docke的安装 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Docker》。&#x1f3af;&#x1f3af…

图片上的水印怎么添加?简单易上手的3个方法

图片上的水印怎么添加&#xff1f;水印是一种透明的文字或图像叠加在原始图片上的技术。它能够涵盖版权信息、公司商标、作者名字或其他个人标识。很多人会通过添加水印的方法&#xff0c;来确保图片在分享或者是公开使用的时候&#xff0c;依然能够保留对自己原创内容的控制和…

【python入门】day19:学生管理系统需求分析、系统设计、主函数设计

需求分析 应具备功能—— 添加学生及成绩信息&#xff1b; 将学生信息保存到文件中&#xff1b; 修改和删除学生信息&#xff1b; 查询学生信息&#xff1b; 根据学生成绩进行排序&#xff1b; 统计学生的总分 系统设计 1.录入学生信息模块 2.查找 3.删除 4.修改 5.成绩排名…

Django 6 后台与便签

1. 什么是后台管理 后台管理是网页管理员利用网页的后台程序管理和更新网站上网页的内容。各网站里网页内容更新就是通过网站管理员通过后台管理更新的。 2. 创建超级用户 1. python .\manage.py createsuperuser 2. 输入账号密码等信息 Username (leave blank to use syl…

Springboot整合RocketMQ 基本消息处理

目录 1. 同步消息 2. 异步消息 3. 单向消息 4. 延迟消息 5. 批量消息 6. 顺序消息 7. Tag过滤 导入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId></dependency> …

目标检测-One Stage-SSD

文章目录 前言一、SSD的网络结构和流程二、SSD的创新点总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 每个格子针对目标框的回归是不加限制的&#xff0c;导致目标的定位并不是很精准和Faster RCNN等先进Two Stage算法相比&#xff0c…

2020年认证杯SPSSPRO杯数学建模C题(第一阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…

打工人的2.0时代,只需要一副AR眼镜!

在数字化时代&#xff0c;工业行业中的生产效率如何得到提升&#xff1f;工业AR眼镜或许是一个不错的选择。不过工业AR眼镜真的可以协助员工处理工作中所遇到的各种问题吗&#xff1f;我们以制造业、医疗行业、船舶业的不同从业者为例&#xff1a; 假如你是一名制造业从业者&am…

Linux第4步_安装VMwareTools

安装Ubuntu操作系统后&#xff0c;就可以安装VMwareTools了&#xff0c;目的是实现“电脑和虚拟机之间互相复制粘贴文件”。 1、双击桌面图标“VMware Workstation Pro”&#xff0c;然后点击下图中的“开机”&#xff0c;打开虚拟机电源。 2、双击下图中的用户名“zgq” 3、…

解决npm,pnpm,yarn等安装electron超时等问题

我在安装electron的时候&#xff0c;出现了超时等等各种问题&#xff1a; &#xff08;RequestError: connect ETIMEDOUT 20.205.243.166:443&#xff09; npm yarn&#xff1a;Request Error: connect ETIMEDOUT 20.205.243.166:443 RequestError: socket hang up npm ER…

Kafka集群详解

Kafka介绍Kafka集群介绍Kafka集群特点Kafka集群搭建在这里插入图片描述Kafka集群如何进行故障切换Kafka集群Leader的选举Kafka集群如何快速横向拓展Kafka集群搭建最佳实践Kafka集群可以使用单节点Zookeeper吗Kafka集群的消费者信息保存在那里Kafka集群的Topic的分区数的设置规则…

LeetCode(36)有效的数独 ⭐⭐

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

(Java基础知识综合)

进制转换&#xff1a; 其他转10 10转其他 2进制8和16 8和16转2 位运算&#xff1a; >> 除于2 <<乘以2 近似值 空心金字塔 this关键字还可以用于访问父类中的属性和方法

Java的内部类

Java的内部类 1. 什么是内部类?2. 内部类的分类2.1 成员式内部类2.1.1 成员内部类&#xff08;Member Inner Class&#xff09;2.1.2 静态内部类&#xff08;Static Nested Class&#xff09; 2.2 局部式内部类2.2.1 局部内部类&#xff08;Local Inner Class&#xff09;2.2.…

计算机网络期末复习

计算机网络复习 1.第一章 1.2.2计算机啊网络的分类(认识) 按网络的覆盖范围进行分类&#xff1a; 局域网城域网广域网个人区域网 按网络的使用者进行分类&#xff1a; 公用网专用网 1.3互联网的组成(掌握) 从功能上可以划分为以下两大部分&#xff1a; 边缘部分&#x…