使用SDL库以及C++实现的简单的贪吃蛇:AI Fitten生成

news2024/11/15 18:19:29

简单使用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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效数据抓取:Scrapy框架详解

一、Scrapy框架简介 Scrapy是一个为了爬取网站数据、提取结构性数据而编写的爬虫框架。它支持异步处理&#xff0c;能够快速抓取大量网页&#xff0c;并且易于扩展。Scrapy使用Twisted这个事件驱动的网络引擎&#xff0c;可以处理大量的并发请求&#xff0c;从而提高数据抓取的…

C语言分支结构作业

作业 输入你的身高和体重&#xff0c;测试你的健康状况。 计算bmi的值&#xff0c; bmi &#xff08;体重/身高的平方) 如果bmi 小于18.5&#xff0c;则显示“偏瘦&#xff0c;注意加强营养” 如果bmi 在18.5和23.9之间&#xff0c;则显示“体重指数良好&#xff0c;注意保持…

【全栈实战】大模型自学:从入门到实战打怪升级,20W字总结(二)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本栏讲解【全栈实战】大模型自学&#xff1a;从入门到实战打怪升级。 &#x1f514;专栏持续更新&#xff0c;适合人群&#xff1a;本科生、研究生、大模型爱好者&#xff0c;期…

基于单片机的电梯控制系统的设计

摘 要: 本文提出了一种基于单片机的电梯控制系统设计 。 设计以单片机为核心&#xff0c;通过使用和设计新型先进的硬件和控制程序来模拟和控制整个电梯的运行&#xff0c;在使用过程中具有成本低廉、 维护方便、 运行稳定 、 易于操作 、 安全系数高等优点 。 主要设计思路是…

聚焦全局应用可用性的提升策略,详解GLSB是什么

伴随互联网的快速发展和全球化趋势的深入&#xff0c;企业对网络应用的需求日渐增长。为满足全球范围内用户大量的访问需求&#xff0c;同时解决容灾、用户就近访问以及全球应用交付等问题&#xff0c;GLSB&#xff08;全局负载均衡&#xff09;也因此应运而生。那么GLSB是什么…

Axure RP:打造动态交互的大屏可视化设计利器

Axure大屏可视化是指使用Axure RP这款原型设计工具来创建具有视觉冲击力和数据展示功能的大屏幕界面。Axure以其强大的交互设计和丰富的组件库&#xff0c;成为了实现大屏可视化的重要工具之一。以下是对Axure大屏可视化的详细阐述&#xff1a; 一、Axure在大屏可视化中的优势 …

​易能医药董事长易跃能博士荣获“湖湘药学领航奖”

近日&#xff0c;湖南省药学会主办的“湖南省药学会70周年庆典暨第六届湖南药学大会”在湖南长沙隆重召开。易能医药董事长易跃能博士荣获由湖南省药学会颁发的“湖湘药学领航奖”。此次“湖湘药学领航奖”由湖南药学大会学术委员会组织评选&#xff0c;湖南省全省仅有八个名额…

六、3 PWM 舵机代码

目录 1、通道选择 2、参数计算 3、代码部分 1、通道选择 PA1对应通道2 注意&#xff1a;同一个定时器不同通道输出PWM的特点 同一个定时器的不同通道输出的PWM&#xff0c;频率相同&#xff08;因为它们共用一个计数器&#xff09;&#xff0c;占空比可以各自设定&#xff…

Kubernetes 学习记录

https://note.youdao.com/ynoteshare/index.html?idbc7bee305611b52d6900ba209a92bd4d&typenote&_time1694072007342 概览 K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“…

ITSS:IT服务工程师

证书亮点&#xff1a;适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价&#xff1a;性价比良好&#xff01; 证书名称&#xff1a;ITSS服务工程师 证书有效期&#xff1a;持续3年 培训要求&#xff1a;必须参加培训&#xff0c;否则将无法参与考试 发…

Aboboo一些操作

