Qt极简贪吃蛇实现

2023-10-30

持续修正更新该项目
环境:Qt 4.8 (Qt5环境也可使用)
全部文件传送门

部分重要模块代码

#include "snakegame.h"
#include "ui_snakegame.h"


SnakeGame::SnakeGame(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SnakeGame)
{
    ui->setupUi(this);
    head = new Body(rand()%18+1,rand()%10+1,40,this);
    snake.push_back(head);
    food = new Apple(rand()%20,rand()%12,40,this);

    setDirection(rand()%4);

    timer = new QTimer;
    speed = 500;     //半秒
    timer->setInterval(speed);//间隔
    connect(timer,SIGNAL(timeout()),this,SLOT(snake_move_slot()));
    timer->start();

    qDebug("%d %d %d %d",Qt::Key_Up,Qt::Key_Down,Qt::Key_Left,Qt::Key_Right);


}

void SnakeGame::snake_move_slot(void)
{
    for(int i=snake.size()-1;i>0;i--)
    {
        snake[i]->move(snake[i-1]->x(),snake[i-1]->y());
    }
    switch(direction)
    {
    case Up:head->move(head->x(),head->y()-40);
        break;
    case Down:head->move(head->x(),head->y()+40);
        break;
    case Left:head->move(head->x()-40,head->y());
        break;
    case Right:head->move(head->x()+40,head->y());
        break;
    }
    if(food->x()==head->x() && food->y() == head->y())
    {
        snake.push_back(food);
        food = new Apple(rand()%20,rand()%12,40,this);
    }
}

void SnakeGame::keyReleaseEvent(QKeyEvent *event)
{
    switch(event->key())
    {
    case Qt::Key_Up: setDirection(Up);
        break;
    case Qt::Key_Down: setDirection(Down);
        break;
    case Qt::Key_Left: setDirection(Left);
        break;
    case Qt::Key_Right: setDirection(Right);
        break;
    }
}

void SnakeGame::setDirection(int direction)
{
    QString headImage = "border-image: url(:/snake_image/";
    switch(direction)
    {
    case Up:
        headImage += "head_up.png);";
        break;
    case Down:headImage += "head_down.png);";
        break;
    case Left:headImage += "head_left.png);";
        break;
    case Right:headImage += "head_right.png);";
        break;
    }
    head->setStyleSheet(headImage);
    this->direction=direction;
}



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

Qt极简贪吃蛇实现 的相关文章

  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad

