贪吃蛇(C++)

2023-05-16

一、项目思路

该项目用于计算机软件课设。贪吃蛇要解决的问题有:蛇身的移动,事物的随机生成,蛇头与食物重合,蛇吃食物身体的变长。蛇身移动的处理可以改变蛇首元素(蛇身用数组存储)的坐标,剩下的依次前移即可。蛇身的变长只需尾部添上一个数组元素即可。

二、源代码

#include<graphics.h>
#include<Windows.h>
#include<conio.h>
#include<ctime>
#include<vector>
#include<cstdlib>
using namespace std;
class Snake
{
public:
    Snake();
    bool check();//检测生成的食物是否和蛇重合了
    void SnakeMove();
    void startup();
    void clean();
    void show();
    void UpdateWithoutInput();
    void UpdateWithInput();
    void gameover();
private:
    int High;
    int Width;
    int Background;
    int dir;//方向
    int score;
    int speed;//画面更新速度,动态难度
    int food_x, food_y;
    vector<int> snake_x, snake_y; //蛇的每一节的坐标
};
Snake::Snake()
{
    High = 720;
    Width = 1280;
    Background = LIGHTGRAY;//easyx的颜色宏
    dir = 5;//方向参考1235键位,类似wasd
    score = 0;
    speed = 300;
    food_x = rand() % (Width - 40) + 21; //限定食物出现在屏幕范围内
    food_y = rand() % (High - 40) + 21;
    snake_x.resize(4), snake_y.resize(4);//蛇的初始长度为4
}
bool Snake::check()
{
    for (int i = 0; i < snake_x.size(); i++)
    {
        if ((food_x >= snake_x[i] - 40 && food_x <= snake_x[i] + 40) &&
            (food_y >= snake_y[i] - 40 && food_y <= snake_y[i] + 40))
            return false;
    }
    return true;
}
void Snake::SnakeMove()
{
    srand((unsigned int)(time)(NULL));
    //如果蛇头的坐标和食物的坐标有一定程度的重合,那么在蛇尾增加新的坐标
    if (food_x >= snake_x[0] - 20 &&
        food_x <= snake_x[0] + 20 &&
        food_y >= snake_y[0] - 20 &&
        food_y <= snake_y[0] + 20)
    {
        if (dir == 1)
        {
            snake_x.push_back(snake_x[snake_x.size() - 1] + 40);
            snake_y.push_back(snake_y[snake_y.size() - 1]);
        }
        else if (dir == 2)
        {
            snake_x.push_back(snake_x[snake_x.size() - 1]);
            snake_y.push_back(snake_y[snake_y.size() - 1] - 40);
        }
        else if (dir == 3)
        {
            snake_x.push_back(snake_x[snake_x.size() - 1] - 40);
            snake_y.push_back(snake_y[snake_y.size() - 1]);
        }
        else if (dir == 5)
        {
            snake_x.push_back(snake_x[snake_x.size() - 1]);
            snake_y.push_back(snake_y[snake_y.size() - 1] + 40);
        }

        score++;//加分
        if (speed >= 150) //调整速度
        {
            speed -= 5 * score;
        }
        //擦除旧食物,更新食物的坐标
        setlinecolor(Background);
        setfillcolor(Background);
        fillcircle(food_x, food_y, 20);
        food_x = rand() % (Width - 40) + 21;
        food_y = rand() % (High - 40) + 21;
        //如果生成的食物坐标和蛇重合了,再更新食物的坐标,check是检测是否重合的函数。
        while (!check())
        {
            food_x = rand() % (Width - 40) + 21;
            food_y = rand() % (High - 40) + 21;
        }
    }
    //蛇移动,通过从后往前迭代更新坐标,形成移动
    for (int i = snake_x.size() - 1; i > 0; i--)
    {
        snake_x[i] = snake_x[i - 1];
        snake_y[i] = snake_y[i - 1];
    }
    //头节点根据方向特殊处理
    if (dir == 1)
    {
        snake_x[0] = snake_x[1] - 40;
        snake_y[0] = snake_y[1];
    }
    else if (dir == 2)
    {
        snake_x[0] = snake_x[1];
        snake_y[0] = snake_y[1] + 40;
    }
    else if (dir == 3)
    {
        snake_x[0] = snake_x[1] + 40;
        snake_y[0] = snake_y[1];
    }
    else if (dir == 5)
    {
        snake_x[0] = snake_x[1];
        snake_y[0] = snake_y[1] - 40;
    }
    //检测是否撞墙或者咬到自己了
    for (unsigned i = 1; i < snake_x.size(); i++)
    {
        if ((snake_x[0] >= snake_x[i] - 20 &&
            snake_x[0] <= snake_x[i] + 20 &&
            snake_y[0] >= snake_y[i] - 20 &&
            snake_y[0] <= snake_y[i] + 20) ||
            ((snake_x[0] - 20 <= 0) ||
                (snake_x[0] + 20 >= 1280) ||
                (snake_y[0] - 20 <= 0) ||
                (snake_y[0] + 20 >= 720)))
        {//停留三秒退出游戏
            Sleep(3000);
            exit(0);
        }
    }
}
void Snake::startup()
{
    srand((unsigned int)(time)(NULL));
    initgraph(Width, High);
    setbkcolor(Background);
    cleardevice();
    for (int i = 0; i < 4; i++)
    {
        snake_x[i] = Width / 2 - 40 * i;
        snake_y[i] = High / 2;
    }
    BeginBatchDraw();
}
void Snake::clean()
{
    setlinecolor(Background);//设置线的颜色
    setfillcolor(Background);//设置填充色
    for (unsigned i = 0; i < snake_x.size(); i++)
    {
        fillcircle(snake_x[i], snake_y[i], 20);//画圆
    }
}
void Snake::show()
{
    for (unsigned i = 0; i < snake_x.size(); i++)
    {
        if (i == 0)
        {
            setfillcolor(LIGHTMAGENTA);
            fillcircle(snake_x[i], snake_y[i], 20);
        }
        else
        {
            setfillcolor(LIGHTRED);
            fillcircle(snake_x[i], snake_y[i], 20);
        }
    }

    FlushBatchDraw();//与BeginBatchDraw配合使用
    setfillcolor(YELLOW);
    //以下均为字体设置与字体显示,用于显示分数
    TCHAR s[5];
    fillcircle(food_x, food_y, 20);
    settextstyle(60, 0, _T("宋体"));
    settextcolor(RGB(25, 32, 94));
    _stprintf_s(s, 5, _T("%d"), score);
    outtextxy(430, 620, _T("Score:"));
    outtextxy(640, 620, s);

    Sleep(speed);//用sleep控制速度,speed越小蛇动的越快
}
void Snake::UpdateWithoutInput()
{
    SnakeMove();
}
void Snake::UpdateWithInput()
{
    char input;
    if (_kbhit())
    {
        input = _getch();
        if ((input == 'a' || input == '1') && dir != 3)
        {
            dir = 1;
            SnakeMove();
        }
        else if ((input == 's' || input == '2') && dir != 5)
        {
            dir = 2;
            SnakeMove();
        }
        else if ((input == 'w' || input == '5') && dir != 2)
        {
            dir = 5;
            SnakeMove();
        }
        else if ((input == 'd' || input == '3') && dir != 1)
        {
            dir = 3;
            SnakeMove();
        }
        if (input == 27)
        {
            input = 'n';
            while (1)
            {
                input = _getch();
                if (input == 27)
                    break;
            }
        }
    }
}
void Snake::gameover()
{
    EndBatchDraw();
    closegraph();
}

