python tkinter實現俄羅斯方塊基礎版——二、界面動起來

總目錄

一、基礎界面

二、界面動起來

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

四、消除與得分

======================= 大爽歌作,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,點擊查看,運行代碼就發現界面中的俄羅斯方塊動起來了,動畫如下
在這裏插入圖片描述

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