##算法(三)——碰撞检测 判断当前方块是否与其他方块或网格边界发生碰撞。
通常通过遍历当前方块的每个单元格,检查它在网格中的对应位置是否已经被占用。
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() # 用户主动结束游戏