前言
最近为了学习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.钱币翻转的动画特效。
游戏胜负判断的分析
翻金币游戏本质上和五子棋这类游戏的胜负判断是相同的,也就是说每执行一步操作,都应当对整个游戏界面内的元素阵列做一个分析,来判断是否达成胜利条件。
二维数组内的遍历,就是你了。
后记
对游戏流程进行分析后,需要编写什么内容就很清晰了。
游戏程序的编写非常符合软件中自顶向下的设计思路,先有功能和需求,在分析实现。
当然,实际上需要实现的技术细节是肯定比分析的内容要多的,很多地方在仔细思考后会发现很多的小问题,这些都是需要在后续的测试中发现并完善的。