随机推荐

  • JVM--基础--24.1--参数

    JVM 基础 24 1 参数 1 常用参数 1 1 Xms 初始堆大小 默认值 物理内存的1 64 lt 1GB 默认空余堆内存小于40 时 JVM就会增大堆 直到 Xmx的最大限制 可以通过MinHeapFreeRatio参数可以调整 1
  • ueditor二次加载(getEditor)渲染失败(加载失败)的原因解决方案

    来源 php高级视频自学论坛 ueditor二次加载 getEditor 渲染失败 加载失败 的原因解决方案 大家自己看看官方的js文件ueditor all js有以下的代码 name getEditor since 1 2 4 gram
  • 毕业设计 基于stm32的RFID与指纹识别的门禁系统

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 射频识别 3 1 射频识别技术 3 2 射频识别模块 3 2 1 RFID模块 3 2 2 RFID模块组成 4 系统设计 4 1 系统架构 4 1 1 硬件部分 4 1 2 软件部
  • 【云计算】docker前世今生

    下一代云计算模式 Docker正掀起个性化商业革命 作者 吴宁川 来源 ITValue 发布时间 2015 09 20 10 41 阅读 12976 次 推荐 24 原文链接 收藏 文 ITValue 记者吴宁川 从 2008 年开始进入公
  • 推荐4个很棒的Java项目,超级适合小白练手,赶紧收藏!

    好程序员今天给大家推荐4个很棒的Java练手项目 超适合小白哦 网上订餐管理系统 经过对订餐软件的研究 使用 切身体会用户的需求再对商家展开一系列调查 确定商家的需求 基于这些调查结果 设计系统功能 订餐者必须是在线注册了的用户 创立用户
  • 关于cookie的设置path路径的问题

    正常的Cookie只能在一个应用中访问 即cookie只能由创建他的应用访问要实现跨应用访问cookie或者跨域访问cookie就得使用到cookie的setPath 和setDomain 方法 1 同一服务器内的cookie共享方法 se
  • Android实用笔记——使用ViewPager实现导航

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 ViewPager功能 可以使试图左右滑动 类似微信的顶部导航栏 2 加入ViewPager
  • Centos7 ping不通baidu.com《亲测有效》,折磨两天

    问题重现 root bogon ping www baidu com ping www baidu com 未知的名称或服务 在配置Centos7为静态IP时 发现配置什么的都对 但是就是ping不同外网和其它节点 在公司里埋头苦干2天也没
  • R语言:summary()函数解读

    summary 获取描述性统计量 可以提供最小值 最大值 四分位数和数值型变量的均值 以及因子向量和逻辑型向量的频数统计等 结果解读如下 1 调用 Call 2 残差统计量 Residuals 3 系数 Coefficients 4 Mul
  • how to get api via playwright in method page.waitForResponse

    Agenda 1 In this section we will introduce how to use playwright to send api 2 introduce how to convert APIReponse to JS
  • 我在偷偷学Python的第二十七天(正则表达式----下)

    正则表达式介绍 re RegexObject re compile 返回 RegexObject 对象 re MatchObject group 返回被 RE 匹配的字符串 start 返回匹配开始的位置 end 返回匹配结束的位置 spa
  • 搞定VS中反复弹出 Enterprise Core Objects 注册的问题

    搞定VS中反复弹出 Enterprise Core Objects 注册的问题 参照 http blog vichamp com 2007 11 vs2008eco html http capableobjects com node 69
  • OKR概述

    OKR很难吗 用一张图告诉你OKR的定义 操作方法 谷歌实操步骤等 让你快速对OKR有一个全面了解 什么是OKR 中文是目标与关键结果法 是Object ives and Key Results的英文缩写 定义 这是一种由公司 团队和个人协
  • 解决微信自定义图文分享不成功

    首先用到微信开放平台的JS SDK 准备工作 1 用来绑定的微信公众号必须是已认证的 2 链接地址必须是域名 并且是备案过的 当然就得需要服务器了 配置工作 1 配置分享的JS接口安全域名 不然前端配分享时会报错 config invali
  • C++将OpenCV的Mat数据保存为本地.xyz格式,并重新读取为Mat格式

    一 问题 需要将一个OpenCV的Mat格式数据保存到本地为 xyz文件 可用记事本打开 其数据类型为64FC1 数据中包含NaN值 此外还需要将其重新读取为Mat 要求NaN值可以准确识别 二 代码 include
  • Java实现多附件的邮件发送

    叙 本文主要记述了 Springboot 中如何集成并实现多附件的邮件发送 以QQ邮箱的服务器为发送邮件的邮件服务器 Java实现多附件的邮件发送 1 前期准备 1 1 获取收发服务器地址及其端口号 1 2 授权码的获取 2 代码 2 1
  • QTCreator在Ubuntu安装及运行程序报错解决

    1 QT Creator安装 软件包下载 可以进入官网下载或者使用wget命令下载 个人使用wget命令安装如下 sudo wget http download qt io archive qt 5 12 5 12 9 qt opensou
  • VScode修改行间距

    在我们编码的过程中 由于显示字体和显示器的不同 会需要调整行间距 在vscode默认的选项中没有看到设定行间距的选项 不过 可以手动修改配置档达到目的 1 打开设置 2 打开配置档 手动进行设定 3 在选项中添加 editor lineHe
  • Kafka中Producer源码解读

    Producer源码解读 在 Kafka 中 我们把产生消息的一方称为 Producer 即 生产者 它是 Kafka 的核心组件之一 也是消息的来源所在 它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某
  • Qt极简贪吃蛇实现

    持续修正更新该项目 环境 Qt 4 8 Qt5环境也可使用 全部文件传送门 部分重要模块代码 include snakegame h include ui snakegame h SnakeGame SnakeGame QWidget pa