Developing a Tetris game with python(四)

Tetris

##算法(三)——碰撞检测 判断当前方块是否与其他方块或网格边界发生碰撞。

通常通过遍历当前方块的每个单元格,检查它在网格中的对应位置是否已经被占用。

 
def peng():
    """碰撞检测函数"""
    size = len(listcard)
    for i in range(size):
        for j in range(size):
            if listcard[i][j] == 1:
                # 假设检测旋转后会不会超出右边界或底部边界
                if j + 1 >= size or i + 1 >= size:
                    return True
                # 检查旋转后是否与其他方块重叠
                if new_listcard[j][size - 1 - i] == 1:#此时还未旋转,所以直接用1来判断新的列表是否被1占用。
                    return True
    return False
 
 
#...
  if not peng():
                    chang_90()#此时才开始旋转。新列表0,才会变成1。
 

5、行消除(Line Clearing): 通过遍历网格的每一行,检查是否有行被完全填满,如果填满则将该行消除并上移所有上面的行,同时增加玩家的得分。

 
def clearline():
    """行消除函数"""
    size = len(listcard)
    for i in range(size):
        if all(listcard[i]):  #遍历 listcard 的每一行,如果这一行都为1,则删除这行
            # 如果填满,则删除这一行
            listcard.pop(i)
            # 在顶部插入一个新空行
            listcard.insert(0, [0] * size)
    pprint.pprint(listcard, width=50)
 

6、游戏结束判断(Game Over Detection): 当新生成的方块无法放置在网格中(顶部位置已经被占用)时,判定游戏结束。包括用户主动退出。

a. 游戏结束的判断 当一个新的方块生成时,检查它的顶部位置是否已经被其他方块占用。如果占用,则游戏结束。

b. 用户主动退出 监听用户输入,如按下特定键(例如 q 键)时,主动退出游戏并显示“游戏结束”信息。

 
def gameover():
    """游戏结束函数"""
    print("Game Over!")
    exit()  # 退出程序
 
def check_gameover():
    """检查游戏是否结束"""
    # 判断是否有方块占据了顶部位置
    if any(listcard[0]):#意味着,顶部这一行的任何位置有方块(值为 1),触发游戏结束。
        gameover()
 
check_gameover()  # 每次循环都检查是否游戏结束
check_gameover()  #循环结束时,行消除后再次检查
 
elif user_input.lower() == 'q':
                gameover()  # 用户主动结束游戏