iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >QT如何实现贪吃蛇游戏
  • 569
分享到

QT如何实现贪吃蛇游戏

2023-06-15 02:06:27 569人浏览 八月长安
摘要

这篇文章主要介绍了Qt如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。因为QT的机制

这篇文章主要介绍了Qt如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。

因为QT的机制和平时写的程序流程不同,所以程序中可能没有遵守代码规范。

运行效果:

QT如何实现贪吃蛇游戏

程序内除了实现贪吃蛇的基本功能外,还添加了记录得分、调节游戏速度、重新开始游戏等功能。

游戏内容使用QPainter类进行绘制。

编译环境:

windows Qt 5.9.0 Qt Creator 4.3.0

思路:

数组存储蛇节点坐标的贪吃蛇游戏思路。

因为编写过程中使用了分文件编写,且QT框架的其他部分较多,这里仅展示程序实现主要代码。

代码:

MainWindow.h 主窗口类头文件

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QPainter>     //画家类#include "snake.h"      //蛇类#include <QKeyEvent>    //键盘事件#include "food.h"       //食物类#include <QTimer>       //定时器类namespace Ui {class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();    //绘图事件    void paintEvent(QPaintEvent *);    //游戏结束的情况    void GameOver();private:    Ui::Widget *ui;    Snake snake;        //蛇对象    char key = 'd';     //接收键值,初始向右    Food food;          //食物对象    //创建定时器    QTimer *timer = new QTimer(this);    bool gameflag = false;//游戏结束标记    int score = 0;      //记录得分    int timerspeed = 200; //定时器速度    bool bugflag = false; //用于解决操控过快导致撞死自己的bug的标志    //键盘事件,改变键值    void keyPressEvent(QKeyEvent *ev);};#endif // WIDGET_H

MainWindow.cpp函数实现