int main()
{
    Snake my_snake;
    my_snake.startup();
    while (1)
    {
        my_snake.clean();
        my_snake.UpdateWithoutInput();
        my_snake.UpdateWithInput();
        my_snake.show();
    }
    my_snake.gameover();
    return 0;
}

三、项目总结

该项目较为简单,无复杂算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贪吃蛇(C++) 的相关文章

  • 动态网页的信息爬取

    一 Selenium介绍 Selenium是一系列基于Web的自动化工具 xff0c 提供一套测试函数 xff0c 用于支持Web自动化测试 函数非常灵活 xff0c 能够完成界面元素定位 窗口跳转 结果比较 具有如下特点 xff1a 1
  • 数字电路基础与Quartus-II入门

    一 安装Quartus II软件和Modsim仿真软件 1 安装Quartus 打开exe安装文件 一路默认next下去 xff0c 安装地址不要有中文空格路径 xff0c 最后弹出的对话框选择ok 2 破解Quartus 下载好破解器把文
  • FPGA基于DE2-115平台的VGA显示

    一 VGA简介 VGA xff08 Video Graphics Array xff09 视频图形阵列是IBM于1987年提出的一个使用模拟信号的电脑显示标准 VGA接口即电脑采用VGA标准输出数据的专用接口 VGA接口共有15针 xff0
  • 树莓派assert初步使用练习

    一 创建用户 用户密码 sudo useradd m 用户名 sudo passwd 用户名 给予用户sudo权限 切换到root用户 su 编辑配置文件 vi etc sudoers 增加配置 xff08 按i开始编辑 xff0c Esc
  • 计算机网络/谢希仁(第八版)第四章习题

    4 01 网络层向上提供的服务有哪两种 xff1f 试比较其优缺点 答 xff1a xff08 1 xff09 面向连接服务 xff08 或虚电路服务 xff09 和无连接服务 xff08 或数据报服务 xff09 xff08 2 xff0
  • Nginx正向代理任何域名的实现

    正向代理是一种代理方式 xff0c 在代理服务器和客户端之间建立连接 xff0c 并代表客户端向目标服务器发起请求 在正向代理模式下 xff0c 目标服务器并不知道请求来自代理服务器 xff0c 而是以为请求来自客户端 要在nginx中实现
  • MySQL设置允许远程连接与用户(Linux系统)

    要允许MySQL远程连接 xff0c 需要进行以下步骤 xff1a 修改MySQL配置文件 在Ubuntu上 xff0c MySQL的配置文件通常位于 etc mysql mysql conf d mysqld cnf或 etc mysql
  • 用Swift开发一个简单的iOS备忘录列表应用程序

    iOS提供了许多在应用程序里面可以调用的框架 xff0c 下面列举一些 xff1a 1 UIKit框架 xff1a 用于iOS用户界面设计 xff0c 包括按钮 标签 文本框 表格等控件 2 Foundation框架 xff1a 包含了iO
  • 【MATLAB】SIMULINK 基本模块的使用

    以下是使用SIMULINK构建基本通信系统模型的步骤 xff1a 1 打开MATLAB xff0c 点击SIMULINK图标 xff0c 创建一个空模型 2 从库浏览器中拖拽 信号发生器 Signal Generator 模块和 示波器 S
  • 【MATLAB】构建 SIMULINK 子系统和模块的封装

    构建SIMULINK的子系统可以使用自建模块进行封装 xff0c 帮助文档编写 xff0c 并掌握模型空间与MATLAB命名空间的交互 具体步骤如下 xff1a 1 创建自定义模块 在Simulink中 xff0c 可以使用Subsyste
  • rmmod时提示 rmmod : chdir(/lib/modules): No such file or directory

    insmod后 xff0c 使用lsmod查看 xff0c 如果成功则可以看到刚才安装的module 此时如果修改了module代码要重新安装 xff0c 则需要先rmmod刚才安装的模块才能重新安装 xff0c 否则在insmod时会提示
  • 无源蜂鸣器按特定频率发出相对应的音调

    蜂鸣器是什么 xff1f 蜂鸣器是什么呢 xff1f 相信大家在做项目中肯定多多少少都会用到蜂鸣器 xff0c 蜂鸣器呢是一种一体化结构的电子讯响器 xff0c 采用直流电压供电 xff0c 广泛应用于计算机 打印机 复印机 报警器 电子玩
  • 树莓派上安装Pytorch

    没有踩坑和报错 xff0c 浅浅记录以下 将torch 1 7 0a0 cp37 cp37m linux armv7l whl和torchvision 0 8 0a0 43 45f960c cp37 cp37m linux armv7l w
  • FreeRTOS学习记录(3)——任务创建与启动总结

    对FreeRTOS的使用过程进行精简后会发现 xff0c 它的整个过程其实非常简单 xff0c 首先创建任务 xff0c 其次登记任务 xff0c 根据任务所登记的位置不断开始执行任务 下面进行详细的解释 创建任务 xff0c 这个过程中会
  • 执行HQL直接被退出:Remote side unexpectedly closed network connection

    执行HQL直接被退出 xff1a Remote side unexpectedly closed network connection 文章目录 执行HQL直接被退出 xff1a Remote side unexpectedly close
  • 使用mybatisplus要导入的依赖

    lt dependency gt lt groupId gt com spring4all lt groupId gt lt artifactId gt spring boot starter swagger lt artifactId g
  • Hadoop中HDFS的读写流程详解

    一 HDFS写流程示意图 xff1a xff08 1 xff09 客户端通过Distributed FileSystem模块向NameNode请求上传文件 xff0c NameNode检查目标文件是否已存在 xff0c 父目录是否存在 检查
  • 基于树莓派(python)的平衡小车

    目前普遍是STM32或者51来实现平衡小车 xff0c 基于树莓派的平衡小车少见 xff08 因为树莓派适合用于数据处理 xff09 但有部分同学的毕设选择了用树莓派来做平衡小车的 xff0c 接下来分享一下基于树莓派的平衡小车如何完成 驱
  • BGP双平面架构

    要求 xff1a PC1 PC3 PC5为电信面路由 xff0c PC2 PC4 PC6为联通面路由 正常情况下 xff0c 电信面路由走AS1 xff0c 联通面路由走AS2 xff0c 当R9与R1之间的线路发生故障时 xff0c 电信
  • 宿主机可以正常上网,虚拟机不能上网的问题

    宿主机可以正常上网 xff0c 虚拟机不能上网的问题 问题描述 宿主机 xff1a Windows 10 虚拟机 xff1a VMware Ubuntu 14 04 6 LTS 之前配置过一个主节点 xff0c 三个从节点 宿主机 xff0

