使用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移植而来,并在其基础上进行了一系列的优化和改进。它作为…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
LeetCode 0386.字典序排数:细心总结条件
【LetMeFly】386.字典序排数:细心总结条件 力扣题目链接:https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...
