Pygame实现记忆拼图游戏3

在游戏启动时,需要设置游戏中图案的初始排列,该功能由自定义函数getRandomizedBoard()实现。

1 按顺序产生游戏所需的不同图案

在getRandomizedBoard()中,首先按顺序产生游戏中所需的不同图案。在《Pygame实现记忆拼图游戏2》中提到,游戏中所用的7种颜色保存在ALLCOLORS中,所用的5种形状保存在ALLSHAPES中,通过for循环可以实现7×5=35种组合,代码如图1所示。

Pygame实现记忆拼图游戏3_第1张图片

图1 按顺序产生游戏所需图案的代码

其中,第20-21行代码使用for循环的嵌套生成35种组合,第22行代码按照“形状 颜色”的格式,将这35种组合以元组的方式保存到icons中。使用调试代码打印出icons的值如图2所示。

Pygame实现记忆拼图游戏3_第2张图片

图2 icons的值

从图2中可以看出,列表icons中有35个元素,每个元素都是一个元组,该元组中包含两个元素,第一个元素是表示形状的字符串,第二个元素是表示颜色的RGB。

2 随机产生游戏所需的所有图案

在《Pygame实现记忆拼图游戏2》中提到,游戏所需的不同图案有35种,而这35种图案是成对出现的,因此游戏所需的所有图案的个数是35×2=70种。在按顺序产生了游戏所需的不同图案之后,通过图3所示代码,随机产生游戏所需的所有图案。

Pygame实现记忆拼图游戏3_第3张图片

图3 随机产生游戏所需的所有图案的代码

其中,第24行代码通过random模块中的shuffle()函数打乱icons中元素的位置;之后第25行代码得到游戏所需的不同图案的数量,BOARDWIDTH表示游戏中图案的列数,BOARDHEIGHT表示游戏中图案的行数,因为这些图案是成对出现的,因此int(BOARDWIDTH * BOARDHEIGHT / 2)表示游戏中所需的不同图案的数量,保存在变量numIconsUsed中;第26行代码在所提供的所有不同图案中,截取游戏所需的图案,并且将截取到的图案×2,得到游戏所需的所有图案;最后第27行代码再次打乱图案的顺序。此时的icons中包含了70个图2所示的元组值。

3 将随机产生的图案按指定行列数进行排列

在得到了70个图案icons之后,将这70个图案按照指定了行数BOARDHEIGHT和的指定的列数BOARDWIDTH进行排列,即将70个图案排成7行10列,代码如图4所示。

Pygame实现记忆拼图游戏3_第4张图片

图4 将随机产生的图案按指定行列数进行排列的代码

其中,board即为图案排列后的列表,第32行代码使用for循环逐列处理图案;第33行代码定义的column表示一列图案;第34-36行代码使用for循环将icons中的图案加入到column中,第34行for循环结束后,column中包含了BOARDHEIGHT即7个图案,第37行代码将这7个图案作为一组添加到board中。当两个for循环结束后,board的类型为二维数组,包含10个子列表,每个子列表包含7个元组表示的图案。调试代码运行效果如图5所示。

Pygame实现记忆拼图游戏3_第5张图片

图5 board中的数据

图5中红框部分为board中的一个元素,可以看到该元素是一个列表,包含了7个元组,而每个元组表示一个图案。红框中的元素即为游戏界面中一列图案,而board包含10个与红框类似的数据。

4 调用getRandomizedBoard()函数

在main()函数中,调用getRandomizedBoard()函数,代码如图6所示。

图6 调用getRandomizedBoard()函数的代码

其中,由getRandomizedBoard()函数创建的游戏所需的70个图案,就保存在变量mainBoard中。

5 getRandomizedBoard()函数的完整代码

getRandomizedBoard()函数的完整代码如下所示。

def getRandomizedBoard():
    icons = []
    for color in ALLCOLORS:
        for shape in ALLSHAPES:
            icons.append( (shape, color) )
            
    random.shuffle(icons) 
    numIconsUsed = int(BOARDWIDTH * BOARDHEIGHT / 2) 
    icons = icons[:numIconsUsed] * 2 
    random.shuffle(icons)

    board = []
    for x in range(BOARDWIDTH):
        column = []
        for y in range(BOARDHEIGHT):
            column.append(icons[0])
            del icons[0] 
        board.append(column)
    return board

你可能感兴趣的:(#,记忆拼图游戏的编写,pygame,python,开发语言,python游戏编程,python游戏代码)