常用快捷键⌨ 快捷键/操作方式 功能 鼠标中键/Esc 进入/退出全屏 空格/Tab 暂停/恢复播放 左/右箭头 快退/快进 Ctrl-左/右箭头 30秒快退/快进 Alt-左/右箭头 60秒快退/快进 Ctrl-Alt-左/右箭头 播放速率调节 PageUp/PageDown 上一句/下一句 上下箭头/滚轮 …

WSL配置镜像网络使用本地端口调试Linux程序

一、安装WSL 二、配置WSL为镜像 在C:\Users\XXUser目录下添加.wslconfig文件 [wsl2] networkingModemirrored # 开启镜像网络 dnsTunnelingtrue # 开启 DNS Tunneling firewalltrue # 开启 Windows 防火墙 autoProxytrue # 开启自动同步代理重启WSL wsl --shutdown wsl三、…

计算机毕业设计选题推荐-音乐播放系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

计算机网络04

文章目录 IP 基本认识**IP 地址的基础知识****IP 地址的分类**无分类地址 CIDR公有 IP 地址与私有 IP 地址IP 地址与路由控制IP 分片与重组IPv6 基本认识IPv4 首部与 IPv6 首部 IP 协议相关技术DNS 域名解析ARP 与 RARP 协议DHCP 动态获取 IP 地址NAT 网络地址转换ICMP 互联网控…

NACOS保姆笔记(5)——Nacos的集群教程

前面我们介绍过: NACOS保姆笔记(1)——NACOS的安装和启动NACOS保姆笔记(2)——Spring Cloud Alibaba Nacos服务注册与发现以及负载均衡NACOS保姆笔记(3)——Spring Cloud Alibaba Nacos配置中心NACOS保姆笔记(4)——Spring Cloud Alibaba Nacos鉴权本篇主要介绍下Na…

5种IO模型简述

文章目录 前言什么是IO模型&#xff1f;阻塞IO非阻塞IO多路复用IO信号驱动IO异步IO 结语 前言 最近学netty&#xff0c;当然无法避免IO模型这部分知识。 我尽量用最简洁的语言来讲清楚这个东西。 什么是IO模型&#xff1f; 既然最近学netty&#xff0c;就拿它来举例子。 比如…

ITPUB专访 | 张宏波:一场关于编程语言速度与效率的深度对话

ITPUB专访 | 张宏波&#xff1a;一场关于编程语言速度与效率的深度对 随着 AI 大语言模型&#xff08;LLM&#xff09;不断突破和开源社区活跃程度达到前所未有的高度&#xff0c;以 OpenAI 的 GPT-4、Meta-LLaMA 等为代表的重量级产品和服务相继发布&#xff0c;AI 技术的蓬勃…

视频VIP收费会员播放帝国CMS模板HTML5自适应手机多种运营模式

采用帝国CMS最新版核心制作&#xff0c;自适应响应式手机平板浏览&#xff0c;手机浏览器非常舒服哦&#xff01;多种运营模式。用户中心逻辑和页面&#xff0c;都已经制作完整&#xff0c;可以搭建后稍微修改即可使用&#xff01; 模板特点&#xff1a; 支持多集和单集播放&…

【2024】Datawhale AI夏令营 Task2笔记——Baseline代码详细解读

【2024】Datawhale AI夏令营 Task2笔记——Baseline代码详细解读 本文对可完成赛事“逻辑推理赛道&#xff1a;复杂推理能力评估”初赛的baseline代码进行详细解读&#xff0c;该baseline代码由Datawhale AI夏令营提供&#xff0c;核心内容是调用灵积模型服务平台的大语言模型…

大众点评采集店铺全部推荐菜的全部信息

大众点评餐饮店铺的推荐菜是个好东西&#xff0c;蕴含的信息很丰富&#xff0c;可以用作店铺运营分析参考。 指定大众点评店铺&#xff0c;可以采集该店铺的全部推荐菜的全部信息&#xff0c;包括推荐菜的名字、价格、最近三个月推荐次数、推荐菜的评价、推荐菜的标签、菜品所…