pygame判断鼠标左键_pygame教程(八):数字华容道游戏

前言

前两章我们学习了游戏的初步实战,利用所学的知识编写了一个记忆迷宫小游戏,较综合地练习了用pygame开发游戏的流程及相关的知识,这一章,我们继续进入游戏实战,利用所学的知识开发一个“数字华容道”小游戏。

数字华容道简介

喜欢玩智力游戏的同学们应该会熟悉这个玩法,以通常的4阶为例,即在4X4的方格中填写1~15共15个数字棋子,空出一个方格,通过不断移动棋子,将所有数字按顺序从小到大排列完毕,下面动画是我们游戏完成的最终形态:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第1张图片

如果有看过《最强大脑》的同学,应该还记得在有一季选拔赛中,就有用《数字华容道》这道题目来选拔选手。在本章,我们将来学习如何用pygame来开发这一款小游戏。

游戏思路

作为游戏开发者,自然不只是要研究如何去解答题目,而是要对游戏各种意外进行分析并编写相应代码来规范用户输入行为,下面列举一下这个游戏的开发步骤:

  1. 绘制背景及初始布局。

  2. 根据数字序列的逆序数奇偶性来生成新题目。

  3. 处理键盘四个方向键的响应。

  4. 处理鼠标点击响应。

  5. 计时、计步并进行结束判断。

  6. 保存玩家成绩。

疑难问题处理

计算数字序列的奇偶性

需要注意的是:并不是任意生成的随机数列均存在答案,由于初始空位的存在位置及生成数列的逆序数奇偶性,需要对这些情况进行一一计算,我们可固定初始位置于位4X4方格的右下角,在这种情况下,只需要保证1~15这十五个数随机生成序列的逆序数为偶数即可,计算逆序数的函数如下:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第2张图片

构建数字棋子节点

由于每个数字棋子需要记录其位置、显示其上数字以及记录其将移动的方向,所以可将每一个棋子元素设计为如下形式:

m = [位置数据,数字,可移动标记]

因为每个数字棋子最多只有四个方向可移动,且其每一次只可能有一个移动方向,所以这里将可移动标记设为'0000'字符串,分别代表“左上右下”位置,当每个位置上变为1时,即代表相关的位置可移动,比如'0100'即代表该数字棋子可向上移动,假如此时玩家按下“向上”键时,该棋子即向上移动一格。

代码如下:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第3张图片

以上代码完成了题目的生成,该函数所带参数是区分初始状态和解题状态。

查找可移动的数字棋子

当我们固定了一个空位后,需要即时计算出该空位四周的数字棋子,并将其可移动方向标记下来,这个应该不困难,根据行、列加减1后即可判断,代码如下:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第4张图片

由于我们设置的标记是字符串,每次变更需要对其进行修改,这段代码还可以优化。

移动棋子到空位并交换

当玩家按下方向键后,需要判断当前是否有数字棋子可供移动,若有,则将可移动棋子与空位交换,此时用动画处理,代码如下:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第5张图片

需要注意的是,对于列表而言,交换其两个元素,需要直接引用列表,这样才能交换列表中两元素的次序。

处理键盘和鼠标事件

处理方向键比较容易,这一点在上一次游戏中我们有专门讲述,这里只列举一段代码,有练习过的同学很容易看明白:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第6张图片

对于鼠标的处理,上一章中,我们直接获取鼠标的位置,自己写了代码来检测当前鼠标是否在相关方块上点击,这一次我们采取另一种更有效的方法,即直接可用pygame.Rectcollidepoint方法,如果鼠标在该区域点击,该方法返回True,否则返回False。代码如下:

pygame判断鼠标左键_pygame教程(八):数字华容道游戏_第7张图片

细心的同学应该注意到键盘和鼠标的响应我们调用的是同一个函数,因为这部分功能是相同的,所以可将其单独提取出来成一个函数,这将起到代码重用的作用。

小结

在本章,我们讲述了如何开发一个“数字华容道”的基本步骤,其中有部分功能与上一个记忆迷宫的游戏类似,本章只对部分关键内容进行了讲解,当然在游戏开发过程中还有不少的开关变量需要设置,这一部分内容细琐繁杂,短短一篇文章很难表述清楚,有愿意进一步了解的可在公众号内留言。


其它教程:

pygame教程(一):基础知识

pygame教程(二):绘制几何图形

pygame教程(三):动画初步

pygame教程(四):添加文字和播放声音

pygame教程(五):添加鼠标和键盘响应

pygame教程(六):迷宫小游戏(1)

pygame教程(七):迷宫小游戏(2)

你可能感兴趣的:(pygame判断鼠标左键,pygame小游戏代码,pygame游戏,pygame游戏作品代码)