1. 程式人生 > 其它 >20212212顏瑞淋 實驗四 Python綜合實踐

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 for column in range(0, 10)] for row in range(0, 22)]設定遊戲背景為0-9列,0-21行;

設定初始背景所有格子為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 random
block_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解決方案:可以在程式碼中的這部分改變視窗大小

pygame.init() screen = pygame.display.set_mode(     (400, 800)#視窗大小

 #學號 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 for column in range(0, 10)] for row in range(0, 22)]設定遊戲背景為0-9列,0-21行;

設定初始背景所有格子為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 random
block_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解決方案:可以在程式碼中的這部分改變視窗大小

pygame.init() screen = pygame.display.set_mode(     (400, 800)#視窗大小

但由於不同電腦上可見的視窗大小不同,就不做更改

- 問題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