總目錄
一、基礎界面
二、界面動起來
三、生成、移動、固定、消除
四、消除與得分
======================= 大爽歌作,made by big shuang =======================
0、思路
要讓遊戲界面動起來,需要實現兩點
- 1-定時刷新頁面
- 2-移動頁面內部的俄羅斯方塊
這塊說一下,光實現一的話理論上頁面也算動起來了,但是如果界面內容不變,每次新的頁面和舊的界面看起來是一樣的,給人的觀看感覺跟沒有動沒有區別
所以必須要實現2,來更改界面內容,給人“動”起來的感覺
1、定時刷新頁面
實現定時刷新頁面,很簡單
寫一個方法用於循環刷新,再定時調用
此部分代碼寫在原來代碼最後的win.mainloop
之前就好
FPS = 500 # 刷新頁面的毫秒間隔
def game_loop():
win.update()
# ===用於展示刷新,後續會刪掉===
import time
print(time.ctime())
# ===========================
win.after(FPS, game_loop)
win.update()
win.after(FPS, game_loop) # 在FPS 毫秒後調用 game_loop方法
此時運行發現命令行中會有如下輸出,說明這個頁面確實是每隔500ms刷新了一次
Thu Nov 28 23:32:50 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:51 2019
Thu Nov 28 23:32:52 2019
Thu Nov 28 23:32:52 2019
Thu Nov 28 23:32:53 2019
Thu Nov 28 23:32:53 2019
但是由於我之前說的,每次刷新後頁面的內容是沒有變化的,給觀衆的感覺還是更沒動一樣
所以需要配合每次刷新,移動俄羅斯方塊的位置
2、移動俄羅斯方塊
對於某個俄羅斯方塊,要繪製出來需要知道它的位置和類型,以及內部的各個方格。
這三個數據可以用字典存起來,這裏我們規定格式如下
a_block = {
'kind': 'O', # 對應俄羅斯方塊的類型
'cell_list': SHAPES['O'], # 對應俄羅斯方塊的各個方格
'cr': [3, 3] # 對應橫縱座標,以左上角爲原點,水平向右爲橫座標軸正方向,豎直向下爲縱座標軸正方向
}
此時一個這樣的字典其實就可以看做一個俄羅斯方塊對象
然後我們再建一個專門的方法draw_block_move
,來繪製俄羅斯方塊的移動
其實移動也比較簡單,就是清掉舊位置已經繪製的俄羅斯方塊,再在新位置繪製新的俄羅斯方塊就好
然後修改下game_loop
方法
更新修改部分如下
# 在draw_blank_board(canvas)語句下面添加如下語句
def draw_block_move(canvas, block, direction=[0, 0]):
"""
繪製向指定方向移動後的俄羅斯方塊
:param canvas: 畫板
:param block: 俄羅斯方塊對象
:param direction: 俄羅斯方塊移動方向
:return:
"""
shape_type = block['kind']
c, r = block['cr']
cell_list = block['cell_list']
# 移動前,先清除原有位置繪製的俄羅斯方塊,也就是用背景色繪製原有的俄羅斯方塊
draw_cells(canvas, c, r, cell_list)
dc, dr = direction
new_c, new_r = c+dc, r+dr
block['cr'] = [new_c, new_r]
# 在新位置繪製新的俄羅斯方塊就好
draw_cells(canvas, new_c, new_r, cell_list, SHAPESCOLOR[shape_type])
a_block = {
'kind': 'O', # 對應俄羅斯方塊的類型
'cell_list': SHAPES['O'], # 對應俄羅斯方塊的各個方格
'cr': [3, 3] # 對應橫縱座標,以左上角爲原點,水平向右爲橫座標軸正方向,豎直向下爲縱座標軸正方向
}
draw_block_move(canvas, a_block)
# 修改原來的game_loop方法如下
def game_loop():
win.update()
down = [0, 1]
draw_block_move(canvas, a_block, down)
win.after(FPS, game_loop)
此時的完整代碼已上傳github,點擊查看,運行代碼就發現界面中的俄羅斯方塊動起來了,動畫如下