赞
踩
======================= 大爽歌作,made by big shuang =======================
最后,要实现俄罗斯方块的消除,就是当一行满了的时候,需要消除这行,同时在通过窗口标题展示得分情况
这里需要添加check_row_completed
方法判断指定行是否可以消除
同时添加check_and_clear
方法检查所有行并消除
而消除之后,我们需要在画板上重新绘制一遍消除后剩余的俄罗斯方块
这里最好将之前的draw_blank_board
方法修改为,可以绘制面板上残留的俄罗斯方块的方法,方法名改为draw_board
修改代码如下
# 绘制面板,将draw_blank_board方法修改成如下方法 def draw_board(canvas, block_list): for ri in range(R): for ci in range(C): cell_type = block_list[ri][ci] if cell_type: draw_cell_by_cr(canvas, ci, ri, SHAPESCOLOR[cell_type]) else: draw_cell_by_cr(canvas, ci, ri) # 在原有的rotate_block方法(外)下面添加 def check_row_complete(row): for cell in row: if cell=='': return False return True score = 0 win.title("SCORES: %s" % score) # 标题中展示分数 def check_and_clear(): has_complete_row =False for ri in range(len(block_list)): if check_row_complete(block_list[ri]): has_complete_row = True # 当前行可消除 if ri > 0: for cur_ri in range(ri, 0, -1): block_list[cur_ri] = block_list[cur_ri-1][:] block_list[0] = ['' for j in range(C)] else: block_list[ri] = ['' for j in range(C)] global score score += 10 if has_complete_row: draw_board(canvas, block_list) win.title("SCORES: %s" % score)
同时将原有的这两行代码
draw_blank_board(canvas)
block_list = []
for i in range(R):
i_row = ['' for j in range(C)]
block_list.append(i_row)
修改成
block_list = []
for i in range(R):
i_row = ['' for j in range(C)]
block_list.append(i_row)
draw_board(canvas, block_list)
再在game_loop
方法内部的current_block = None
语句后添加下面语句
check_and_clear()
一般来说,当新的俄罗斯方块无法移动时,游戏就算game over
了
这里的判断机制是,新生成的俄罗斯方块已经无法在出生点放置了,也就是出生点都已经被之前的固定的方块占用了,就算游戏结束。
在代码文件开头添加
from tkinter import messagebox
再修改game_loop
方法如下就好
def game_loop(): win.update() global current_block if current_block is None: new_block = generate_new_block() # 新生成的俄罗斯方块需要先在生成位置绘制出来 draw_block_move(canvas, new_block) current_block = new_block if not check_move(current_block, [0, 0]): messagebox.showinfo("Game Over!", "Your Score is %s" % score) win.destroy() return else: if check_move(current_block, [0, 1]): draw_block_move(canvas, current_block, [0, 1]) else: # 无法移动,记入 block_list 中 save_block_to_list(current_block) current_block = None check_and_clear() win.after(FPS, game_loop)
到这里,俄罗斯方块基础版就算完成了
最终代码已上传到github:
https://github.com/BigShuang/Tetris/blob/master/1_BASIC/004.py
最终效果见本人b站投稿简介
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。