Python 游戏开发的七个入门项目

开发 后端
本文介绍了七个适合Python初学者的游戏开发项目,每个项目都提供了详细的代码示例和解释,帮助你快速掌握游戏开发的基本概念和技术。

大家好!今天我们要聊一聊如何使用Python进行游戏开发。Python不仅是一门强大的编程语言,而且非常适合初学者入门。通过一些简单的项目,你可以快速掌握游戏开发的基本概念和技术。下面,我将介绍7个适合初学者的Python游戏开发项目,并提供详细的代码示例和解释。

1. 猜数字游戏

猜数字游戏是一个非常经典的入门项目。游戏规则很简单:计算机随机生成一个数字,玩家通过输入猜测这个数字,直到猜中为止。

代码示例:

import random

def guess_number():
    number_to_guess = random.randint(1, 100)  # 生成1到100之间的随机数
    attempts = 0

    print("欢迎来到猜数字游戏!")
    print("我已经想好了一个1到100之间的数字,你来猜猜看吧!")

    while True:
        try:
            guess = int(input("请输入你的猜测:"))
            attempts += 1

            if guess < number_to_guess:
                print("太小了!再试试看。")
            elif guess > number_to_guess:
                print("太大了!再试试看。")
            else:
                print(f"恭喜你,猜对了!你一共猜了 {attempts} 次。")
                break
        except ValueError:
            print("请输入一个有效的数字。")

# 运行游戏
guess_number()

代码解释:

  • random.randint(1, 100):生成一个1到100之间的随机整数。
  • while True:创建一个无限循环,直到玩家猜中数字。
  • try...except:捕获用户输入的异常,确保输入的是有效数字。

2. 剪刀石头布游戏

剪刀石头布是一个经典的两玩家游戏。我们可以用Python实现一个单人版,让玩家与计算机对战。

代码示例:

import random

def rock_paper_scissors():
    choices = ["剪刀", "石头", "布"]
    computer_choice = random.choice(choices)

    player_choice = input("请选择(剪刀、石头、布):")

    if player_choice not in choices:
        print("无效的选择,请重新选择。")
        return

    print(f"你选择了 {player_choice},计算机选择了 {computer_choice}。")

    if player_choice == computer_choice:
        print("平局!")
    elif (player_choice == "剪刀" and computer_choice == "布") or \
         (player_choice == "石头" and computer_choice == "剪刀") or \
         (player_choice == "布" and computer_choice == "石头"):
        print("你赢了!")
    else:
        print("你输了!")

# 运行游戏
rock_paper_scissors()

代码解释:

  • random.choice(choices):从列表中随机选择一个元素。
  • if...elif...else:判断玩家和计算机的选择,决定胜负。

3. 蛇形矩阵

蛇形矩阵是一个有趣的数学问题,可以通过嵌套循环和条件语句来实现。

代码示例:

def snake_matrix(n):
    matrix = [[0] * n for _ in range(n)]
    num = 1
    direction = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右、下、左、上
    x, y = 0, 0
    dx, dy = direction[0]

    for _ in range(n * n):
        matrix[x][y] = num
        num += 1
        nx, ny = x + dx, y + dy
        if 0 <= nx < n and 0 <= ny < n and matrix[nx][ny] == 0:
            x, y = nx, ny
        else:
            idx = direction.index((dx, dy))
            dx, dy = direction[(idx + 1) % 4]
            x, y = x + dx, y + dy

    for row in matrix:
        print(" ".join(map(str, row)))

# 运行示例
snake_matrix(4)

代码解释:

  • matrix = [[0] * n for _ in range(n)]:创建一个n×n的矩阵,初始值为0。
  • direction:定义四个方向的移动。
  • for _ in range(n * n):遍历矩阵中的每个位置,填充数字。

4. 扫雷游戏

扫雷是一个经典的逻辑游戏,可以通过二维数组和随机生成雷区来实现。

代码示例:

import random

def create_minefield(rows, cols, mines):
    minefield = [[0] * cols for _ in range(rows)]
    mine_positions = set()

    while len(mine_positions) < mines:
        x, y = random.randint(0, rows - 1), random.randint(0, cols - 1)
        if (x, y) not in mine_positions:
            mine_positions.add((x, y))
            minefield[x][y] = 'M'

    for x, y in mine_positions:
        for dx in [-1, 0, 1]:
            for dy in [-1, 0, 1]:
                if 0 <= x + dx < rows and 0 <= y + dy < cols and minefield[x + dx][y + dy] != 'M':
                    minefield[x + dx][y + dy] += 1

    return minefield

