1. 程式人生 > 其它 >20212214 《Python程式設計》實驗四 Python綜合實踐實驗報告

20212214 《Python程式設計》實驗四 Python綜合實踐實驗報告

 20212214 《Python程式設計》實驗四 Python綜合實踐實驗報告

課程:        《Python程式設計》
班級:        2122
姓名:        蔣貞志
學號:        20212214
實驗教師:  王志強
實驗日期:  2022年5月25日
必修/選修: 公選課

實驗內容

Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。

注:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現

一、實驗程式

       (一)、實驗專案內容

                          運用Python寫 “ 俄羅斯方塊 ” 小遊戲 。以前喜歡玩一些小遊戲,其中俄羅斯方塊帶來很多樂趣,所以想自己來看看怎麼用Python程式碼執行俄羅斯方塊小遊戲.

      (二)、實驗專案實現過程

                         首先購買華為雲伺服器

                  然後,由於我是寫遊戲,於是我在雲端上先下載好pygame

由於需要在雲端上執行,在嘗試幾次在雲端上執行程式碼之後,發現不行,詢問同學,發現要下載xming,xterm配置遠端桌面

安裝好xming之後,在雲端上建立一個新的目錄,我將程式碼上傳至雲端

配置好xlaunch之後,在雲端Xming上執行自己的程式碼命令 

在本機上執行程式碼

(三)程式碼分析過程

               核心思路:

                  1.影象由“核心變數”完全控制,影象變化的本質是 變數的改變。

                  2,自上而下式的思考,影象變化的問題將一步步轉為 一系列具體的變數修改。

                         匯入pygame遊戲模組,sys模組,time模組。

然後建立畫面

方塊

是否開始,當start = True,game_over = True 時,才顯示 GAME OVER 計算消除 計算得分  旋轉,這是我遇到的最大的麻煩,手機資料,發現很多其他人執行的都是不可以旋轉的,缺乏體驗,所以,觀看教程視訊,不斷收集資料 最終實現旋轉, 在形狀設計的時候做了很多的空白,這樣只需要規定整個形狀包括空白部分全部在遊戲區域內時才可以旋轉

按向下的鍵是加速,不用旋轉。

畫當前下落方塊 畫背景

  

 填充背景色 畫遊戲區域分隔線 畫已經落下的方塊 畫單個方塊

 最後畫得分等資訊

最後完善匯入的庫函式

方塊形狀的設計,最初我是做成 4 × 4,因為長寬最長都是4,這樣旋轉的時候就不考慮怎麼轉了,就是從一個圖形替換成另一個   其實要實現這個功能,只需要固定左上角的座標就可以了   我們先完成旋轉,然後檢查旋轉後的俄羅斯方塊是否與已有方塊重合,如果有,則再讓方塊逆方向旋轉一次。最後繪製旋轉後的俄羅斯方塊。   在blocks裡匯入random

根據自己以前觀看的俄羅斯方塊,來畫不同種類的方塊

“s”形方塊

Z形方塊 I型方塊 O型方塊 J型方塊 L型方塊 T型方塊

原始碼

import sys import time import pygame from pygame.locals import * import blocks
SIZE = 30   BLOCK_HEIGHT = 25   BLOCK_WIDTH = 10    BORDER_WIDTH = 4    BORDER_COLOR = (40, 40, 200)  SCREEN_WIDTH = SIZE * (BLOCK_WIDTH + 5)   SCREEN_HEIGHT = SIZE * BLOCK_HEIGHT       BG_COLOR = (40, 40, 60)   BLOCK_COLOR = (20, 128, 200)   BLACK = (0, 0, 0) RED = (200, 30, 30)      # GAME OVER 的字型顏色

def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):     imgText = font.render(text, True, fcolor)     screen.blit(imgText, (x, y))

