基于QT的翻金币小游戏项目总结记录(四)

13 篇文章 3 订阅
本文详细介绍了使用C++和Qt5开发翻金币小游戏的过程,包括游戏初始化界面、字符串数字内容设置、背景图案加载、游戏核心元素分析及游戏操作和胜负判断的实现思路。通过创建二维数组表示关卡初始排列,设计钱币类以处理翻转动画,并探讨了游戏的操作流程和胜负判断的编程实现。
摘要由CSDN通过智能技术生成

前言

  最近为了学习C++和qt5,跟着教程写了一个翻金币的小游戏,源码和资源文件的链接在这里:翻金币小游戏源码和资源文件的下载链接。里面有自己写的超多代码注释,只要2个C币,去秒。
  前三篇文章分析并记录了游戏机制以外的所有内容,从这篇文章起,开始分析记录翻金币游戏的游戏机制实现。

游戏初始化界面

  先来看下游戏界面是个什么样子:
  
在这里插入图片描述
  
  如上图所示,游戏窗口界面有以下几个元素构成:1.窗口背景图片。2.右下角的返回按钮。3.左下角的关卡显示标签。4.位于窗口中央的4X4游戏棋盘。

一种方便的字符串数字内容设置方法

  这里提一下左下角的关卡显示标签,倒也不是说这个很难实现,而是在这里介绍一下一个在QT中字符串显示数字变量的方法。

void PlayScene::levelHint(PlayScene* playScene){//创建左下角当前关卡提示标签
    QLabel* levelLabel = new QLabel(playScene);
    QFont font1;//设置字体元素
    font1.setPointSize(20);//字体大小
    levelLabel->setFont(font1);//将字体元素嵌入到标签对象中
    QString str1 = QString("LEVEL: %1 ").arg(this->curLevel);//核心语句
    levelLabel->setText(str1);//设置标签文字
    levelLabel->setGeometry(30,this->height()-50,180,50);//设定标签的坐标和长宽
}

  关键语法是下面这句:

QString str1 = QString("LEVEL: %1 ").arg(this->curLevel);//核心语句

  这里可以看到,字符串中有个%1,然后在后面有一个带参数的.arg()函数。
  显然,字符串中的%1就是.arg()里面的参数,这样的方式实现了字符串中的数字内容动态变化。
  如果需要在一个字符串中实现多个动态数字内容,只需要套娃就行了:

QString str1 = QString("%1,%2,%3").arg(a).arg(b).arg(c);

  

背景图案

  背景图案的排布方案与关卡选择界面的处理方式相同:

	for(int i=0;i<16;++i){
        //创建背景阵列
        QPixmap pix = QPixmap(":/res/BoardNode(1).png");
        QLabel* label = new QLabel(this);//使用标签作为图片载体
        label->setGeometry(0,0,pix.width(),pix.height());
        label->setPixmap(pix);//设置标签上的图片
        label->move(57 + i%4 *50,200 +i/4 *50);//阵列排布标签
    }

游戏内容分析

游戏的主内容分析

  
在这里插入图片描述
  
  我们结合游戏的规则来分析初始钱币分布的处理方式。
  在翻金币游戏中,银色的钱币实际上是钱币的反面,金色的钱币是钱币的正面,翻金币游戏的游玩方式是:点击一枚硬币一次,令其实现一次正反翻转,同时使得该硬币的上下左右四个钱币跟随其一起翻转(也就是一次最多能翻转五个硬币)。翻金币游戏的成功条件是:16个硬币全部为正面(金币)就取得胜利。
  我们可以简化一下内容再分析其本质,比如说“该硬币的上下左右四个钱币跟着一起翻转”,这个在设计思路上是不太重要的,因为你只要实现了一个硬币的翻转,其余的硬币你同时想翻几个就翻几个,因此可以暂时不考虑。
  这样的话,游戏流程应该使用代码实现:特定的初始的关卡钱币排列、单个钱币的翻转、胜利条件的判断与游戏终止三个主内容。
  了解研究内容了之后我们继续思考更细节层次的实现。
  

初始排列方式的分析

  首先,每一个关卡都是一个固定的排列方式,其次,该排列方式是个二维矩阵。
  固定,阵列,一下子就想到二维数组了。
  我们可以认为,应该创建20个二维数组(因为一共有20个关卡),对应20个关卡的初始阵列,当开始初始化加载游戏界面内的钱币时,加载对应的二维数组,对该二维数组进行遍历后,判断阵列中的金币银币分布情况。

游戏核心元素的分析

  游戏的核心元素显而易见:钱币。
  道理也很简单,游戏里银币是钱币,金币是钱币,玩家能操作的也只有钱币,最后构成胜负条件的也还是钱币,钱币不当核心元素天理难容。
  既然是个核心元素,就要考虑为它设计一个类。
  该类从目前来分析,应当至少包含以下几个元素:
  1.金币与银币的图片加载
  2.要区分金币还是银币,应该有一个标志位
  目前来看,这两个要素是必须的。

游戏操作的分析

  游戏内的操作只有翻转硬币这一项。
  既然我们有了钱币类,钱币对象还有判断正反的标志位,那么翻转就变得比较简单了。
  不过游戏的操作过程中肯定不能让钱币瞬间翻转,应该是要加入一个动画特效进去的,因此在钱币类中应该还要加入:
  3.钱币翻转的动画特效。

游戏胜负判断的分析

  翻金币游戏本质上和五子棋这类游戏的胜负判断是相同的,也就是说每执行一步操作,都应当对整个游戏界面内的元素阵列做一个分析,来判断是否达成胜利条件。
  二维数组内的遍历,就是你了。

后记

  对游戏流程进行分析后,需要编写什么内容就很清晰了。
  游戏程序的编写非常符合软件中自顶向下的设计思路,先有功能和需求,在分析实现。
  当然,实际上需要实现的技术细节是肯定比分析的内容要多的,很多地方在仔细思考后会发现很多的小问题,这些都是需要在后续的测试中发现并完善的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值