象棋小游戏(pygame)棋子随机摆布

点击查看象棋小游戏系列目录导航

在上一篇博客中,我们实现了需求的分析,流程图,以及框架的搭建,这一篇,我们正式开始具体功能的实现
先上一张效果图:

这里写图片描述

需要做的任务:
1、让32 个棋子随机排布(给他们随机的位置),把棋子绘制到棋盘的相应位置。

分析:我们要实现这个功能必须有三步

  • 创建 32 个对象
  • 让这32个对象随机排布(给他们不同的位置)

刚开始想到两个解决思路:

  1. 先创建32个对象,然后循环产生随机的行列,通过不同的行列给对象随机位置
  2. 循环棋盘位置,随机取出对象,给该对象当前位置

第一种思路难点在于产生的行列可能会重复,我们需要去判断,因为会重复,所以循环的次数不确定,剩下的对象越少,无用的循环次数就越多,不好。
第二种思路的难点在于随机取出对象,瓶颈与第一种方式一样。

最终发现,如果我们可以得到乱序的对象数组,然后直接一个一个放到棋盘中,这应该是最好的方法了。
好了,现在问题集中在如何得到乱序的对象数组。翻阅api,发现新大陆。

    # 产生随机数 0-31
    resultList = random.sample(range(0,32), 32);

有了这个方法我们就可以给对象随机的位置,然后得到乱序的对象数组了,好了,写代码

# 创建对象数组
# 象棋 1*将 + 2*(士+象+马+车+炮)+ 5 * 兵 = 一共16子*2 = 32 子
chess_class = [] #[shi_chess,xiang_chess,ma_chess,che_chess,pao_chess]*2
for j in range(2):
    for i in range(2):
        chess_class.append(ChessPieces.ShiChess(bg_rect))
        chess_class.append(ChessPieces.XiangChess(bg_rect))
        chess_class.append(ChessPieces.MaChess(bg_rect))
        chess_class.append(ChessPieces.CheChess(bg_rect))
        chess_class.append(ChessPieces.PaoChess(bg_rect))

    chess_class.append(ChessPieces.JiangChess(bg_rect))
    for i in range(5):
        chess_class.append(ChessPieces.ZuChess(bg_rect))

# 一半的棋子为黑色
for i in range(len(chess_class)//2):
    chess_class[i].role = ChessPieces.BLACK_ROLE

# 获得乱序对象数组
def getChessList():
    # 产生随机数 0-31
    resultList = random.sample(range(0,32), 32);
    j = 0;
    #print('chess_class 的长度 %d  resultList 的长度 %d' % (len(chess_class),len(resultList)))
    for i in resultList:
        #print((i,j,chess_class[j].type))
        chess_class[j].position = (86+(i%4)*90, \
                                   66+((i//4))*71)
        chess_class[j].rect.left = 86+(i%4)*90
        chess_class[j].rect.top = 66+((i//4))*71
        #print(chess_class[j].position)
        j+=1
    return chess_class

上边的 86 和 66 指的是左上角棋盘正方形格子的左上角的坐标。
获得乱序对象数组时,棋子的位置需要做一个计算,逻辑如下:计算有些许偏差(单位为像素)
这里写图片描述

思路,根据得到的随机值,计算所在的行和列,计算出坐标,给对象赋坐标。

猜你喜欢

转载自blog.csdn.net/chenxiaoping1993/article/details/80191768