def main():     pygame.init()     screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))     pygame.display.set_caption('俄羅斯方塊')
    font1 = pygame.font.SysFont('SimHei', 24)  # 黑體24     font2 = pygame.font.Font(None, 72)  # GAME OVER 的字型     font_pos_x = BLOCK_WIDTH * SIZE + BORDER_WIDTH + 10  # 右側資訊顯示區域字型位置的X座標     gameover_size = font2.size('GAME OVER')     font1_height = int(font1.size('得分')[1])
    cur_block = None   # 當前下落方塊     next_block = None  # 下一個方塊     cur_pos_x, cur_pos_y = 0, 0
    game_area = None         game_over = True     start = False           score = 0                orispeed = 0.5          speed = orispeed         pause = False          last_drop_time = None        last_press_time = None  
    def _dock():         nonlocal cur_block, next_block, game_area, cur_pos_x, cur_pos_y, game_over, score, speed         for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):             for _j in range(cur_block.start_pos.X, cur_block.end_pos.X + 1):                 if cur_block.template[_i][_j] != '.':                     game_area[cur_pos_y + _i][cur_pos_x + _j] = '0'         if cur_pos_y + cur_block.start_pos.Y <= 0:             game_over = True         else:             # 計算消除             remove_idxs = []             for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):                 if all(_x == '0' for _x in game_area[cur_pos_y + _i]):                     remove_idxs.append(cur_pos_y + _i)             if remove_idxs:                 # 計算得分                 remove_count = len(remove_idxs)                 if remove_count == 1:                     score += 100                 elif remove_count == 2:                     score += 300                 elif remove_count == 3:                     score += 700                 elif remove_count == 4:                     score += 1500                 speed = orispeed - 0.03 * (score // 10000)                 # 消除                 _i = _j = remove_idxs[-1]                 while _i >= 0:                     while _j in remove_idxs:                         _j -= 1                     if _j < 0:                         game_area[_i] = ['.'] * BLOCK_WIDTH                     else:                         game_area[_i] = game_area[_j]                     _i -= 1                     _j -= 1             cur_block = next_block             next_block = blocks.get_block()             cur_pos_x, cur_pos_y = (BLOCK_WIDTH - cur_block.end_pos.X - 1) // 2, -1 - cur_block.end_pos.Y
    def _judge(pos_x, pos_y, block):         nonlocal game_area         for _i in range(block.start_pos.Y, block.end_pos.Y + 1):             if pos_y + block.end_pos.Y >= BLOCK_HEIGHT:                 return False             for _j in range(block.start_pos.X, block.end_pos.X + 1):                 if pos_y + _i >= 0 and block.template[_i][_j] != '.' and game_area[pos_y + _i][pos_x + _j] != '.':                     return False         return True
    while True:         for event in pygame.event.get():             if event.type == QUIT:                 sys.exit()             elif event.type == KEYDOWN:                 if event.key == K_RETURN:                     if game_over:                         start = True                         game_over = False                         score = 0                         last_drop_time = time.time()                         last_press_time = time.time()                         game_area = [['.'] * BLOCK_WIDTH for _ in range(BLOCK_HEIGHT)]                         cur_block = blocks.get_block()                         next_block = blocks.get_block()                         cur_pos_x, cur_pos_y = (BLOCK_WIDTH - cur_block.end_pos.X - 1) // 2, -1 - cur_block.end_pos.Y                 elif event.key == K_SPACE:                     if not game_over:                         pause = not pause                 elif event.key in (K_w, K_UP):                                         if 0 <= cur_pos_x <= BLOCK_WIDTH - len(cur_block.template[0]):                         _next_block = blocks.get_next_block(cur_block)                         if _judge(cur_pos_x, cur_pos_y, _next_block):                             cur_block = _next_block
        if event.type == pygame.KEYDOWN:             if event.key == pygame.K_LEFT:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         if cur_pos_x > - cur_block.start_pos.X:                             if _judge(cur_pos_x - 1, cur_pos_y, cur_block):                                 cur_pos_x -= 1             if event.key == pygame.K_RIGHT:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         # 不能移除右邊框                         if cur_pos_x + cur_block.end_pos.X + 1 < BLOCK_WIDTH:                             if _judge(cur_pos_x + 1, cur_pos_y, cur_block):                                 cur_pos_x += 1             if event.key == pygame.K_DOWN:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         if not _judge(cur_pos_x, cur_pos_y + 1, cur_block):                             _dock()                         else:                             last_drop_time = time.time()                             cur_pos_y += 1
        _draw_background(screen)
        _draw_game_area(screen, game_area)
        _draw_gridlines(screen)
        _draw_info(screen, font1, font_pos_x, font1_height, score)         # 畫顯示資訊中的下一個方塊         _draw_block(screen, next_block, font_pos_x, 30 + (font1_height + 6) * 5, 0, 0)
        if not game_over:             cur_drop_time = time.time()             if cur_drop_time - last_drop_time > speed:                 if not pause:                     if not _judge(cur_pos_x, cur_pos_y + 1, cur_block):                         _dock()                     else:                         last_drop_time = cur_drop_time                         cur_pos_y += 1         else:             if start:                 print_text(screen, font2,                            (SCREEN_WIDTH - gameover_size[0]) // 2, (SCREEN_HEIGHT - gameover_size[1]) // 2,                            'GAME OVER', RED)
          _draw_block(screen, cur_block, 0, 0, cur_pos_x, cur_pos_y)
        pygame.display.flip()

# 畫背景 def _draw_background(screen):     # 填充背景色     screen.fill(BG_COLOR)     # 畫遊戲區域分隔線     pygame.draw.line(screen, BORDER_COLOR,                      (SIZE * BLOCK_WIDTH + BORDER_WIDTH // 2, 0),                      (SIZE * BLOCK_WIDTH + BORDER_WIDTH // 2, SCREEN_HEIGHT), BORDER_WIDTH)

# 畫網格線 def _draw_gridlines(screen):     # 畫網格線 豎線     for x in range(BLOCK_WIDTH):         pygame.draw.line(screen, BLACK, (x * SIZE, 0), (x * SIZE, SCREEN_HEIGHT), 1)     # 畫網格線 橫線     for y in range(BLOCK_HEIGHT):         pygame.draw.line(screen, BLACK, (0, y * SIZE), (BLOCK_WIDTH * SIZE, y * SIZE), 1)

# 畫已經落下的方塊 def _draw_game_area(screen, game_area):     if game_area:         for i, row in enumerate(game_area):             for j, cell in enumerate(row):                 if cell != '.':                     pygame.draw.rect(screen, BLOCK_COLOR, (j * SIZE, i * SIZE, SIZE, SIZE), 0)

# 畫單個方塊 def _draw_block(screen, block, offset_x, offset_y, pos_x, pos_y):     if block:         for i in range(block.start_pos.Y, block.end_pos.Y + 1):             for j in range(block.start_pos.X, block.end_pos.X + 1):                 if block.template[i][j] != '.':                     pygame.draw.rect(screen, BLOCK_COLOR,                                      (offset_x + (pos_x + j) * SIZE, offset_y + (pos_y + i) * SIZE, SIZE, SIZE), 0)

# 畫得分等資訊 def _draw_info(screen, font, pos_x, font_height, score):     print_text(screen, font, pos_x, 10, f'得分: ')     print_text(screen, font, pos_x, 10 + font_height + 6, f'{score}')     print_text(screen, font, pos_x, 20 + (font_height + 6) * 2, f'速度: ')     print_text(screen, font, pos_x, 20 + (font_height + 6) * 3, f'{score // 10000}')     print_text(screen, font, pos_x, 30 + (font_height + 6) * 4, f'下一個:')

if __name__ == '__main__':     main()     在本機上執行結果

 

在雲端上執行結果

 

二、 實驗過程中遇到的問題和解決過程

問題一:不會將Python程式碼上傳至雲伺服器

解決方法:詢問已經學會的同學,通過觀看bibi上面的視訊,成功將程式碼上傳至雲端。

問題二:雲端上沒有螢幕,不能執行自己的小遊戲

解決方法:詢問同學,安裝Xming。

問題三:Xming在雲伺服器上執行失敗

解決方法:觀看視訊,在網上查詢資料,詢問基礎好的同學。成功解決問題

自己沒有更新,執行 systemctl restart sshd.service 命令

三、對Python全課的總結與感想體會

上個學期,選Python是因為我覺得這個學期需要學C,可以二者相互補充,相互提高。

學了之後,Python和C還是有很大的區別。

程式碼層面看C與python所謂不同程式語言,在程式碼層面來看,主要不同之處在於它們的語法規則,掌握了一種程式語言的語法規則,就可以寫出一種程式碼。

C語言中有原始檔、目標檔案、可執行檔案這些概念,python中只有指令碼及直譯器 。

在王志強老師的教授下,我也學會了很多Python知識。Python知識特點就不過多贅述。

首先,學習任何語言,都得勤加練習,Python課程之前我查詢過資料書,之前就已經接觸過一點,在上Python課的期間,我也練習Python程式碼編寫。

 初步認識Python,到python語言基礎,流程控制語句,序列的應用,字串與正則表示式,函式,面向物件程式設計,檔案操作及異常處理,Python操作資料庫,

Python網路程式設計及爬蟲開發。在經過一個學期Python課程的學習,我對Python也有了一定的掌握。

通過志強老師佈置的幾次實驗任務,也使我對Python技能更加熟悉,在幾次實驗的操作過程中,我也遇到了各種不同的麻煩,但最後也是通過詢問其他同學,上網搜查資料,最終實現程式碼的執行,完成實驗。一次次的實驗,使我面對不同問題,不再害怕,嘗試去解決問題,尋找各種方案去解決問題。通過使用自己的各種手段最終解決問題,最後獲得的也是很大的滿足感。很高興選擇了Python課程,在這裡我學到了很多東西與技能。

Python課程的意見和建議

老師上課的程式碼可以分享到班群裡面,可能會有同學上課來不及跟上老師的節奏,將程式碼發群裡面可以讓同學更好地學習,參考與借鑑。

參考資料:

_tkinter.TclError: no display name and no $DISPLAY environment variable - 簡書 (jianshu.com)

(1條訊息) 華為鯤鵬雲伺服器上安裝Python-3.6.2並安裝第三方庫詳細步驟_半樹海棠的部落格-CSDN部落格_華為雲安裝python

(1條訊息) wsl安裝xrdp(視覺化介面並遠端),解決閃退、黑屏_daboluo520的部落格-CSDN部落格_xrdp 黑屏閃退

 

Xming-6-9-0-31-setup.exe_免費高速下載|百度網盤-分享無限制 (baidu.com)

                          

課程:        《Python程式設計》
班級:        2122
姓名:        蔣貞志
學號:        20212214
實驗教師:  王志強
實驗日期:  2022年5月25日
必修/選修: 公選課

實驗內容

Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。

注:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現

一、實驗程式

       (一)、實驗專案內容

                          運用Python寫 “ 俄羅斯方塊 ” 小遊戲 。以前喜歡玩一些小遊戲,其中俄羅斯方塊帶來很多樂趣,所以想自己來看看怎麼用Python程式碼執行俄羅斯方塊小遊戲.

      (二)、實驗專案實現過程

                         首先購買華為雲伺服器

                  然後,由於我是寫遊戲,於是我在雲端上先下載好pygame

由於需要在雲端上執行,在嘗試幾次在雲端上執行程式碼之後,發現不行,詢問同學,發現要下載xming,xterm配置遠端桌面

安裝好xming之後,在雲端上建立一個新的目錄,我將程式碼上傳至雲端

配置好xlaunch之後,在雲端Xming上執行自己的程式碼命令 

在本機上執行程式碼

(三)程式碼分析過程

               核心思路:

                  1.影象由“核心變數”完全控制,影象變化的本質是 變數的改變。

                  2,自上而下式的思考,影象變化的問題將一步步轉為 一系列具體的變數修改。

                         匯入pygame遊戲模組,sys模組,time模組。

然後建立畫面

方塊

是否開始,當start = True,game_over = True 時,才顯示 GAME OVER 計算消除 計算得分  旋轉,這是我遇到的最大的麻煩,手機資料,發現很多其他人執行的都是不可以旋轉的,缺乏體驗,所以,觀看教程視訊,不斷收集資料 最終實現旋轉, 在形狀設計的時候做了很多的空白,這樣只需要規定整個形狀包括空白部分全部在遊戲區域內時才可以旋轉

按向下的鍵是加速,不用旋轉。

畫當前下落方塊 畫背景

  

 填充背景色 畫遊戲區域分隔線 畫已經落下的方塊 畫單個方塊

 最後畫得分等資訊

最後完善匯入的庫函式

方塊形狀的設計,最初我是做成 4 × 4,因為長寬最長都是4,這樣旋轉的時候就不考慮怎麼轉了,就是從一個圖形替換成另一個   其實要實現這個功能,只需要固定左上角的座標就可以了   我們先完成旋轉,然後檢查旋轉後的俄羅斯方塊是否與已有方塊重合,如果有,則再讓方塊逆方向旋轉一次。最後繪製旋轉後的俄羅斯方塊。   在blocks裡匯入random

根據自己以前觀看的俄羅斯方塊,來畫不同種類的方塊

“s”形方塊

Z形方塊 I型方塊 O型方塊 J型方塊 L型方塊 T型方塊

原始碼

import sys import time import pygame from pygame.locals import * import blocks
SIZE = 30   BLOCK_HEIGHT = 25   BLOCK_WIDTH = 10    BORDER_WIDTH = 4    BORDER_COLOR = (40, 40, 200)  SCREEN_WIDTH = SIZE * (BLOCK_WIDTH + 5)   SCREEN_HEIGHT = SIZE * BLOCK_HEIGHT       BG_COLOR = (40, 40, 60)   BLOCK_COLOR = (20, 128, 200)   BLACK = (0, 0, 0) RED = (200, 30, 30)      # GAME OVER 的字型顏色

def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):     imgText = font.render(text, True, fcolor)     screen.blit(imgText, (x, y))

