隨著遊戲產業的蓬勃發展,使用 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()

內容解密:

  1. 更新蛇的位置:根據使用者的輸入(如鍵盤按鍵),更新蛇的垂直位置 y1
  2. 畫出食物:使用 Pygame 的 draw.rect 函式畫出食物的位置和大小。
  3. 更新蛇的頭部位置:根據蛇的移動,更新蛇的頭部位置 snake_Head
  4. 更新蛇的身體列表:將蛇的頭部位置加入蛇的身體列表 snake_List 中。
  5. 檢查身體長度:如果蛇的身體長度超過目前的長度,則移除蛇身體的最前端。
  6. 檢查是否與自身碰撞:遍歷蛇的身體列表,檢查是否有任何部分與蛇的頭部位置相同,如果相同,則表示蛇與自身碰撞,遊戲結束。
  7. 畫出蛇的身體:使用 our_snake 函式畫出蛇的身體。
  8. 更新分數:根據蛇的身體長度更新分數。
  9. 更新遊戲畫面:使用 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 版本

  1. 點選右上角的選單圖示。
  2. 點選「幫助」,然後點選「關於 Google Chrome」。
  3. 可以在這裡找到 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 在語音轉文字、影像識別等領域的應用將更加廣泛,也將催生更多創新應用。