#include "MainWindow.h"#include "ui_widget.h"#include <QLabel>#include <QPushButton>//主窗口构造函数Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){    ui->setupUi(this);      //初始化出.ui界面    //一个格子宽高25像素,地图宽高600像素,每行有24个格子    //设置固定窗口大小    setFixedSize(1000,600);    //设置得分标签控件的属性    ui->label->setFont(QFont("黑体", 20, QFont::Bold, false));    //设置游戏速度标签内容    ui->label_2->setFont(QFont("楷体", 16, QFont::Bold, false));    ui->label_2->setText("游戏速度:");    //滑动条控件,这里将数值按一定比例放大缩小    ui->horizontalSlider->setValue(200 >> 2);    //监听滑动条控件滑动时,改变定时器速度为滑动条的值    connect(ui->horizontalSlider,QSlider::valueChanged,[=]()    {        timerspeed = ui->horizontalSlider->value() << 2;    });    //设置重新开始按钮属性和内容    ui->pushButton_3->setFont(QFont("黑体",12));    ui->pushButton_3->setText("重新开始");    //监听重新开始按钮    connect(ui->pushButton_3,QPushButton::clicked,[=]()    {        snake.Reset();      //重置蛇        score = 0;          //得分清0        key = 'd';          //key值向右        timerspeed = 200 << 2;//重置游戏速度        timer->start(timerspeed);//重置定时器        ui->horizontalSlider->setValue(200 >> 2);//重置滑动条        gameflag = false;   //重置游戏结束标志    });    //开启定时器    timer->start(timerspeed);    //监听定时器的信号,执行表达式内容    connect(timer,&QTimer::timeout,[=]()    {        timer->start(timerspeed); //调整定时器的速度        snake.Move(key);    //蛇移动函数        //吃到食物的情况        (food.getfoodX() == snake.snakevec.at(0).x && food.getfoodY() == snake.snakevec.at(0).y) ?        score++, food.randfood():    //得分+1,随机产生一个食物坐标        snake.snakevec.pop_back();   //删除蛇尾        GameOver();    //游戏失败的情况        update();      //调用绘图函数        //更新标签控件的文本内容        ui->label->setText(QString("得分:%1").arg(score));    });}//游戏失败情况void Widget::GameOver(){    //撞墙失败    if(snake.snakevec.at(0).x >= 24 * 25 || snake.snakevec.at(0).x < 0 ||       snake.snakevec.at(0).y < 0 || snake.snakevec.at(0).y >= 24 * 25)    {        gameflag = true;        timer->stop();      //暂停定时器        return;    }    //撞自己失败    for(int i = 1; i < snake.snakevec.size(); i++)    {        if(snake.snakevec.at(0).x == snake.snakevec.at(i).x &&           snake.snakevec.at(0).y == snake.snakevec.at(i).y)            gameflag = true, timer->stop();    }}//绘图事件void Widget::paintEvent(QPaintEvent *){    //创建画家对象,指定绘图设备为this主窗口    QPainter painter(this);    //设置画刷为红色    QBrush brush2(Qt::red);    //让画家使用画刷    painter.setBrush(brush2);    //画食物    painter.drawRect(QRect(food.getfoodX(),food.getfoodY(),25,25));    //设置画刷为黑色    QBrush brush3(Qt::blue);    painter.setBrush(brush3);    //遍历蛇坐标容器,画出代表蛇身的矩形    for(auto snakenodei : snake.snakevec)        //蛇头画圆形        (snakenodei.x == snake.snakevec.at(0).x &&         snakenodei.y == snake.snakevec.at(0).y) ?        //蛇头画圆形        painter.setRenderHint(QPainter::Antialiasing),  //用抗锯齿画圆        painter.drawEllipse(QPoint(snakenodei.x + 12,snakenodei.y + 12),12,12):        //蛇身画矩形        painter.drawRect(QRect(snakenodei.x,snakenodei.y,25,25));    bugflag = false;    //在画出蛇之后将标志设为假    //设置画刷为黑色    QBrush brush4(QColor(128, 64, 0));    painter.setBrush(brush4);    //画出墙壁    for(int i = 0; i < 24; i++)          painter.drawRect(QRect(25 * 25, i * 25, 25, 25));    //游戏结束时的绘图    if(gameflag)    {   //设置文字属性        QFont font("楷体", 80, QFont::Bold, false);        painter.setFont(font);      //使用字体        painter.drawText(QRect(240, 200, 1000, 500), "游戏结束");   //画出游戏结束文字    }}//键盘事件,改变贪吃蛇移动方向void Widget::keyPressEvent(QKeyEvent *ev){    if(bugflag)     //bug标志为真直接返回        return;    switch (ev->key())    {    case Qt::Key_W:        if(key == 's') break;   //按下与当前方向相反按键时break        key = 'w';        bugflag = true; break;        //按键之后将标志设为真    case Qt::Key_S:        if(key == 'w') break;        key = 's';        bugflag = true; break;    case Qt::Key_A:        if(key == 'd') break;        key = 'a';        bugflag = true; break;    case Qt::Key_D:        if(key == 'a') break;        key = 'd';        bugflag = true; break;    case Qt::Key_Space:     //空格键暂停,这里有点问题        timer->stop(); break;    default:                //其他键重启定时器        timer->start(timerspeed);    }}//析构Widget::~Widget(){    delete ui;}

snake.h 蛇类头文件

#ifndef SNAKE_H#define SNAKE_H#include <QWidget>#include <QVector>      //Qt动态数组类class Snake : public QWidget{    Q_OBJECTprivate:    //蛇坐标结构    struct  Snakecoor    {        int x;        int y;    };public:    explicit Snake(QWidget *parent = nullptr);    //蛇坐标容器    QVector<Snakecoor> snakevec;    //蛇移动主要函数    void Move(char key);    //根据key值确定蛇的移动方向    void DeteDirMove(char key, Snakecoor &nexthead);    //重置蛇    void Reset();signals:public slots:};#endif // SNAKE_H

snake.cpp 蛇类函数实现

