200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python tkinter实现俄罗斯方块基础版——四 消除与得分

python tkinter实现俄罗斯方块基础版——四 消除与得分

时间:2023-03-31 03:09:17

相关推荐

python tkinter实现俄罗斯方块基础版——四 消除与得分

总目录

一、基础界面

二、界面动起来

三、生成、移动、固定、消除

四、消除与得分

======================= 大爽歌作,made by big shuang =======================

1、消除与得分

最后,要实现俄罗斯方块的消除,就是当一行满了的时候,需要消除这行,同时在通过窗口标题展示得分情况

这里需要添加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 Falsereturn Truescore = 0win.title("SCORES: %s" % score) # 标题中展示分数def check_and_clear():has_complete_row =Falsefor 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 scorescore += 10if 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_blockif current_block is None:new_block = generate_new_block()# 新生成的俄罗斯方块需要先在生成位置绘制出来draw_block_move(canvas, new_block)current_block = new_blockif not check_move(current_block, [0, 0]):messagebox.showinfo("Game Over!", "Your Score is %s" % score)win.destroy()returnelse: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 = Nonecheck_and_clear()win.after(FPS, game_loop)

到这里,俄罗斯方块基础版就算完成了

最终代码已上传到github:

/BigShuang/Tetris/blob/master/1_BASIC/004.py

最终效果见本人b站投稿简介

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。