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 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方法內部的win.after(FPS, game_loop)語句之前添加下面語句

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)

到這裏,俄羅斯方塊基礎版就算完成了
最終效果見本人b站投稿簡介

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章