#include "snake.h"//构造函数初始化一条蛇Snake::Snake(QWidget *parent) : QWidget(parent){    Snakecoor snakenode;            //临时结构变量用于创建蛇    for (int i = 5; i >= 0; i--) //从右向左创建5节蛇身,容器的第一个元素为蛇头    {        snakenode.x = 25 * 8 + i * 25;//每个格子宽25像素        snakenode.y = 25 * 8;        snakevec.push_back(snakenode);//将蛇节点插入到数组中    }}//确定蛇的移动方向,确定新蛇头的坐标位置inline void Snake::DeteDirMove(char key, Snakecoor &nexthead){    switch (key)    {    case 'w':        //新蛇头坐标根据旧蛇头坐标改变        nexthead.x = snakevec.front().x;        nexthead.y = snakevec.front().y - 25;        break;    case 's':        nexthead.x = snakevec.front().x;        nexthead.y = snakevec.front().y + 25;        break;    case 'a':        nexthead.x = snakevec.front().x - 25;        nexthead.y = snakevec.front().y;        break;    case 'd':        nexthead.x = snakevec.front().x + 25;        nexthead.y = snakevec.front().y;    }}//蛇移动主要函数void Snake::Move(char key){    Snakecoor nexthead;  //创建一个新的蛇头    DeteDirMove(key, nexthead);  //确定新蛇头的位置    snakevec.insert(snakevec.begin(), nexthead);    //将新蛇头插入到容器头部}//重置蛇函数void Snake::Reset(){    snakevec.clear();   //清空容器    //初始化蛇    Snakecoor snakenode;    for (int i = 5; i >= 0; i--)    {        snakenode.x = 25 * 8 + i * 25;        snakenode.y = 25 * 8;        snakevec.push_back(snakenode);    }}

food.h 食物类头文件

#ifndef FOOD_H#define FOOD_H#include <QWidget>class Food : public QWidget{    Q_OBJECTpublic :    int food_x = 0;     //食物坐标    int food_y = 0;public:    explicit Food(QWidget *parent = nullptr);    void randfood();    //随机产生食物坐标    int getfoodX();     //返回食物坐标    int getfoodY();signals:public slots:};#endif // FOOD_H

food.cpp 食物类函数实现

#include "food.h"#include <ctime>Food::Food(QWidget *parent) : QWidget(parent){    randfood();     //创建对象时产生就一个随机坐标}//随机产生食物坐标void Food::randfood(){    srand((unsigned)time(NULL));    food_x = (rand() % 24) * 25;    food_y = (rand() % 24 )* 25;}//获取食物的坐标int Food::getfoodX(){    return food_x;}int Food::getfoodY(){    return food_y;}

感谢你能够认真阅读完这篇文章,希望小编分享的“QT如何实现贪吃蛇游戏”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: QT如何实现贪吃蛇游戏

