20212212顏瑞淋 實驗四 Python綜合實踐
20212212顏瑞淋 實驗四《Python程式設計》實驗報告
#學號 20212212《Python程式設計》實驗四報告
課程:《Python程式設計》
班級: 2122
姓名: 顏瑞淋
學號:20212212
實驗教師:王志強
實驗日期:2022年5月23日
必修/選修: 公選課
實驗四
(一)實驗內容
Python綜合應用:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現一個俄羅斯方塊小遊戲。
(二)實驗靈感來源
小時候玩的俄羅斯方塊算得上是一個經典小遊戲,希望可以通過自己的學習研究完成一個簡易版的俄羅斯方塊先遊戲。
(三)實驗過程
1.通過b站,知乎,CSDN部落格等網站學習利用pygame製作python小遊戲的方法
Python pygame是一款專門為開發和設計 2D 電子遊戲而生的軟體包,它支 Windows、Linux、Mac OS 等作業系統,具有良好的跨平臺性,下載安裝它來完成我的遊戲製作。
圖為已經下載好了pygame
2.按步驟開始編輯程式碼
import模組pygame以及random包(隨機庫),以此來實現部分函式的使用
確定遊戲的初始位置,得分,背景等;
設定初始press為False,即沒有按壓鍵盤;
輸入存放俄羅斯方塊形狀的對應座標:
"Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
"O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
"S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
"T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
"I": [(0, 1), (0, 0), (0, -1), (0, -2)],
"L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
"J": [(-1, 0), (0, 0), (0, -1), (0, -2)];
設定初始背景所有格子為0;
第一行格子為1,
即在背景的第一行處隨機產生一個形狀的俄羅斯方塊;
定義一個函式move, 並用if語句來設定函式
draw.rect(畫矩形)用RGB三原色來設定俄羅斯方塊的顏色,設定為橙色,並設定方塊的大小;當方塊在0-19行,0-9列時,如果方塊碰壁了,用RGB三原色來設定俄羅斯方塊的顏色,設定為藍色,並設定方塊的大小;
重新設定初始位置,即改變俄羅斯方塊的位置;
判斷俄羅斯方塊移動後是否會越界,如果越界,退出(break);
否則,清除原有初始位置的俄羅斯方塊,新增俄羅斯方塊的位置為[y_drop, x_move];
rotating_position = [(-column, row) for row, column in select_block]翻轉方塊(順時針翻轉90度);判斷翻轉後的俄羅斯方塊是否會越界,如果越界,退出(break);
否則,清除原有初始位置的俄羅斯方塊,新增俄羅斯方塊的位置為翻轉後的位置;
如果某一行的背景格子均變成了1(即整行均有格子),則整行清除
設定視窗的大小,即遊戲頁面的大小
while True:即設定的press,有按壓鍵盤,為True; if event.type == pygame.QUIT: if event.key == pygame.K_ESCAPE: 如果事件型別為QUIT或者按了Esc鍵,即退出; elif event.key == pygame.K_LEFT: move(-1) elif event.key == pygame.K_RIGHT: move(1) elif event.key == pygame.K_UP: move(0) 如果按了左鍵,即執行函式 move(-1)的情況,判斷是否越界並改變方塊位置, 右鍵,即執行函式 move(1)的情況,判斷是否越界並改變方塊位置, 上鍵,即執行函式 move(0)的情況,即翻轉;如果發生press的情況,times每次加10,當times超過50時,執行move(10)的情況,並將times重新變回0;
否則,times每次加1;
如果gameover,則遊戲退出,執行move(10)的情況;
pygame.time.Clock().tick(300) # tick(300)修改數字可以修改遊戲的整體速率; pygame.display.update();#顯示,如果沒有則為黑屏;3.完成全部程式碼
完整程式碼
import pygame import randomblock_initial_position, score, times, gameover, press, all_block, background = ( [20, 5],#初始位置 [0],#得分 0, [], False, [ [[-1, -1], [0, -1], [0, 0], [1, 0]], [[-1, -1], [0, -1], [-1, 0], [0, 0]], [[-1, 0], [0, 0], [0, -1], [1, -1]], [[-1, 0], [0, 0], [0, -1], [1, 0]], [[0, 1], [0, 0], [0, -1], [0, -2]], [[-1, 0], [0, 0], [-1, -1], [-1, -2]], [[-1, 0], [0, 0], [0, -1], [0, -2]] ], [[0 for column in range(0, 10)] for row in range(0, 22)],#背景0-9列,0-21行 ) background[0], select_block = [1 for column in range(0, 10)], list( random.choice(all_block) )
def move(n): if n == 100: for row, column in select_block: pygame.draw.rect( screen, (255, 165, 0),#顏色 ( (column + block_initial_position[1]) * 40, 800 - (row + block_initial_position[0]) * 40, 38, 38, ), ) for row in range(0, 20): for column in range(0, 10): if background[row][column]: pygame.draw.rect(#藍色 screen, (0, 0, 255), (column * 40, 800 - row * 40, 38, 38) ) y_drop, x_move = block_initial_position if n == 1 or n == -1: x_move += n for row, column in select_block: if ( (column + x_move) < 0 or (column + x_move) > 9 or background[row + y_drop][column + x_move] ): break else: block_initial_position.clear(), block_initial_position.extend( [y_drop, x_move] ) if n == 0: rotating_position = [(-column, row) for row, column in select_block] for row, column in rotating_position: if ( (column + x_move) < 0 or (column + x_move) > 9 or background[row + y_drop][column + x_move] ): break else: select_block.clear(), select_block.extend(rotating_position) if n == 10: y_drop -= 1 for row, column in select_block: if background[row + y_drop][column + x_move] == 1: break else: block_initial_position.clear() block_initial_position.extend([y_drop, x_move]) return for row, column in select_block: background[block_initial_position[0] + row][ block_initial_position[1] + column ] = 1 complete_row = [] for row in range(1, 21): if 0 not in background[row]: complete_row.append(row) complete_row.sort(reverse=True) for row in complete_row: background.pop(row) background.append([0 for column in range(0, 10)]) score[0] += len(complete_row) pygame.display.set_caption( "Tetris,Score:" + str(score[0]) + " Tonymot") select_block.clear(), select_block.extend(list(random.choice(all_block))) block_initial_position.clear(), block_initial_position.extend([20, 4]) for row, column in select_block: if background[row + block_initial_position[0]][ column + block_initial_position[1] ]: gameover.append(1)
pygame.init() screen = pygame.display.set_mode( (400, 800)#視窗大小 ) # set_mode((400,800)) 修改數值可以修改視窗大小 while True: screen.fill((255, 255, 255)) for event in pygame.event.get([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP]): if event.type == pygame.QUIT: quit()#退出,即X號 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: quit()#Esc符號 elif event.key == pygame.K_LEFT: move(-1) elif event.key == pygame.K_RIGHT: move(1) elif event.key == pygame.K_UP: move(0) elif event.key == pygame.K_DOWN: press = True elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN: press = False if press: times += 10 if times >= 50: move(10) times = 0 else: times += 1 if gameover: quit() move(100) pygame.time.Clock().tick(300) # tick(300)修改數字可以修改遊戲的整體速率 pygame.display.update()#顯示,如果沒有則為黑屏 4.執行程式碼
執行成果
5.購買雲伺服器得到自己的公網
上傳原始碼到ECS主機
利用winscp將程式碼檔案上傳到華為雲伺服器上(檔案為A.py)
在putty上登入雲伺服器並執行程式碼
下載pip3
下載pygame
執行檔案,但還是不行……
下載xming,用於圖形的顯示
下載xterm
成功顯示遊戲
實驗過程中遇到的問題和解決過程
- 問題1:在執行程式碼時,生成的遊戲僅可見一部分,上下都被擋掉了
- 問題1解決方案:可以在程式碼中的這部分改變視窗大小
#學號 20212212《Python程式設計》實驗四報告
課程:《Python程式設計》
班級: 2122
姓名: 顏瑞淋
學號:20212212
實驗教師:王志強
實驗日期:2022年5月23日
必修/選修: 公選課
實驗四
(一)實驗內容
Python綜合應用:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現一個俄羅斯方塊小遊戲。
(二)實驗靈感來源
小時候玩的俄羅斯方塊算得上是一個經典小遊戲,希望可以通過自己的學習研究完成一個簡易版的俄羅斯方塊先遊戲。
(三)實驗過程
1.通過b站,知乎,CSDN部落格等網站學習利用pygame製作python小遊戲的方法
Python pygame是一款專門為開發和設計 2D 電子遊戲而生的軟體包,它支 Windows、Linux、Mac OS 等作業系統,具有良好的跨平臺性,下載安裝它來完成我的遊戲製作。
圖為已經下載好了pygame
2.按步驟開始編輯程式碼
import模組pygame以及random包(隨機庫),以此來實現部分函式的使用
確定遊戲的初始位置,得分,背景等;
設定初始press為False,即沒有按壓鍵盤;
輸入存放俄羅斯方塊形狀的對應座標:
"Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
"O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
"S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
"T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
"I": [(0, 1), (0, 0), (0, -1), (0, -2)],
"L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
"J": [(-1, 0), (0, 0), (0, -1), (0, -2)];
設定初始背景所有格子為0;
第一行格子為1,
即在背景的第一行處隨機產生一個形狀的俄羅斯方塊;
定義一個函式move, 並用if語句來設定函式
draw.rect(畫矩形)用RGB三原色來設定俄羅斯方塊的顏色,設定為橙色,並設定方塊的大小;當方塊在0-19行,0-9列時,如果方塊碰壁了,用RGB三原色來設定俄羅斯方塊的顏色,設定為藍色,並設定方塊的大小;
重新設定初始位置,即改變俄羅斯方塊的位置;
判斷俄羅斯方塊移動後是否會越界,如果越界,退出(break);
否則,清除原有初始位置的俄羅斯方塊,新增俄羅斯方塊的位置為[y_drop, x_move];
rotating_position = [(-column, row) for row, column in select_block]翻轉方塊(順時針翻轉90度);判斷翻轉後的俄羅斯方塊是否會越界,如果越界,退出(break);
否則,清除原有初始位置的俄羅斯方塊,新增俄羅斯方塊的位置為翻轉後的位置;
如果某一行的背景格子均變成了1(即整行均有格子),則整行清除
設定視窗的大小,即遊戲頁面的大小
while True:即設定的press,有按壓鍵盤,為True; if event.type == pygame.QUIT: if event.key == pygame.K_ESCAPE: 如果事件型別為QUIT或者按了Esc鍵,即退出; elif event.key == pygame.K_LEFT: move(-1) elif event.key == pygame.K_RIGHT: move(1) elif event.key == pygame.K_UP: move(0) 如果按了左鍵,即執行函式 move(-1)的情況,判斷是否越界並改變方塊位置, 右鍵,即執行函式 move(1)的情況,判斷是否越界並改變方塊位置, 上鍵,即執行函式 move(0)的情況,即翻轉;如果發生press的情況,times每次加10,當times超過50時,執行move(10)的情況,並將times重新變回0;
否則,times每次加1;
如果gameover,則遊戲退出,執行move(10)的情況;
pygame.time.Clock().tick(300) # tick(300)修改數字可以修改遊戲的整體速率; pygame.display.update();#顯示,如果沒有則為黑屏;3.完成全部程式碼
完整程式碼
import pygame import randomblock_initial_position, score, times, gameover, press, all_block, background = ( [20, 5],#初始位置 [0],#得分 0, [], False, [ [[-1, -1], [0, -1], [0, 0], [1, 0]], [[-1, -1], [0, -1], [-1, 0], [0, 0]], [[-1, 0], [0, 0], [0, -1], [1, -1]], [[-1, 0], [0, 0], [0, -1], [1, 0]], [[0, 1], [0, 0], [0, -1], [0, -2]], [[-1, 0], [0, 0], [-1, -1], [-1, -2]], [[-1, 0], [0, 0], [0, -1], [0, -2]] ], [[0 for column in range(0, 10)] for row in range(0, 22)],#背景0-9列,0-21行 ) background[0], select_block = [1 for column in range(0, 10)], list( random.choice(all_block) )
def move(n): if n == 100: for row, column in select_block: pygame.draw.rect( screen, (255, 165, 0),#顏色 ( (column + block_initial_position[1]) * 40, 800 - (row + block_initial_position[0]) * 40, 38, 38, ), ) for row in range(0, 20): for column in range(0, 10): if background[row][column]: pygame.draw.rect(#藍色 screen, (0, 0, 255), (column * 40, 800 - row * 40, 38, 38) ) y_drop, x_move = block_initial_position if n == 1 or n == -1: x_move += n for row, column in select_block: if ( (column + x_move) < 0 or (column + x_move) > 9 or background[row + y_drop][column + x_move] ): break else: block_initial_position.clear(), block_initial_position.extend( [y_drop, x_move] ) if n == 0: rotating_position = [(-column, row) for row, column in select_block] for row, column in rotating_position: if ( (column + x_move) < 0 or (column + x_move) > 9 or background[row + y_drop][column + x_move] ): break else: select_block.clear(), select_block.extend(rotating_position) if n == 10: y_drop -= 1 for row, column in select_block: if background[row + y_drop][column + x_move] == 1: break else: block_initial_position.clear() block_initial_position.extend([y_drop, x_move]) return for row, column in select_block: background[block_initial_position[0] + row][ block_initial_position[1] + column ] = 1 complete_row = [] for row in range(1, 21): if 0 not in background[row]: complete_row.append(row) complete_row.sort(reverse=True) for row in complete_row: background.pop(row) background.append([0 for column in range(0, 10)]) score[0] += len(complete_row) pygame.display.set_caption( "Tetris,Score:" + str(score[0]) + " Tonymot") select_block.clear(), select_block.extend(list(random.choice(all_block))) block_initial_position.clear(), block_initial_position.extend([20, 4]) for row, column in select_block: if background[row + block_initial_position[0]][ column + block_initial_position[1] ]: gameover.append(1)
pygame.init() screen = pygame.display.set_mode( (400, 800)#視窗大小 ) # set_mode((400,800)) 修改數值可以修改視窗大小 while True: screen.fill((255, 255, 255)) for event in pygame.event.get([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP]): if event.type == pygame.QUIT: quit()#退出,即X號 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: quit()#Esc符號 elif event.key == pygame.K_LEFT: move(-1) elif event.key == pygame.K_RIGHT: move(1) elif event.key == pygame.K_UP: move(0) elif event.key == pygame.K_DOWN: press = True elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN: press = False if press: times += 10 if times >= 50: move(10) times = 0 else: times += 1 if gameover: quit() move(100) pygame.time.Clock().tick(300) # tick(300)修改數字可以修改遊戲的整體速率 pygame.display.update()#顯示,如果沒有則為黑屏 4.執行程式碼
執行成果
5.購買雲伺服器得到自己的公網
上傳原始碼到ECS主機
利用winscp將程式碼檔案上傳到華為雲伺服器上(檔案為A.py)
在putty上登入雲伺服器並執行程式碼
下載pip3
下載pygame
執行檔案,但還是不行……
下載xming,用於圖形的顯示
下載xterm
成功顯示遊戲
實驗過程中遇到的問題和解決過程
- 問題1:在執行程式碼時,生成的遊戲僅可見一部分,上下都被擋掉了
- 問題1解決方案:可以在程式碼中的這部分改變視窗大小
但由於不同電腦上可見的視窗大小不同,就不做更改
- 問題2:在使用python3命令執行檔案時,不能執行
- 問題2解決方案:未下載pip3,進行pip3的安裝,並install pygame
- 問題3:執行檔案後不能出現遊戲頁面
- 問題3解決方案:下載xming以及xterm,遠端登入圖形介面
參考資料:https://www.jianshu.com/p/23ba123ee874
https://www.daehub.com/archives/9949.html#:~:text=%E5%85%B6%E4%B8%AD%20PuTTY%20%E6%98%AF%20SSH%20%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%8C%E8%80%8C,Xming%20%E5%88%99%E6%98%AF%20Windows%20%E5%B9%B3%E5%8F%B0%E7%9A%84%20X%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%82
https://www.freesion.com/article/73691086600/
https://www.linuxidc.com/Linux/2017-01/139241.htm
https://pan.baidu.com/s/1wMDA-8zqd8eiu6iGWGPqFQ?_at_=1653577595955