使用SDL库以及C++实现的简单的贪吃蛇:AI Fitten生成
简单使用AI代码生成器做了一个贪吃蛇游戏
设计的基本逻辑都是正确的,能流畅运行
免费+准确率高,非常不错!支持Visual Studio系列
Fitten:https://codewebchat.fittenlab.cn/
SDL 入门指南:安装配置https://blog.csdn.net/qq_72157449/article/details/130490332
SDL库:https://github.com/libsdl-org/SDL/releases/tag/release-2.30.5
SDL-ttf库(未用到):https://github.com/libsdl-org/SDL_ttf/releases

只需要i包含nclude文件,以及库目录lib文件进行编译
运行程序需要dll文件,可将该文件放到执行程序同一个目录下
或将dll文件夹添加到系统变量中

窗口乱码,以及添加链接库目录
//设置字体编码为 UTF - 8,避免乱码
//设置编译器在执行时使用的字符集为UTF-8
#pragma execution_character_set("utf-8")//告诉编译器在链接阶段需要链接 SDL2 库
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")#include <SDL.h>
游戏界面
源代码
//设置字体编码为 UTF - 8,避免乱码
//设置编译器在执行时使用的字符集为UTF-8
#pragma execution_character_set("utf-8")//告诉编译器在链接阶段需要链接 SDL2 库
#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")#include <SDL.h>
#include <iostream>
#include <vector>//设置屏幕分辨率和网格大小。
//屏幕分辨率为 800x600,网格大小为 20x20。
//屏幕的网格大小决定了游戏的难度,越大则游戏越难。
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int GRID_SIZE = 10;
const int GRID_WIDTH = SCREEN_WIDTH / GRID_SIZE;
const int GRID_HEIGHT = SCREEN_HEIGHT / GRID_SIZE;
//帧率为 10,即每秒 10 帧,用于控制蛇的速度
const int frame_rate = 10;
const int frame_delay = 1000 / frame_rate;//定义一个 Point 结构体,用于表示一个点的坐标。
struct Point {int x, y;bool operator==(const Point &other) const {return x == other.x && y == other.y;}
};//游戏主函数。
//初始化 SDL,创建窗口和渲染器,创建蛇和食物,并开始游戏循环。
//游戏循环中,不断检查是否有事件发生,并根据事件更新蛇的移动方向。
//渲染蛇和食物,并刷新渲染器,并计算帧时间,如果超过了帧率,则延迟。
//游戏结束时,退出游戏循环。
//退出程序。
int main(int argc, char *argv[]) {//初始化 SDL。if (SDL_Init(SDL_INIT_VIDEO) < 0) {std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;return 1;}//创建窗口。SDL_Window *window = SDL_CreateWindow("贪吃蛇游戏", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);if (window == nullptr) {std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;SDL_Quit();return 1;}//创建渲染器。SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);if (renderer == nullptr) {std::cerr << "Renderer could not be created! SDL_Error: " << SDL_GetError() << std::endl;SDL_DestroyWindow(window);SDL_Quit();return 1;}//创建蛇和食物。std::vector<Point> snake = { {GRID_WIDTH / 2, GRID_HEIGHT / 2} };Point direction = { 0, 1 };Point food = { std::rand() % GRID_WIDTH, std::rand() % GRID_HEIGHT };bool game_over = false;SDL_Event e;bool running = true;Uint32 frame_start;int frame_time;while (running) {//获取当前时间(以毫秒为单位),用于计算帧时间。frame_start = SDL_GetTicks();//不断检查是否有事件发生。SDL_PollEvent 函数会从事件队列中获取一个事件,并将其存储在 e 变量中。如果有事件,循环会继续处理;如果没有事件,循环会退出。while (SDL_PollEvent(&e)) {//SDL_QUIT(通常是用户关闭窗口),则将 running 设置为 false,这将导致外层循环退出。//SDL_KEYDOWN(键盘按下事件),则根据按下的键来更新蛇的移动方向。if (e.type == SDL_QUIT) {running = false;} else if (e.type == SDL_KEYDOWN) {//按下上、下、左、右方向键时,更新蛇的移动方向。//如果按下其他键,则忽略。switch (e.key.keysym.sym) {//如果当前方向不是向下(direction.y != 1),则将方向设置为向上({ 0, -1 })。case SDLK_UP: if (direction.y != 1) direction = { 0, -1 }; break;//如果当前方向不是向上(direction.y != -1),则将方向设置为向下({ 0, 1 })。case SDLK_DOWN: if (direction.y != -1) direction = { 0, 1 }; break;//如果当前方向不是向左(direction.x != 1),则将方向设置为向右({ 1, 0 })。case SDLK_LEFT: if (direction.x != 1) direction = { -1, 0 }; break;//如果当前方向不是向右(direction.x != -1),则将方向设置为向左({ -1, 0 })。case SDLK_RIGHT: if (direction.x != -1) direction = { 1, 0 }; break;}}}//如果游戏结束,则退出循环。if (!game_over) {//移动蛇头。Point head = snake.front();Point new_head = { head.x + direction.x, head.y + direction.y };//如果蛇头移动到边界或与身体重合,则游戏结束。if (new_head.x < 0 || new_head.x >= GRID_WIDTH || new_head.y < 0 || new_head.y >= GRID_HEIGHT) {game_over = true;} else if (std::find(snake.begin(), snake.end(), new_head) != snake.end()) {game_over = true;} else {//如果蛇头没有与身体重合,则将蛇头插入到蛇的头部,并更新蛇的长度。snake.insert(snake.begin(), new_head);//如果蛇吃到了食物,则生成新的食物,否则删除最后一个蛇身体。if (new_head == food) {food = { std::rand() % GRID_WIDTH, std::rand() % GRID_HEIGHT };//如果食物跟蛇重叠,则重新生成食物。while (std::find(snake.begin(), snake.end(), food) != snake.end()) {food = { std::rand() % GRID_WIDTH, std::rand() % GRID_HEIGHT };}} else {snake.pop_back();}}}//设置渲染器的颜色为黑色。SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);//清除屏幕,并将背景设置为黑色。SDL_RenderClear(renderer);//设置蛇的颜色为绿色。SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);//绘制蛇身体。for (const auto &segment : snake) {SDL_Rect rect = { segment.x * GRID_SIZE, segment.y * GRID_SIZE, GRID_SIZE, GRID_SIZE };//绘制矩形,参数为指向 SDL_Rect 结构体的指针。SDL_RenderFillRect(renderer, &rect);}//设置食物的颜色为红色,并绘制食物。SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);SDL_Rect food_rect = { food.x * GRID_SIZE, food.y * GRID_SIZE, GRID_SIZE, GRID_SIZE };SDL_RenderFillRect(renderer, &food_rect);//将渲染器缓冲区中的内容刷新到屏幕上,从而使之前通过 SDL_RenderClear、SDL_RenderDrawRect、SDL_RenderFillRect 等函数绘制的图形和颜色显示出来。SDL_RenderPresent(renderer);//计算帧时间,如果超过了帧率,则延迟。frame_time = SDL_GetTicks() - frame_start;if (frame_delay > frame_time) {SDL_Delay(frame_delay - frame_time);}}//自动弹出游戏结束窗口SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "游戏结束", "游戏结束!", window);//退出游戏循环。SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();return 0;
}
相关文章:
使用SDL库以及C++实现的简单的贪吃蛇:AI Fitten生成
简单使用AI代码生成器做了一个贪吃蛇游戏 设计的基本逻辑都是正确的,能流畅运行 免费准确率高,非常不错!支持Visual Studio系列 Fitten:https://codewebchat.fittenlab.cn/ SDL 入门指南:安装配置https://blog.csdn.n…...
【C++标准库】模拟实现string类
模拟实现string类 一.命名空间与类成员变量二.构造函数1.无参(默认)构造2.有参构造3.兼容无参和有参构造4.拷贝构造1.传统写法2.现代写法 三.析构函数四.string类对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 五.string类对象的访问及…...
ArcGIS for js 标记(vue代码)
一、引入依赖 import Graphic from "arcgis/core/Graphic"; import GraphicsLayer from "arcgis/core/layers/GraphicsLayer"; import Color from "arcgis/core/Color"; import TextSymbol from "arcgis/core/symbols/TextSymbol.js"…...
全网最全最新100道C++面试题:40-60
前述:本文初衷是为了总结本人在各大平台看到的C面经,我会在本文持续更新我所遇到的一些C面试问题,如有错误请一定指正我。新建立了一个收集问答的仓库,欢迎各位小伙伴来更新鸭interview_experience: 本仓库初衷是想为大家提供一个…...
RAG+内容推荐,应该如何实践?
最近业务有需求:结合RAG内容推荐,针对实践部分,做一点探究。 话不多说,直接开冲! 背景 首先回顾一下 RAG 技术定义,它可以结合信息检索和生成模型的混合。简单来说,RAG 预训练的语言模型 信…...
SFTTrainer loss多少合适
在机器学习和深度学习中,“loss”(损失函数)的合理值并没有一个固定的标准,因为它依赖于多种因素,包括模型的类型、任务的性质、数据的规模和特性等。然而,我们可以从一些通用的原则和经验值来讨论损失函数…...
HTTP协议详解(一)
协议 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。 一、HTTP 协议介绍 HTTP(Hyper Text Transfer Protocol): 全…...
RK3568平台(触摸篇)串口触摸屏
一.什么是串口屏 串口屏,可组态方式二次开发的智能串口控制显示屏,是指带有串口通信的TFT彩色液晶屏显示控制模组。利用显示屏显示相关数据,通过触摸屏、按键、鼠标等输入单元写入参数或者输入操作指令,进而实现用户与机器进行信…...
MySQL数据库-事务
一、什么是事务 1.概念 事务(Transaction):一个最小的不可再分的工作单元,一个事务对应一个完整的业务,一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成,事务只针对DML语句。 数据…...
qt事件类型列表
t提供了一系列丰富的事件类型,这些事件允许应用程序响应各种用户输入、系统通知以及其他类型的交互。以下是一些常见的Qt事件类型及其用途概述: QEvent::None (0): 无事件,用于初始化或作为默认值。 QEvent::Timer (1): 定时器事件ÿ…...
ElasticSearch父子索引实战
关于父子索引 ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的. 父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有…...
二百四十九、Linux——在Linux中创建新用户、赋予新用户root权限并对文件夹赋予新用户的权限
一、目的 安装国产化数据库OceanBase的时候,需要创建新用户、赋予新用户root权限并对文件夹赋予新用户的权限 二、创建新用户 #创建账户 oceanadmin [roothurys22 ~]#useradd -U oceanadmin -d /home/oceanadmin -s /bin/bash [roothurys22 ~]#mkdir -p /home/oc…...
com.mysql.cj.jdbc.Driver 爆红
出现这样的问题就是pom.xml文件中没有添加数据库依赖坐标 添加上这个依赖即可,添加完后重新加载一下Maven即可。 如果感觉对你有用就点个赞!!!...
传神论文中心|第19期人工智能领域论文推荐
在人工智能领域的快速发展中,我们不断看到令人振奋的技术进步和创新。近期,开放传神(OpenCSG)社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…...
案例分享-国外轻松感UI设计赏析
国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式,减少用户的认知负担,从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息,降低操作难度,提升整体满意度。 在注重美观的同时,更加重视用户…...
操作系统(4)——文件系统
目录 小程一言文件系统管理基础概念&功能基本概念文件的结构和属性文件的操作文件的安全性和权限控制文件系统的实现和分配方式 问题&解答1、文件系统在操作系统中起到什么作用?2、文件的逻辑结构和物理结构有何区别?3、如何理解文件权限控制在操…...
C# 调用Webservice接口接受数据测试
1.http://t.csdnimg.cn/96m2g 此链接提供测试代码; 2.http://t.csdnimg.cn/64iCC 此链接提供测试接口; 关于Webservice的基础部分不做赘述,下面贴上我的测试代码(属于动态调用Webservice): 1ÿ…...
工作流流程引擎框架推荐来了
近期有不少粉丝客户朋友都在询问工作流流程引擎框架推荐。随着行业竞争激烈化,实现流程化办公已经成为当务之急。低代码技术平台及工作流流程引擎拥有够灵活、更可靠、可视化界面等诸多个优势特点,在推动企业实现数字化转型的过程中深受行业信赖与喜爱。…...
从技术博客到个人 IP 矩阵:全面攻略与实战示例
文章目录 摘要引言创建博客选择平台设计和布局 内容规划明确目标受众设定内容方向制定发布计划 SEO 优化关键词研究内链和外链元标签优化 社交媒体推广选择社交平台制定推广策略 可运行的 Demo 代码模块QA 环节问:如何增加博客的曝光度?问:如…...
SOFAJRaft 简介
SOFAJRaft 简介 SOFAJRaft是一个基于Raft一致性算法的生产级高性能Java实现,由蚂蚁金服自主研发。以下是关于SOFAJRaft的详细介绍: 来源与背景: SOFAJRaft是从百度的braft移植而来,并在其基础上进行了一系列的优化和改进。它作为…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