本文链接: https://www.lsjlt.com/news/277037.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • QT如何实现贪吃蛇游戏
    这篇文章主要介绍了QT如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。因为QT的机制...
    99+
    2023-06-15
  • QT实现贪吃蛇游戏
    为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。 因为QT的机制和平时写的程序流程不同,所以程序中可能没有遵守代码规范。 运行效果: 程序内除了实现贪吃蛇...
    99+
    2024-04-02
  • QT实现贪吃蛇游戏代码详解
    目录一、新建一个Qt项目二、添加要用到的头文件三、写类声明信息四、对类函数的实现构造函数界面刷新随机奖励的生成移动绘图按键事件判断蛇身是否相撞五、结束一、新建一个Qt项目 新建Qt ...
    99+
    2024-04-02
  • JavaScript实现贪吃蛇游戏
    本文实例为大家分享了JavaScript实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 通过JavaScript,我们可以实现贪吃蛇游戏,具体功能如下: (1)通过按上下左右键来...
    99+
    2024-04-02
  • python如何实现贪吃蛇游戏
    这篇文章主要介绍了python如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。游戏实现效果如下:后面有完整代码和解析import sysimport...
    99+
    2023-06-14
  • Java实现贪吃蛇游戏
    下面是一个简单的Java实现贪吃蛇游戏的示例代码:```javaimport javax.swing.*;import java.a...
    99+
    2023-08-09
    Java
  • js如何实现贪吃蛇游戏
    本篇内容介绍了“js如何实现贪吃蛇游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个小时完成的,有点简陋。直接看效果。打开调试面板,在r...
    99+
    2023-06-14
  • pygame实现贪吃蛇游戏
    本文实例为大家分享了pygame实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 为了简化起见,游戏素材暂定为两张简单的图片(文中用的是30*30)。大家很方便就能制作。 背景也...
    99+
    2024-04-02
  • python实现贪吃蛇游戏
    文章目录 1、效果2、实现过程3、代码 1、效果 2、实现过程 导入 Pygame 和 random 模块。初始化 Pygame。设置游戏界面大小、背景颜色和游戏标题。定义颜色常量。...
    99+
    2023-09-29
    python 游戏 pygame
  • 如何实现贪吃蛇Python小游戏
    这篇文章主要介绍“如何实现贪吃蛇Python小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何实现贪吃蛇Python小游戏”文章能帮助大家解决问题。贪吃蛇Python小游戏(源码+注释+粘贴即...
    99+
    2023-07-05
  • JS实现贪吃蛇小游戏
    目录一、初始化结构二、渲染蛇的颜色 三、蛇的运动四、蛇死亡的判定方式 蛇有两种判定死亡的方式五、食物的创建六、蛇吃食物边长七、开始游戏功能八、暂停/继续游戏功能页面效果: 贪吃蛇游...
    99+
    2024-04-02
  • 如何使用HTML5实现贪吃蛇游戏
    这篇文章将为大家详细讲解有关如何使用HTML5实现贪吃蛇游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 游戏操作说明 通过方向键控制贪吃蛇上下左右移动。贪吃蛇吃到...
    99+
    2024-04-02
  • pygame实现贪吃蛇小游戏
    本文实例为大家分享了pygame实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以玩起来pygame。pygame是真的容...
    99+
    2024-04-02
  • C#实现贪吃蛇小游戏
    本文实例为大家分享了C#实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 之前一直想写一个贪吃蛇小游戏,上个周末终于有时间做了一个,现在和大家分享。 界面 界面比较简单,一个按钮...
    99+
    2024-04-02
  • 用JS实现贪吃蛇游戏
    本文实例为大家分享了JS实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 效果图: 完整代码如下: html: <!DOCTYPE html> <html la...
    99+
    2024-04-02
  • C++如何实现简易贪吃蛇游戏
    这篇文章主要介绍C++如何实现简易贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C++实现建议贪吃蛇(不会闪屏幕)使用vs2013完成。记录踏上游戏开发的道路。效果图代码// 2021.7.24....
    99+
    2023-06-20
  • 如何利用pygame实现贪吃蛇游戏
    这篇文章主要介绍如何利用pygame实现贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建蛇首先,先分析一下蛇的移动,不然我们一定会吃亏的(别问,问就是自己写了一堆无效代码)。蛇的移动其实并没有想象中那样复...
    99+
    2023-06-15
  • Java+JFrame实现贪吃蛇小游戏
    分享一个Java贪吃蛇小游戏,主要用到的是Java的JFrame,适合初学者。 首先创建一个合适大小的窗口,我这里是900*720 package com.lzijin;     ...
    99+
    2024-04-02
  • python怎么实现贪吃蛇游戏
    要实现贪吃蛇游戏,可以使用Python中的pygame库来进行游戏界面的绘制和键盘事件的监听。以下是一个简单的贪吃蛇游戏的示例代码:...
    99+
    2023-08-09
    python
  • 基于Vueuniapp实现贪吃蛇游戏
    目录游戏演示代码结构渲染蛇身控制蛇的方向游戏演示 代码结构 详细代码结构如果需要请到github查看 <template> <view ref="body" c...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作