“跳一跳”是微信裏的經典小遊戲,玩法簡單卻很上癮:玩家需要控制小方塊在不同的平台上跳躍,跳得越準越高分。今天,我們用 Python 來實現一個簡易版本,讓你掌握 遊戲開發基礎、物理模擬和事件交互 的核心技巧。


一、工具選擇

Python 開發小遊戲常用庫:

  • Pygame:Python 遊戲開發的標準庫,支持圖形、音效、鍵盤鼠標操作
  • Tkinter:Python 內置 GUI 庫,也可以做簡單遊戲
  • Arcade:Python 的現代遊戲庫,簡潔高效

本文使用 Pygame,因為功能強大、易上手。

安裝 Pygame:

pip install pygame

二、遊戲邏輯分析

“跳一跳”的核心邏輯包括:

  1. 角色與平台

    • 角色:一個可跳躍的方塊
    • 平台:小方塊或圓形的平台,隨機排列
  2. 跳躍機制

    • 跳躍高度與按鍵時間(長按)成正比
    • 水平移動根據上一個平台位置動態調整
  3. 得分與判定

    • 跳到平台中心越接近中心得分越高
    • 跳空或落在平台外判定失敗

三、代碼實現

下面給出一個簡化版的跳一跳遊戲示例:

import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 屏幕大小
WIDTH, HEIGHT = 400, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Python 跳一跳")

# 顏色定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)

# FPS
clock = pygame.time.Clock()
FPS = 60

# 平台類
class Platform:
    def __init__(self, x, y, width=60, height=10):
        self.rect = pygame.Rect(x, y, width, height)
    def draw(self):
        pygame.draw.rect(screen, BLUE, self.rect)

# 小方塊類
class Player:
    def __init__(self):
        self.rect = pygame.Rect(WIDTH//2, HEIGHT-50, 30, 30)
        self.vel_y = 0
        self.is_jumping = False
        self.jump_start = 0
    def draw(self):
        pygame.draw.rect(screen, RED, self.rect)
    def jump(self, power):
        self.vel_y = -power
        self.is_jumping = True
    def update(self):
        self.vel_y += 0.5  # 重力
        self.rect.y += self.vel_y
        if self.rect.bottom > HEIGHT:
            self.rect.bottom = HEIGHT
            self.is_jumping = False
            self.vel_y = 0

# 初始化玩家和平台
player = Player()
platforms = [Platform(random.randint(50, WIDTH-100), HEIGHT - 30)]

# 遊戲主循環
score = 0
running = True
jump_power = 0

while running:
    screen.fill(WHITE)
    
    # 事件處理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                jump_power = 0
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_SPACE:
                player.jump(jump_power)
    
    # 按鍵長按計算跳躍力度
    keys = pygame.key.get_pressed()
    if keys[pygame.K_SPACE]:
        jump_power += 0.2
        if jump_power > 15:
            jump_power = 15

    # 更新玩家狀態
    player.update()
    
    # 平台繪製
    for plat in platforms:
        plat.draw()
        # 簡單碰撞判定
        if player.rect.colliderect(plat.rect) and player.vel_y > 0:
            player.rect.bottom = plat.rect.top
            player.vel_y = 0
            player.is_jumping = False
            score += 1

    # 繪製玩家
    player.draw()

    # 顯示分數
    font = pygame.font.SysFont(None, 36)
    text = font.render(f"Score: {score}", True, BLACK)
    screen.blit(text, (10, 10))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
sys.exit()

四、核心實現點解析

  1. 跳躍機制

    • jump_power 隨空格長按累加
    • player.jump(jump_power) 設置垂直速度,實現跳躍
  2. 重力與落地判定

    • vel_y += 0.5 模擬重力
    • 撞到平台或地面時重置速度
  3. 平台碰撞判定

    • pygame.Rect.colliderect() 判斷玩家是否落在平台上
    • 成功落地增加分數
  4. 動態平台生成

    • 示例中只有一個平台
    • 可通過 random.randint 動態生成多個不同高度的平台,提高難度

五、可擴展功能

  1. 豐富平台類型:移動平台、消失平台
  2. 音效和粒子效果:增強遊戲體驗
  3. 關卡與難度:隨着分數增加平台間距和高度變化
  4. 觸控或鼠標操作:模擬微信版長按跳躍

六、總結

通過這個簡單示例,我們掌握了:

  • Python 遊戲開發基礎(Pygame 初始化、主循環、事件處理)
  • 物理模擬(重力、跳躍、碰撞檢測)
  • 動態遊戲元素生成(平台隨機生成)

從這裏出發,你可以不斷擴展功能,最終做出一個完整的跳一跳小遊戲。