def main():     pygame.init()     screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))     pygame.display.set_caption('俄羅斯方塊')
    font1 = pygame.font.SysFont('SimHei', 24)  # 黑體24     font2 = pygame.font.Font(None, 72)  # GAME OVER 的字型     font_pos_x = BLOCK_WIDTH * SIZE + BORDER_WIDTH + 10  # 右側資訊顯示區域字型位置的X座標     gameover_size = font2.size('GAME OVER')     font1_height = int(font1.size('得分')[1])
    cur_block = None   # 當前下落方塊     next_block = None  # 下一個方塊     cur_pos_x, cur_pos_y = 0, 0
    game_area = None         game_over = True     start = False           score = 0                orispeed = 0.5          speed = orispeed         pause = False          last_drop_time = None        last_press_time = None  
    def _dock():         nonlocal cur_block, next_block, game_area, cur_pos_x, cur_pos_y, game_over, score, speed         for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):             for _j in range(cur_block.start_pos.X, cur_block.end_pos.X + 1):                 if cur_block.template[_i][_j] != '.':                     game_area[cur_pos_y + _i][cur_pos_x + _j] = '0'         if cur_pos_y + cur_block.start_pos.Y <= 0:             game_over = True         else:             # 計算消除             remove_idxs = []             for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):                 if all(_x == '0' for _x in game_area[cur_pos_y + _i]):                     remove_idxs.append(cur_pos_y + _i)             if remove_idxs:                 # 計算得分                 remove_count = len(remove_idxs)                 if remove_count == 1:                     score += 100                 elif remove_count == 2:                     score += 300                 elif remove_count == 3:                     score += 700                 elif remove_count == 4:                     score += 1500                 speed = orispeed - 0.03 * (score // 10000)                 # 消除                 _i = _j = remove_idxs[-1]                 while _i >= 0:                     while _j in remove_idxs:                         _j -= 1                     if _j < 0:                         game_area[_i] = ['.'] * BLOCK_WIDTH                     else:                         game_area[_i] = game_area[_j]                     _i -= 1                     _j -= 1             cur_block = next_block             next_block = blocks.get_block()             cur_pos_x, cur_pos_y = (BLOCK_WIDTH - cur_block.end_pos.X - 1) // 2, -1 - cur_block.end_pos.Y
    def _judge(pos_x, pos_y, block):         nonlocal game_area         for _i in range(block.start_pos.Y, block.end_pos.Y + 1):             if pos_y + block.end_pos.Y >= BLOCK_HEIGHT:                 return False             for _j in range(block.start_pos.X, block.end_pos.X + 1):                 if pos_y + _i >= 0 and block.template[_i][_j] != '.' and game_area[pos_y + _i][pos_x + _j] != '.':                     return False         return True
    while True:         for event in pygame.event.get():             if event.type == QUIT:                 sys.exit()             elif event.type == KEYDOWN:                 if event.key == K_RETURN:                     if game_over:                         start = True                         game_over = False                         score = 0                         last_drop_time = time.time()                         last_press_time = time.time()                         game_area = [['.'] * BLOCK_WIDTH for _ in range(BLOCK_HEIGHT)]                         cur_block = blocks.get_block()                         next_block = blocks.get_block()                         cur_pos_x, cur_pos_y = (BLOCK_WIDTH - cur_block.end_pos.X - 1) // 2, -1 - cur_block.end_pos.Y                 elif event.key == K_SPACE:                     if not game_over:                         pause = not pause                 elif event.key in (K_w, K_UP):                                         if 0 <= cur_pos_x <= BLOCK_WIDTH - len(cur_block.template[0]):                         _next_block = blocks.get_next_block(cur_block)                         if _judge(cur_pos_x, cur_pos_y, _next_block):                             cur_block = _next_block
        if event.type == pygame.KEYDOWN:             if event.key == pygame.K_LEFT:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         if cur_pos_x > - cur_block.start_pos.X:                             if _judge(cur_pos_x - 1, cur_pos_y, cur_block):                                 cur_pos_x -= 1             if event.key == pygame.K_RIGHT:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         # 不能移除右邊框                         if cur_pos_x + cur_block.end_pos.X + 1 < BLOCK_WIDTH:                             if _judge(cur_pos_x + 1, cur_pos_y, cur_block):                                 cur_pos_x += 1             if event.key == pygame.K_DOWN:                 if not game_over and not pause:                     if time.time() - last_press_time > 0.1:                         last_press_time = time.time()                         if not _judge(cur_pos_x, cur_pos_y + 1, cur_block):                             _dock()                         else:                             last_drop_time = time.time()                             cur_pos_y += 1
        _draw_background(screen)
        _draw_game_area(screen, game_area)
        _draw_gridlines(screen)
        _draw_info(screen, font1, font_pos_x, font1_height, score)         # 畫顯示資訊中的下一個方塊         _draw_block(screen, next_block, font_pos_x, 30 + (font1_height + 6) * 5, 0, 0)
        if not game_over:             cur_drop_time = time.time()             if cur_drop_time - last_drop_time > speed:                 if not pause:                     if not _judge(cur_pos_x, cur_pos_y + 1, cur_block):                         _dock()                     else:                         last_drop_time = cur_drop_time                         cur_pos_y += 1         else:             if start:                 print_text(screen, font2,                            (SCREEN_WIDTH - gameover_size[0]) // 2, (SCREEN_HEIGHT - gameover_size[1]) // 2,                            'GAME OVER', RED)
          _draw_block(screen, cur_block, 0, 0, cur_pos_x, cur_pos_y)
        pygame.display.flip()

# 畫背景 def _draw_background(screen):     # 填充背景色     screen.fill(BG_COLOR)     # 畫遊戲區域分隔線     pygame.draw.line(screen, BORDER_COLOR,                      (SIZE * BLOCK_WIDTH + BORDER_WIDTH // 2, 0),                      (SIZE * BLOCK_WIDTH + BORDER_WIDTH // 2, SCREEN_HEIGHT), BORDER_WIDTH)

# 畫網格線 def _draw_gridlines(screen):     # 畫網格線 豎線     for x in range(BLOCK_WIDTH):         pygame.draw.line(screen, BLACK, (x * SIZE, 0), (x * SIZE, SCREEN_HEIGHT), 1)     # 畫網格線 橫線     for y in range(BLOCK_HEIGHT):         pygame.draw.line(screen, BLACK, (0, y * SIZE), (BLOCK_WIDTH * SIZE, y * SIZE), 1)

# 畫已經落下的方塊 def _draw_game_area(screen, game_area):     if game_area:         for i, row in enumerate(game_area):             for j, cell in enumerate(row):                 if cell != '.':                     pygame.draw.rect(screen, BLOCK_COLOR, (j * SIZE, i * SIZE, SIZE, SIZE), 0)

# 畫單個方塊 def _draw_block(screen, block, offset_x, offset_y, pos_x, pos_y):     if block:         for i in range(block.start_pos.Y, block.end_pos.Y + 1):             for j in range(block.start_pos.X, block.end_pos.X + 1):                 if block.template[i][j] != '.':                     pygame.draw.rect(screen, BLOCK_COLOR,                                      (offset_x + (pos_x + j) * SIZE, offset_y + (pos_y + i) * SIZE, SIZE, SIZE), 0)

# 畫得分等資訊 def _draw_info(screen, font, pos_x, font_height, score):     print_text(screen, font, pos_x, 10, f'得分: ')     print_text(screen, font, pos_x, 10 + font_height + 6, f'{score}')     print_text(screen, font, pos_x, 20 + (font_height + 6) * 2, f'速度: ')     print_text(screen, font, pos_x, 20 + (font_height + 6) * 3, f'{score // 10000}')     print_text(screen, font, pos_x, 30 + (font_height + 6) * 4, f'下一個:')

if __name__ == '__main__':     main()     在本機上執行結果

 

在雲端上執行結果

 

二、 實驗過程中遇到的問題和解決過程

問題一:不會將Python程式碼上傳至雲伺服器

解決方法:詢問已經學會的同學,通過觀看bibi上面的視訊,成功將程式碼上傳至雲端。

問題二:雲端上沒有螢幕,不能執行自己的小遊戲

解決方法:詢問同學,安裝Xming。

問題三:Xming在雲伺服器上執行失敗

解決方法:觀看視訊,在網上查詢資料,詢問基礎好的同學。成功解決問題

自己沒有更新,執行 systemctl restart sshd.service 命令

三、對Python全課的總結與感想體會

上個學期,選Python是因為我覺得這個學期需要學C,可以二者相互補充,相互提高。

學了之後,Python和C還是有很大的區別。

程式碼層面看C與python所謂不同程式語言,在程式碼層面來看,主要不同之處在於它們的語法規則,掌握了一種程式語言的語法規則,就可以寫出一種程式碼。

C語言中有原始檔、目標檔案、可執行檔案這些概念,python中只有指令碼及直譯器 。

在王志強老師的教授下,我也學會了很多Python知識。Python知識特點就不過多贅述。

首先,學習任何語言,都得勤加練習,Python課程之前我查詢過資料書,之前就已經接觸過一點,在上Python課的期間,我也練習Python程式碼編寫。

 初步認識Python,到python語言基礎,流程控制語句,序列的應用,字串與正則表示式,函式,面向物件程式設計,檔案操作及異常處理,Python操作資料庫,

Python網路程式設計及爬蟲開發。在經過一個學期Python課程的學習,我對Python也有了一定的掌握。

通過志強老師佈置的幾次實驗任務,也使我對Python技能更加熟悉,在幾次實驗的操作過程中,我也遇到了各種不同的麻煩,但最後也是通過詢問其他同學,上網搜查資料,最終實現程式碼的執行,完成實驗。一次次的實驗,使我面對不同問題,不再害怕,嘗試去解決問題,尋找各種方案去解決問題。通過使用自己的各種手段最終解決問題,最後獲得的也是很大的滿足感。很高興選擇了Python課程,在這裡我學到了很多東西與技能。

Python課程的意見和建議

老師上課的程式碼可以分享到班群裡面,可能會有同學上課來不及跟上老師的節奏,將程式碼發群裡面可以讓同學更好地學習,參考與借鑑。

參考資料:

_tkinter.TclError: no display name and no $DISPLAY environment variable - 簡書 (jianshu.com)

(1條訊息) 華為鯤鵬雲伺服器上安裝Python-3.6.2並安裝第三方庫詳細步驟_半樹海棠的部落格-CSDN部落格_華為雲安裝python

(1條訊息) wsl安裝xrdp(視覺化介面並遠端),解決閃退、黑屏_daboluo520的部落格-CSDN部落格_xrdp 黑屏閃退

 

Xming-6-9-0-31-setup.exe_免費高速下載|百度網盤-分享無限制 (baidu.com)