自学内容网 自学内容网

【python基础】用Python写一个2048小游戏

2048 是一款非常受欢迎的数字拼图游戏,玩家通过滑动屏幕将数字方块合并,目标是合成一个 2048 的方块。下面我们将逐步实现一个基于 Python 的 2048 游戏,使用控制台作为用户界面。我们会从游戏的基本逻辑开始,逐步完善代码,并提供详细的注释和解释。

第一步:初始化游戏界面和基本逻辑

首先,我们需要定义游戏的基本结构,包括棋盘的初始化和显示。

1.1 初始化棋盘

棋盘是一个 4x4 的二维数组,初始时随机生成两个数字(2 或 4)。

Python复制

import random

def initialize_board():
    """初始化一个 4x4 的棋盘,并随机生成两个数字"""
    board = [[0] * 4 for _ in range(4)]
    add_new_tile(board)
    add_new_tile(board)
    return board

def add_new_tile(board):
    """在棋盘的空白位置随机生成一个数字(2 或 4)"""
    empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]
    if empty_cells:
        i, j = random.choice(empty_cells)
        board[i][j] = random.choice([2, 4])

def print_board(board):
    """打印棋盘"""
    for row in board:
        print("\t".join(str(cell).rjust(4) for cell in row))
    print()

# 测试初始化棋盘
board = initialize_board()
print_board(board)

第二步:实现基本操作逻辑

2048 的核心操作是滑动方块,包括向上、向下、向左、向右滑动。我们需要实现这些操作的基本逻辑。

2.1 滑动操作

滑动操作包括两个主要步骤:

  1. 压缩:将所有非零数字向指定方向移动,消除中间的空白。
  2. 合并:将相邻的相同数字合并,并生成一个新数字。

以下是滑动操作的实现:

Python复制

def compress(row):
    """压缩行,消除空白"""
    new_row = [num for num in row if num != 0]
    new_row += [0] * (4 - len(new_row))
    return new_row

def merge(row):
    """合并相邻的相同数字"""
    for i in range(3):
        if row[i] == row[i + 1] and row[i] != 0:
            row[i] *= 2
            row[i + 1] = 0
    return row

def move_row(row):
    """对单行执行滑动操作"""
    row = compress(row)
    row = merge(row)
    row = compress(row)
    return row

def move_board(board, direction):
    """根据方向滑动整个棋盘"""
    new_board = [[0] * 4 for _ in range(4)]
    if direction == 'up':
        for j in range(4):
            row = [board[i][j] for i in range(4)]
            new_row = move_row(row)
            for i in range(4):
                new_board[i][j] = new_row[i]
    elif direction == 'down':
        for j in range(4):
            row = [board[i][j] for i in range(4)][::-1]
            new_row = move_row(row)
            for i in range(4):
                new_board[3 - i][j] = new_row[i]
    elif direction == 'left':
        for i in range(4):
            new_board[i] = move_row(board[i])
    elif direction == 'right':
        for i in range(4):
            row = board[i][::-1]
            new_row = move_row(row)
            new_board[i] = new_row[::-1]
    return new_board

第三步:游戏主循环

游戏主循环负责处理玩家输入、更新棋盘状态,并判断游戏是否结束。

3.1 游戏主循环

Python复制

def is_game_over(board):
    """判断游戏是否结束"""
    for i in range(4):
        for j in range(4):
            if board[i][j] == 0 or \
               (i > 0 and board[i][j] == board[i - 1][j]) or \
               (j > 0 and board[i][j] == board[i][j - 1]) or \
               (i < 3 and board[i][j] == board[i + 1][j]) or \
               (j < 3 and board[i][j] == board[i][j + 1]):
                return False
    return True

def play_game():
    """主游戏循环"""
    board = initialize_board()
    while True:
        print_board(board)
        move = input("请输入移动方向(上:w,下:s,左:a,右:d):").strip().lower()
        if move in ['w', 's', 'a', 'd']:
            direction = {'w': 'up', 's': 'down', 'a': 'left', 'd': 'right'}[move]
            new_board = move_board(board, direction)
            if new_board != board:
                board = new_board
                add_new_tile(board)
        else:
            print("无效输入,请重新输入!")
            continue
        
        if is_game_over(board):
            print("游戏结束!")
            break

# 开始游戏
play_game()

第四步:优化和改进游戏体验

  1. 增加分数统计:记录玩家的总分数。
  2. 动画效果:虽然控制台无法实现动画,但可以通过延时打印来模拟。
  3. 难度调整:增加生成数字的概率(例如,增加生成 4 的概率)。
  4. 保存和加载游戏:使用文件保存游戏状态,方便玩家暂停和恢复。

以下是增加分数统计的代码示例:

Python复制

def merge(row):
    """合并相邻的相同数字,并更新分数"""
    global score
    for i in range(3):
        if row[i] == row[i + 1] and row[i] != 0:
            score += row[i] * 2
            row[i] *= 2
            row[i + 1] = 0
    return row

def play_game():
    """主游戏循环"""
    global score
    score = 0
    board = initialize_board()
    while True:
        print_board(board)
        print(f"当前分数:{score}")
        move = input("请输入移动方向(上:w,下:s,左:a,右:d):").strip().lower()
        if move in ['w', 's', 'a', 'd']:
            direction = {'w': 'up', 's': 'down', 'a': 'left', 'd': 'right'}[move]
            new_board = move_board(board, direction)
            if new_board != board:
                board = new_board
                add_new_tile(board)
        else:
            print("无效输入,请重新输入!")
            continue
        
        if is_game_over(board):
            print("游戏结束!")
            break

# 开始游戏
play_game()

总结

以上代码实现了一个基本的 2048 游戏,玩家可以通过控制台输入方向键进行操作。你可以在此基础上进一步优化和改进游戏体验,例如增加动画效果、调整难度或实现保存/加载功能。


原文地址:https://blog.csdn.net/makesomethings/article/details/145301632

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!