随机推荐

  • Jlink调试2440进不了中断的看这里

    很多人学习2440都是从裸机开始的 刚开始的小菜LED xff0c 然后定时器 按键这些常用内部外设 xff0c 最后则是LCD Nand等复杂外设 用Jlink裸机调试2440小程序时 xff0c 中断的调试是一个重要内容 像定时器 按键
  • 在Eclipse中运行第一个MapReduce程序

    这是Hadoop学习全程记录第2篇 xff0c 在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序 新说明一下我的开发环境 xff1a 操作系统 xff1a 在windows下使用wubi安装了ubuntu 10 10
  • 论文笔记:Learning Deep Features for Discriminative Localization

    一 这篇论文解决什么问题 原始问题 xff1a Weakly supervised object localization xff0c 研究发现 xff0c 图像分类任务上训练的CNN xff0c 可以直接用于物体定位 两个子问题 xff1
  • CSS高度塌陷问题-六种解决方案

    问题背景 子元素浮动后 xff0c 无法撑起父元素高度 xff0c 导致父元素高度丢失 xff0c 其下元素会自动上移 xff0c 导致页面布局混乱 解决方案 一 BFC 块级格式化环境 xff08 Block Formatting Con
  • MySQL设置更改root密码

    MySQL设置更改root密码 方法一 xff1a 通过MySQL console直接设置密码 首先打开MySQL console 输入原始密码后按回车键 xff08 如果没有原始密码 xff0c enter password后面为空 xf
  • Unity2D—利用UGUI纯代码实现简易摇杆

    目标 xff1a 拖动摇杆实现平面物体的移动 一 制作摇杆UI 平面物体 xff08 1 xff09 新建画布Canvas xff0c 将Canvas的UI缩放模式设置为屏幕大小播放 xff08 如不设为该模式则会因界面缩放而导致UI消失
  • Unity2D—骨骼绑定、IK系统、动画(一)

    目标 xff1a 使用素材实现特定的2D人物动画 一 导入包资源和素材 xff08 本人的Unity版本为2021 1 7 xff09 xff08 1 xff09 Unity注册表中 xff1a 2D Animation 2D PSD Im
  • Unity2D—骨骼绑定、IK系统、动画(二)

    目标 xff1a 使用素材实现特定的2D人物动画 三 IK系统简介 小知识 xff1a IK动画全名是Inverse Kinematics 意思是反向动力学 xff0c 子骨骼节点带动父骨骼节点运动 比如跳街舞的少年用手撑着身体在地上转圈
  • 手把手教你做计算机网络基础大题—报文交换

    一 题目 如图所示 xff0c 主机A要向主机B发送一个长度为300KB的报文 xff0c 发送速率为10Mbps xff0c 传输路径上要经过8个路由器 xff0c 连接路由器的链路长度为100km xff0c 信号在链路上的传播速度为2
  • 手把手教你做计算机网络基础大题—TCP头部结构

    一 题目 已知TCP头部用十六进制数表示为 xff1a 05320017 00000001 00000055 500207FF 00000000 请回答以下问题 xff1a xff08 1 xff09 源端口号是多少 xff1f xff08
  • 雅思大作文写作模版

    模版整理自Vince9120老师 xff0c 逻辑清晰 xff0c 对于写作遇到瓶颈的同学有帮助 xff0c 而且易上手使用 Vince老师视频在Bilibili xff0c 备考时间充足的同学建议观看学习 xff01 一 大作文段落详情及
  • 手把手教你做计算机网络基础大题—ARQ协议

    一 题目 假定使用连续ARQ协议 xff0c 发送窗口大小是3 xff0c 而序号范围是 0 xff0c 15 xff0c 而传输媒体保证在接收方能够按序收到分组 在某一时刻 xff0c 在接收方 xff0c 下一个期望收到的序号是5 试问
  • ARM开发中ubuntu设置成静态IP的优劣分析

    ARM linux开发中 xff0c 我们经常将主机ubuntu设置成静态IP 这有一些好处 xff0c 譬如你的uboot的环境变量中serverip就不用每次改来改去的了 我一直也是这么做的 xff0c 但是今天突然发现这样会带来很多问
  • 手把手教你做计算机网络基础大题—路由表

    一 题目 设某路由器建立了如下路由表 xff1a 目的网络子网掩码下一跳128 96 39 0255 255 255 128接口m0128 96 39 128255 255 255 128接口m1128 96 40 0255 255 255
  • 新手入门:ST-Link和J-Link仿真器的使用

    当编译完成之后 xff0c 点击下载 xff0c 出现这样的错误提示 xff0c 说明我们的仿真器配置没有配置好 xff0c 下面我们讲讲J Link和ST Link分别应该如何配置 xff08 1 xff1a 编译 xff0c 后续只编译
  • 深度学习图像分类实战——pytorch搭建卷积神经网络(AlexNet, LeNet, ResNet50)进行场景图像分类(详细)

    目录 1 一 实验过程 1 1 实验目的 1 2 实验简介 1 3 数据集的介绍 1 4 一 LeNet5网络模型 1 5 二 AlexNet网络模型 1 6 三 ResNet50 xff08 残差网络 xff09 网络模型 二 实验代码
  • c++实现经典游戏贪吃蛇(超详解)

    经典版 要求 xff1a 1碰到四周和自身游戏结束 xff1b 2迟到食物蛇身增长 xff1b 3食物吃得越多游戏越快 xff1b 4通过w a s d可控制蛇头的方向 xff1b 5蛇身颜色不一致 源码 xff08 需要easy x 贪吃
  • c++中求数组的长度

    c 43 43 中求数组的长度 数组长度 61 sizeof 数组名 sizeof 数组类型 span class token macro property span class token directive hash span span
  • 实验 1 UML 类图实验

    实验内容 作图工具 xff1a PowerDesigner 1 绘制以下类图并生成源代码 xff08 语言不限 xff09 xff1a 2 根据以下描述绘制类图 xff0c 再正向工程生成 Java 源代码 xff08 也可生成其他面 2
  • 贪吃蛇(C++)

    一 项目思路 该项目用于计算机软件课设 贪吃蛇要解决的问题有 xff1a 蛇身的移动 xff0c 事物的随机生成 xff0c 蛇头与食物重合 xff0c 蛇吃食物身体的变长 蛇身移动的处理可以改变蛇首元素 xff08 蛇身用数组存储 xff