def display_minefield(minefield, revealed):
    for i in range(len(minefield)):
        row = []
        for j in range(len(minefield[0])):
            if revealed[i][j]:
                cell = str(minefield[i][j])
            else:
                cell = '-'
            row.append(cell)
        print(" ".join(row))

def play_minesweeper(rows, cols, mines):
    minefield = create_minefield(rows, cols, mines)
    revealed = [[False] * cols for _ in range(rows)]

    while True:
        display_minefield(minefield, revealed)
        x, y = map(int, input("请输入要翻开的位置(行 列):").split())

        if minefield[x][y] == 'M':
            print("你踩到了雷,游戏结束!")
            break
        else:
            revealed[x][y] = True
            if all(all(revealed[i][j] or minefield[i][j] == 'M' for j in range(cols)) for i in range(rows)):
                print("恭喜你,成功扫雷!")
                break

# 运行游戏
play_minesweeper(5, 5, 5)

代码解释:

  • create_minefield:生成雷区。
  • display_minefield:显示当前已翻开的区域。
  • play_minesweeper:主游戏循环,处理玩家输入和游戏逻辑。

5. 黑白棋(翻转棋)

黑白棋是一个策略游戏,玩家轮流放置棋子,目标是翻转对手的棋子,最终占据更多的棋盘空间。

代码示例:

def initialize_board(size):
    board = [['.' for _ in range(size)] for _ in range(size)]
    mid = size // 2
    board[mid-1][mid-1] = 'W'
    board[mid-1][mid] = 'B'
    board[mid][mid-1] = 'B'
    board[mid][mid] = 'W'
    return board

def display_board(board):
    for row in board:
        print(" ".join(row))

def is_valid_move(board, row, col, player):
    if board[row][col] != '.':
        return False

    opponent = 'B' if player == 'W' else 'W'
    directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]

    for dr, dc in directions:
        r, c = row + dr, col + dc
        if 0 <= r < len(board) and 0 <= c < len(board) and board[r][c] == opponent:
            while 0 <= r < len(board) and 0 <= c < len(board) and board[r][c] == opponent:
                r += dr
                c += dc
            if 0 <= r < len(board) and 0 <= c < len(board) and board[r][c] == player:
                return True
    return False

def make_move(board, row, col, player):
    opponent = 'B' if player == 'W' else 'W'
    directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]

    board[row][col] = player
    for dr, dc in directions:
        r, c = row + dr, col + dc
        to_flip = []
        while 0 <= r < len(board) and 0 <= c < len(board) and board[r][c] == opponent:
            to_flip.append((r, c))
            r += dr
            c += dc
        if 0 <= r < len(board) and 0 <= c < len(board) and board[r][c] == player:
            for fr, fc in to_flip:
                board[fr][fc] = player

def play_reversi(size):
    board = initialize_board(size)
    current_player = 'B'

    while True:
        display_board(board)
        valid_moves = [(r, c) for r in range(size) for c in range(size) if is_valid_move(board, r, c, current_player)]
        if not valid_moves:
            print(f"玩家 {current_player} 无法行动,跳过回合。")
            current_player = 'W' if current_player == 'B' else 'B'
            continue

        print(f"玩家 {current_player} 的回合。")
        row, col = map(int, input("请输入要放置棋子的位置(行 列):").split())
        if (row, col) in valid_moves:
            make_move(board, row, col, current_player)
            current_player = 'W' if current_player == 'B' else 'B'
        else:
            print("无效的移动,请重新输入。")

# 运行游戏
play_reversi(8)

代码解释:

  • initialize_board:初始化棋盘。
  • is_valid_move:检查玩家的移动是否有效。
  • make_move:执行玩家的移动并翻转对手的棋子。
  • play_reversi:主游戏循环,处理玩家输入和游戏逻辑。

6. 迷宫生成器

迷宫生成器可以使用递归回溯算法来生成随机迷宫。

代码示例:

import random

