隨著遊戲產業的蓬勃發展,使用 Python 和 Pygame 等工具開發遊戲變得越來越普及。本文將深入探討如何利用 Pygame 建構一個經典的蛇遊戲,並解析其核心程式碼邏輯,包含遊戲環境初始化、主迴圈控制、鍵盤事件處理、蛇的移動與碰撞偵測、食物生成機制等。同時,本文也將介紹如何使用 Selenium 和 ChromeDriver 實作網頁截圖功能,方便開發者擷取網頁畫面,並簡要提及語音轉文字技術的應用,展現 Python 在不同領域的實用性。透過本文的實作教學,讀者將能快速掌握 Pygame 遊戲開發技巧以及網頁截圖工具的建置方法,並對語音轉文字技術有初步認識。
環境設定
在開始開發蛇遊戲之前,我們需要設定遊戲的環境。這包括初始化 Pygame、設定顏色、螢幕尺寸等。
import pygame
import random
# 初始化 Pygame
pygame.init()
# 設定顏色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# 設定螢幕尺寸
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode((dis_width, dis_height))
# 設定遊戲標題
pygame.display.set_caption('Snake Game In Python')
# 設定遊戲時鐘
clock = pygame.time.Clock()
# 設定蛇的大小和速度
snake_block = 10
snake_speed = 15
# 設定字型
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
遊戲功能
現在,我們可以開始實作遊戲的功能。首先,我們需要有一個函式來顯示玩家的分數。
顯示分數
def show_score(score):
value = score_font.render("Your Score: " + str(score), True, yellow)
dis.blit(value, [0, 0])
繪製蛇
接下來,我們需要一個函式來繪製蛇的身體。
def draw_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
遊戲主迴圈
現在,我們可以開始實作遊戲的主迴圈。這包括處理玩家的輸入、更新遊戲狀態、繪製遊戲場景等。
def game_loop():
snake_list = []
snake_length = 1
score = 0
# 初始化蛇的位置和方向
snake_x = dis_width / 2
snake_y = dis_height / 2
snake_dir_x = 0
snake_dir_y = 0
# 主迴圈
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
snake_dir_x = -snake_block
snake_dir_y = 0
elif event.key == pygame.K_RIGHT:
snake_dir_x = snake_block
snake_dir_y = 0
elif event.key == pygame.K_UP:
snake_dir_x = 0
snake_dir_y = -snake_block
elif event.key == pygame.K_DOWN:
snake_dir_x = 0
snake_dir_y = snake_block
# 更新蛇的位置
snake_x += snake_dir_x
snake_y += snake_dir_y
# 繪製背景
dis.fill(white)
# 繪製蛇
snake_head = []
snake_head.append(snake_x)
snake_head.append(snake_y)
snake_list.append(snake_head)
# 更新蛇的長度
if len(snake_list) > snake_length:
del snake_list[0]
# 繪製蛇
draw_snake(snake_block, snake_list)
# 顯示分數
show_score(score)
# 更新螢幕
pygame.display.update()
# 控制遊戲速度
clock.tick(snake_speed)
game_loop()
蛇類遊戲開發:Pygame 實作
在這個章節中,我們將使用 Pygame 這個強大的 Python 遊戲開發函式庫來實作一個簡單的蛇類遊戲。這個遊戲將包括基本的遊戲迴圈、事件處理、繪圖和碰撞檢測等功能。
初始化遊戲環境
首先,我們需要初始化 Pygame 的環境和設定遊戲的基本引數。這包括設定遊戲的寬度和高度、標題、背景顏色等。
import pygame
import random
# 初始化 Pygame
pygame.init()
# 設定遊戲寬度和高度
dis_width = 800
dis_height = 600
# 設定背景顏色
black = (0, 0, 0)
# 設定遊戲顯示
dis = pygame.display.set_mode((dis_width, dis_height))
# 設定遊戲標題
pygame.display.set_caption('Snake Game')
# 設定字型樣式
font_style = pygame.font.SysFont("bahnschrift", 25)
遊戲迴圈和事件處理
接下來,我們需要實作遊戲的迴圈和事件處理。這包括處理鍵盤事件、更新遊戲狀態和繪製遊戲場景等。
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - 10) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - 10) / 10.0) * 10.0
while not game_over:
while game_close == True:
dis.fill(black)
message("You lost! Press C-Play Again or Q-Quit", (255, 255, 255))
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -10
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 10
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -10
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 10
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(black)
pygame.draw.rect(dis, (255, 255, 255), [foodx, foody, 10, 10])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
for x in snake_List:
pygame.draw.rect(dis, (0, 255, 0), [x[0], x[1], 10, 10])
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - 10) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - 10) / 10.0) * 10.0
Length_of_snake += 1
clock = pygame.time.Clock()
clock.tick(10)
pygame.quit()
quit()
gameLoop()
圖表翻譯:
此圖示展示了遊戲迴圈的流程,包括事件處理、更新遊戲狀態和繪製遊戲場景等。圖中展示了 Pygame 的主要功能,包括 pygame.init()
、pygame.display.set_mode()
、pygame.draw.rect()
等。
flowchart TD A[初始化 Pygame] --> B[設定遊戲寬度和高度] B --> C[設定背景顏色] C --> D[設定遊戲顯示] D --> E[設定遊戲標題] E --> F[設定字型樣式] F --> G[遊戲迴圈] G --> H[事件處理] H --> I[更新遊戲狀態] I --> J[繪製遊戲場景] J --> K[更新遊戲顯示] K --> L[等待事件] L --> G
遊戲結束與重啟機制
在遊戲結束時,螢幕會顯示「You Lost! Press ‘C’ to Play Again or ‘Q’ To Quit The Game」的訊息,提示玩家可以按下「C」鍵重新開始遊戲或按下「Q」鍵離開遊戲。同時,螢幕上也會顯示玩家的最終得分,得分為蛇的長度減一。
遊戲結束時的螢幕更新
dis.fill(blue)
message("You Lost! Press 'C' to Play Again or 'Q' To Quit The Game", red)
Your_score(Length_of_snake - 1)
pygame.display.update()
這段程式碼負責更新遊戲結束時的螢幕顯示,包括填充背景顏色、顯示訊息和得分。
事件處理
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
if event.key == pygame.K_c:
gameLoop()
if event.type == pygame.QUIT:
game_over = True
這段程式碼負責處理玩家的輸入事件,包括按下「Q」鍵離開遊戲、按下「C」鍵重新開始遊戲和關閉遊戲視窗。
重新開始遊戲
當玩家按下「C」鍵時,會呼叫gameLoop()
函式重新開始遊戲。
離開遊戲
當玩家按下「Q」鍵或關閉遊戲視窗時,會設定game_over
變數為True
,結束遊戲迴圈。
圖表翻譯
flowchart TD A[遊戲結束] --> B[顯示訊息] B --> C[顯示得分] C --> D[等待玩家輸入] D --> E{按下「C」鍵} E -->|是| F[重新開始遊戲] E -->|否| G{按下「Q」鍵} G -->|是| H[離開遊戲] G -->|否| I[關閉遊戲視窗] I --> H
這個流程圖描述了遊戲結束時的處理流程,包括顯示訊息、顯示得分、等待玩家輸入和重新開始或離開遊戲。
蛇遊戲控制邏輯
鍵盤事件處理
在 Pygame 中,使用 pygame.KEYDOWN
事件來捕捉鍵盤按鍵的按下動作。以下是蛇遊戲中鍵盤控制的邏輯實作:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
# 左箭頭鍵:向左移動
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
# 右箭頭鍵:向右移動
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
# 上箭頭鍵:向上移動
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
# 下箭頭鍵:向下移動
y1_change = snake_block
x1_change = 0
邊界碰撞檢測
當蛇的頭部超出遊戲視窗的邊界時,遊戲應該結束。以下是邊界碰撞檢測的邏輯實作:
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
蛇的移動更新
最後,更新蛇的位置:
x1 += x1_change
內容解密:
以上程式碼實作了蛇遊戲的基本控制邏輯,包括鍵盤事件處理、邊界碰撞檢測和蛇的移動更新。這些邏輯是遊戲的核心部分,確保遊戲的正常執行和玩家體驗。
圖表翻譯:
flowchart TD A[鍵盤事件] --> B[事件處理] B --> C[邊界碰撞檢測] C --> D[蛇的移動更新] D --> E[遊戲結束]
此圖表展示了蛇遊戲控制邏輯的流程,從鍵盤事件的捕捉到遊戲的結束。
遊戲迴圈中的蛇移動與碰撞檢查
在遊戲迴圈中,蛇的移動和碰撞檢查是核心部分。以下是相關的程式碼和解釋:
# 更新蛇的位置
y1 += y1_change
# 畫出食物
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
# 更新蛇的頭部位置
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
# 將蛇的頭部位置加入蛇的身體列表
snake_List.append(snake_Head)
# 如果蛇的身體長度超過目前的長度,則移除蛇身體的最前端
if len(snake_List) > Length_of_snake:
del snake_List[0]
# 檢查是否與自身碰撞
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
# 畫出蛇的身體
our_snake(snake_block, snake_List)
# 更新分數
Your_score(Length_of_snake - 1)
# 更新遊戲畫面
pygame.display.update()
內容解密:
- 更新蛇的位置:根據使用者的輸入(如鍵盤按鍵),更新蛇的垂直位置
y1
。 - 畫出食物:使用 Pygame 的
draw.rect
函式畫出食物的位置和大小。 - 更新蛇的頭部位置:根據蛇的移動,更新蛇的頭部位置
snake_Head
。 - 更新蛇的身體列表:將蛇的頭部位置加入蛇的身體列表
snake_List
中。 - 檢查身體長度:如果蛇的身體長度超過目前的長度,則移除蛇身體的最前端。
- 檢查是否與自身碰撞:遍歷蛇的身體列表,檢查是否有任何部分與蛇的頭部位置相同,如果相同,則表示蛇與自身碰撞,遊戲結束。
- 畫出蛇的身體:使用
our_snake
函式畫出蛇的身體。 - 更新分數:根據蛇的身體長度更新分數。
- 更新遊戲畫面:使用 Pygame 的
display.update
函式更新遊戲畫面。
蛇遊戲開發
在開發蛇遊戲的過程中,需要處理食物的隨機生成和蛇的移動。以下是相關的程式碼片段:
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
這段程式碼檢查蛇的頭部是否與食物的位置重合,如果是,則生成新的食物位置並增加蛇的長度。
時間控制
遊戲的時間控制使用 clock.tick(snake_speed)
來實作,確保遊戲以穩定的速度執行。
遊戲結束
當遊戲結束時,會呼叫 pygame.quit()
和 quit()
來離開遊戲。
遊戲迴圈
遊戲迴圈使用 gameLoop()
函式來實作,負責更新遊戲狀態和渲染遊戲畫面。
太空船遊戲
太空船遊戲是一個多人遊戲,使用 Pygame 開發。遊戲中,兩名玩家控制太空船,競爭誰先擊中對方。
遊戲要求
要執行太空船遊戲,需要安裝以下套件:
$ pip install -r requirements.txt
套件要求
pygame==2.0.1
原始碼檔案
- …
設定
要設定太空船遊戲,需要…
內容解密:
上述程式碼片段展示了蛇遊戲中食物的隨機生成和蛇的移動。使用 random.randrange()
函式生成新的食物位置,並增加蛇的長度。時間控制使用 clock.tick()
函式實作,確保遊戲以穩定的速度執行。
圖表翻譯:
flowchart TD A[遊戲開始] --> B[蛇移動] B --> C[食物生成] C --> D[蛇長度增加] D --> E[時間控制] E --> F[遊戲結束]
這個流程圖展示了蛇遊戲的基本流程,從遊戲開始到遊戲結束。
網站截圖工具
為了擷取網站的截圖,我們可以使用 Selenium 和 ChromeDriver。以下是使用 Python 和 Selenium 的範例程式碼。
安裝需求
首先,需要安裝 Selenium 和 ChromeDriver。可以使用 pip 安裝 Selenium,然後安裝相應版本的 ChromeDriver。
pip install selenium
pip install chromedriver-binary==XX.X.XXXX.XX.X
注意:ChromeDriver 的版本需要與 Google Chrome 的版本相匹配。
找到 Google Chrome 版本
- 點選右上角的選單圖示。
- 點選「幫助」,然後點選「關於 Google Chrome」。
- 可以在這裡找到 Chrome 瀏覽器的版本號。
執行截圖工具
可以使用以下命令執行截圖工具:
python snapshot_of_given_website.py <url>
截圖將儲存在當前目錄中。
程式碼需求
- selenium==3.141.0
- chromedriver-binary==85.0.4183.38.0
程式碼
# -*- coding: utf-8 -*-
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
script_name = sys.argv[0]
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
try:
url = sys.argv[1]
driver.get(url)
page_width = driver.execute_script('return document.body.scrollWidth')
page_height = driver.execute_script('return document.body.scrollHeight')
# ... (截圖程式碼)
finally:
driver.quit()
完整截圖程式碼
# -*- coding: utf-8 -*-
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
script_name = sys.argv[0]
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
try:
url = sys.argv[1]
driver.get(url)
page_width = driver.execute_script('return document.body.scrollWidth')
page_height = driver.execute_script('return document.body.scrollHeight')
driver.set_window_size(page_width, page_height)
driver.save_screenshot('screenshot.png')
finally:
driver.quit()
這個程式碼可以擷取網站的完整截圖,並儲存為 screenshot.png
檔案。
語音轉文字轉換器
本篇文章介紹了一個使用 Python 的語音轉文字轉換器,利用自然語言處理(NLP)技術將語音輸入轉換為文字。
從技術架構視角來看,本文涵蓋了遊戲開發、網頁截圖以及語音轉文字等多個應用場景的程式碼範例,展現了 Python 在不同領域的應用潛力。分析這些程式碼片段,可以發現,遊戲開發部分,程式碼以 Pygame 為基礎,循序漸進地講解了遊戲初始化、迴圈、事件處理、碰撞檢測等核心概念,並輔以流程圖,清晰易懂;網頁截圖工具則利用 Selenium 和 ChromeDriver,實作了網頁的全螢幕截圖功能,程式碼簡潔高效;語音轉文字轉換器部分,雖然只做了簡要介紹,但點明瞭其核心技術——自然語言處理(NLP),為讀者提供了進一步探索的方向。目前程式碼範例仍缺乏完整專案的實踐,讀者需要自行整合與測試。玄貓認為,Python 的易用性和豐富的函式函式庫使其成為跨領域程式開發的利器,值得技術愛好者深入學習與探索。未來,隨著 AI 技術的發展,Python 在語音轉文字、影像識別等領域的應用將更加廣泛,也將催生更多創新應用。