跳至正文
View Categories

2 min read

主要内容 #

    1. 主要功能模块设计说明
    2. 主要功能模块代码部分

1.主要功能模块设计说明 #

该模块主要完成方块的移动与合并的功能,主要包含combinate()函数、up()函数、down()函数、left()函数和right()函数,这些函数的功能描述如下:

combinate()函数用来执行相同方块的合并操作。

up()函数用来对应游戏中用户按下“上”键后,对应向上合并方块的操作。

down()函数用来对应用游戏中户按下“下”键后,对应向下合并方块的操作。

left()函数用来对应游戏中用户按下“左”键后,对应向左合并方块的操作。

right()函数用来对应游戏中用户按下“右”键后,对应向右合并方块的操作。

combinate()函数合并运算设计思想:
要执行一行中相同方块的合并,首先从左到右将这一行的数字们存入一个新的列表ans中:
(1)当ans中有两个数字时,直接将他们相加合并。把相加后的新的一行返回。score加上相应的得分。
(2)当ans中有三个数字时,我们首先判断ans[0]和ans[1]是否相等,相等合并二者;否则判断and[1]和ans[2]。共两种可能合并的情况。再把score加上相应的的得分。
(3)当ans中有四个数字时同理,需要判断ans[0]和ans[1],ans[1]和ans[2],ans[2]和ans[3],有三种可能合并的情况。

向左合并时从上到下一行一行的进行combinate()运算;向右合并时将每一行左右逆序即可;向上合并时从左到右一列一列进行combinate()运算;向下合并时与向上上下逆序即可。

2.主要功能模块代码部分 #

该部分代码如下:

def combinate(L):  # 实现相加操作#此函数的功能是进行方块的合并原理,是本程序的重难点所在
    global score
    ans = [0, 0, 0, 0]
    num = []
    for i in L:
        if i != 0:#把本行中所有的数字放到列表num中去
            num.append(i)
    length = len(num)
    if length == 4:  # 当本行中有4个数字的多种情况
        if num[0] == num[1]:#case1
            ans[0] = num[0] + num[1]
            score += ans[0]
            if num[2] == num[3]:
                ans[1] = num[2] + num[3]
                score += ans[1]
            else:
                ans[1] = num[2]
                ans[2] = num[3]
        elif num[1] == num[2]:#case2
            ans[0] = num[0]
            ans[1] = num[1] + num[2]
            ans[2] = num[3]
            score += ans[1]
        elif num[2] == num[3]:#case3
            ans[0] = num[0]
            ans[1] = num[1]
            ans[2] = num[2] + num[3]
            score += ans[2]
        else:#case4 没有能合并的数字
            for i in range(length):
                ans[i] = num[i]
    elif length == 3:  # 本行中有三个数
        if num[0] == num[1]:#case 1
            ans[0] = num[0] + num[1]
            ans[1] = num[2]
            score += ans[0]
        elif num[1] == num[2]:#case 2
            ans[0] = num[0]
            ans[1] = num[1] + num[2]
            score += ans[1]
        else:#case 3 没有能合并的数字
            for i in range(length):
                ans[i] = num[i]
    elif length == 2:  # 本行中有两个数
        if num[0] == num[1]:#case 1
            ans[0] = num[0] + num[1]
            score += ans[0]
        else:#case 2 没有能合并的数字
            for i in range(length):
                ans[i] = num[i]
    elif length == 1:  # 有一个数
        ans[0] = num[0]
    else:
        pass
    return ans


def left():  #用户按下左键进行的移动
    for i in range(4):
        temp = combinate(board[i])
        for j in range(4):
            board[i][j] = temp[j]


def right(): #用户按下右键进行的移动
    for i in range(4):
        temp = combinate(board[i][::-1])
        for j in range(4):
            board[i][3 - j] = temp[j]


def up():  #用户按下上键进行的移动
    for i in range(4):
        to_comb = []
        for j in range(4):
            to_comb.append(board[j][i])
        temp = combinate(to_comb)
        for k in range(4):
            board[k][i] = temp[k]


def down():  #用户按下下键进行的移动
    for i in range(4):
        to_comb = []
        for j in range(4):
            to_comb.append(board[3 - j][i])
        temp = combinate(to_comb)
        for k in range(4):
            board[3 - k][i] = temp[k]

将以上所有代码加入到上一课创建的项目文件中(该代码请置放在main()函数和is_over()函数中间),运行,发现无任何变化,因为该部分只是定义了主要功能的方法,并未调用该方法。

本小节中的多个方法在当前的逻辑中未去实现,将在后续的代码中完成调用,本小节仅提前完成逻辑的定义。

小结 #

本节主要介绍了2048小游戏程序中的主要功能模块的设计方法以及代码部分,该模块主要完成方块的移动与合并的功能。