QT之贪吃蛇

前言

学完Qt想着写一个小游戏练练手,就想到了贪吃蛇这个小游戏,这个游戏总体上来说还是比较简单的,逻辑关系也不是很复杂。
刚开始写,因为刚学完Qt,对Qt不熟悉,就是感觉会无从下手。在写的过程中参考了别人的博客,十分感谢他们。
https://blog.csdn.net/li235456789/article/details/51010253
https://blog.csdn.net/qq_31821675/article/details/74784261

我的程序下载地址,已经打包好,可直接运行,源码也在其中:
链接:https://download.csdn.net/download/qq_36327203/10756900
程序运行截图:
Snake

基本原理

主界面设计

左侧部分用的是画矩形的方式画出表格:

//画表格
QPainter painter(this);
for(int y = 15; y < 15 + RECTWIDTH * RECTNUM; y += RECTWIDTH)
{
    for(int x = 15; x < 15 + RECTWIDTH * RECTNUM; x += RECTWIDTH)
    {
        painter.drawRect(QRect(x, y, 50, 50));
    }
}

右侧用相关部件显示相关信息:

this->resize(640, 480);
this->setWindowIcon(QIcon(":/img/snake.jpg"));

QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(":/img/back.png").scaled(this->size())));
this->setPalette(palette);

pb_start = new QPushButton(this);
pb_start->setText("开始游戏");
pb_start->setStyleSheet("color: rgb(255, 172, 117); font: 75 14pt '隶书';");
pb_start->setGeometry(QRect(500, 50, 100, 50));
pb_start->setFlat(true);    //透明

pb_exit = new QPushButton(this);
pb_exit->setStyleSheet("color: rgb(255, 172, 117); font: 75 14pt '隶书';");
pb_exit->setText("重新开始");
pb_exit->setGeometry(QRect(500, 120, 100, 50));
pb_exit->setFlat(true);

lb_socre = new QLabel(this);
lb_socre->setStyleSheet("color:green;font: 75 12pt '微软雅黑';");
lb_socre->setText("分数:");
lb_socre->setGeometry(500, 180, 50, 50);

lb_scoreShow = new QLabel(this);
lb_scoreShow->setStyleSheet("color:red;font: 75 12pt '微软雅黑';");
lb_scoreShow->setText("0");
lb_scoreShow->setGeometry(550, 180, 50, 50);

lb_prompt = new QLabel(this);
lb_prompt->setStyleSheet("color: rgb(226, 192, 255); font: 75 14pt '微软雅黑';");
lb_prompt->setText("w,a,s,d控制上下左右,k开始游戏,j重新开始\n祝您玩得愉快!");
lb_prompt->setGeometry(500, 240, 100, 200);
lb_prompt->setWordWrap(true);   //自动换行

蛇身的更新

蛇身的跟新其实是最麻烦的,如果没有遇到食物,更新方式为:蛇头向指定方向更新一格,剩余部分每个节点更新到它前面一格节点;
如果将遇到食物,更新方式为:蛇头更新为食物坐标,增加最后一个节点,节点为原来设为的坐标,剩余部分每个节点更新到它前面一格节点。
详细请参考代码。

向上移动的代码

void Snake::up_pressed()
{
    if (direc != Direction_Down)
    {
        if (snake[0].ry() - 1 < 0 ||
                touchSlef(QPoint(snake[0].rx(), snake[0].ry() - 1)))    //碰到墙壁
        {
            overBox();
        }
        else
        {
            direc = Direction_Up;

            if (QPoint(snake[0].rx(), snake[0].ry() - 1) == food)
            {
                upDateFood();
                snake[m_snakeLenth] = QPoint(snake[m_snakeLenth - 1].rx(), snake[m_snakeLenth - 1].ry());
                m_snakeLenth++;
            }

            //蛇身更新
            for(int i = m_snakeLenth - 1; i > 0; i--)
            {
                snake[i] = snake[i - 1];
            }
            snake[0].ry() -= 1;
        }

        repaint();
    }
}

遇到的问题

从控制台黑框框到编写图形界面的问题:
刚开始做的时候,感觉会无从下手,我的感觉就是不知道怎么设计,比如说画表格,不知道怎么画,再比如画图片,图片怎么添加到界面上?这些都是刚开始做会遇到的问题。但参考的别人的代码,知道了怎么用,后面的逻辑关系,就简单一些了。
还有,多查资料,多百度,Qt的官方文档看起来暂时有些困难,但是百度上面也有许多知识点,以后再慢慢看官方手册。

总结

贪吃蛇的基本框架算是完成了,可以改进的地方:

  1. 难度选择,改变定时器时间可以解决

QQ:1570553025
github:https://github.com/myzcl
微信公众号,扫二维码即可关注:
在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chasentech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值