def generate_maze(width, height):
    maze = [['#'] * width for _ in range(height)]
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]

    def carve_passage(x, y):
        maze[y][x] = ' '
        random.shuffle(directions)
        for dx, dy in directions:
            nx, ny = x + dx * 2, y + dy * 2
            if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == '#':
                maze[y + dy][x + dx] = ' '
                carve_passage(nx, ny)

    start_x, start_y = random.randrange(0, width, 2), random.randrange(0, height, 2)
    carve_passage(start_x, start_y)

    return maze

def display_maze(maze):
    for row in maze:
        print("".join(row))

# 生成并显示迷宫
maze = generate_maze(21, 21)
display_maze(maze)

代码解释:

  • generate_maze:生成迷宫。
  • carve_passage:递归地挖通通道。
  • display_maze:显示迷宫。

7. 简易射击游戏

简易射击游戏可以使用Pygame库来实现。Pygame是一个用于编写视频游戏的Python库,非常适合初学者。

安装Pygame:

pip install pygame

代码示例:

import pygame
import random

# 初始化Pygame
pygame.init()

# 设置窗口大小
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("简易射击游戏")

# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

# 玩家属性
player_size = 50
player_pos = [width // 2, height - 2 * player_size]
player_speed = 10

# 敌人属性
enemy_size = 50
enemy_pos = [random.randint(0, width - enemy_size), 0]
enemy_list = [enemy_pos]
enemy_speed = 10

# 子弹属性
bullet_size = 10
bullet_pos = [0, 0]
bullet_list = []
bullet_speed = 20

# 游戏时钟
clock = pygame.time.Clock()

# 游戏分数
score = 0

# 游戏状态
game_over = False

def drop_enemies(enemy_list):
    delay = random.random()
    if len(enemy_list) < 10 and delay < 0.1:
        x_pos = random.randint(0, width - enemy_size)
        y_pos = 0
        enemy_list.append([x_pos, y_pos])

def draw_enemies(enemy_list):
    for enemy_pos in enemy_list:
        pygame.draw.rect(screen, black, (enemy_pos[0], enemy_pos[1], enemy_size, enemy_size))

def update_enemy_positions(enemy_list, score):
    for idx, enemy_pos in enumerate(enemy_list):
        if enemy_pos[1] >= 0 and enemy_pos[1] < height:
            enemy_pos[1] += enemy_speed
        else:
            enemy_list.pop(idx)
            score += 1
    return score

def collision_check(enemy_list, player_pos):
    for enemy_pos in enemy_list:
        if detect_collision(enemy_pos, player_pos):
            return True
    return False

def detect_collision(player_pos, enemy_pos):
    p_x, p_y = player_pos
    e_x, e_y = enemy_pos

    if (e_x >= p_x and e_x < (p_x + player_size)) or (p_x >= e_x and p_x < (e_x + enemy_size)):
        if (e_y >= p_y and e_y < (p_y + player_size)) or (p_y >= e_y and p_y < (e_y + enemy_size)):
            return True
    return False

def draw_bullets(bullet_list):
    for bullet_pos in bullet_list:
        pygame.draw.rect(screen, red, (bullet_pos[0], bullet_pos[1], bullet_size, bullet_size))

def update_bullet_positions(bullet_list):
    for idx, bullet_pos in enumerate(bullet_list):
        if bullet_pos[1] > 0:
            bullet_pos[1] -= bullet_speed
        else:
            bullet_list.pop(idx)

def check_bullet_collision(bullet_list, enemy_list):
    for bullet_pos in bullet_list:
        for enemy_pos in enemy_list:
            if detect_collision(bullet_pos, enemy_pos):
                bullet_list.remove(bullet_pos)
                enemy_list.remove(enemy_pos)
                return True
    return False

# 主游戏循环
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.KEYDOWN:
            x, y = player_pos
            if event.key == pygame.K_LEFT:
                x -= player_speed
            elif event.key == pygame.K_RIGHT:
                x += player_speed
            elif event.key == pygame.K_SPACE:
                bullet_pos = [x + player_size // 2, y]
                bullet_list.append(bullet_pos)
            player_pos = [x, y]

    screen.fill(white)

    drop_enemies(enemy_list)
    score = update_enemy_positions(enemy_list, score)
    draw_enemies(enemy_list)

    update_bullet_positions(bullet_list)
    draw_bullets(bullet_list)

    check_bullet_collision(bullet_list, enemy_list)

    if collision_check(enemy_list, player_pos):
        game_over = True
        break

    pygame.draw.rect(screen, black, (player_pos[0], player_pos[1], player_size, player_size))
    text = f"Score: {score}"
    font = pygame.font.SysFont("monospace", 35)
    label = font.render(text, 1, black)
    screen.blit(label, (width - 200, height - 40))

    clock.tick(30)
    pygame.display.update()

pygame.quit()

代码解释:

  • pygame.init():初始化Pygame。
  • drop_enemies:随机生成敌人。
  • draw_enemies:绘制敌人。
  • update_enemy_positions:更新敌人的位置。
  • collision_check:检测玩家和敌人的碰撞。
  • detect_collision:检测两个矩形的碰撞。
  • draw_bullets:绘制子弹。
  • update_bullet_positions:更新子弹的位置。
  • check_bullet_collision:检测子弹和敌人的碰撞。
  • main game loop:主游戏循环,处理事件、更新状态和绘制画面。

实战案例:制作一个简单的贪吃蛇游戏

贪吃蛇是一个经典的街机游戏,玩家控制一条蛇,通过吃食物来增长长度,同时避免撞到墙壁或自己的身体。我们将使用Pygame库来实现这个游戏。

安装Pygame:

pip install pygame

代码示例:

import pygame
import time
import random

# 初始化Pygame
pygame.init()

# 设置窗口大小
width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("贪吃蛇游戏")

# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)

# 蛇的初始位置和速度
snake_block = 10
snake_speed = 15

font_style = pygame.font.SysFont(None, 50)
score_font = pygame.font.SysFont(None, 35)

def your_score(score):
    value = score_font.render("Your Score: " + str(score), True, black)
    screen.blit(value, [0, 0])

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(screen, green, [x[0], x[1], snake_block, snake_block])

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    screen.blit(mesg, [width / 6, height / 3])

def gameLoop():
    game_over = False
    game_close = False

    x1 = width / 2
    y1 = height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 1

    foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            screen.fill(white)
            message("You Lost! Press Q-Quit or C-Play Again", 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
                        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 = -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 >= width or x1 < 0 or y1 >= height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        screen.fill(white)
        pygame.draw.rect(screen, red, [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()

        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1

        clock = pygame.time.Clock()
        clock.tick(snake_speed)

    pygame.quit()
    quit()

gameLoop()

代码解释:

  • gameLoop:主游戏循环,处理事件、更新状态和绘制画面。
  • your_score:显示当前得分。
  • our_snake:绘制蛇的身体。
  • message:显示消息。
  • foodx 和 foody:食物的位置。
  • snake_List:存储蛇的身体部分。
  • Length_of_snake:蛇的长度。
  • x1_change 和 y1_change:蛇的移动方向。
  • game_close:游戏结束标志。

总结

本文介绍了7个适合Python初学者的游戏开发项目,包括猜数字游戏、剪刀石头布、蛇形矩阵、扫雷游戏、黑白棋、迷宫生成器和简易射击游戏。每个项目都提供了详细的代码示例和解释,帮助你快速掌握游戏开发的基本概念和技术。最后,我们还通过一个实战案例——制作一个简单的贪吃蛇游戏,进一步巩固所学知识。

责任编辑:赵宁宁 来源: 小白PythonAI编程
相关推荐

2023-04-25 12:45:09

2010-06-30 08:52:25

2015-08-06 15:46:46

诱惑玩家游戏魅力

2023-03-24 07:30:53

JavaScript项目元框架

2021-09-22 12:45:47

Python数据分析

2022-05-23 11:13:02

Python工具

2021-09-03 10:08:53

JavaScript开发 代码

2022-12-27 15:09:30

2023-04-19 08:14:24

2021-07-22 09:40:10

GitHub代码开发者

2021-12-27 08:58:28

低代码开发数据安全

2021-10-18 13:29:52

Golang网站开发代码

2024-11-08 16:24:39

2023-10-08 09:52:55

2024-08-30 14:29:03

2017-04-13 10:58:32

Python开发者

2017-11-22 12:40:02

PythonGUI框架

2022-07-13 08:53:12

开源元宇宙

2023-06-15 11:01:43

Java工具开源

2022-11-18 14:33:39

点赞
收藏

51CTO技术栈公众号