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

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

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

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

1.1 初始化棋盘

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

Python复制

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复制

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复制

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复制

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 游戏,玩家可以通过控制台输入方向键进行操作。你可以在此基础上进一步优化和改进游戏体验,例如增加动画效果、调整难度或实现保存/加载功能。

相关推荐
ℳ₯㎕ddzོꦿ࿐1 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb1 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天1 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python
Channing Lewis1 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask
B站计算机毕业设计超人1 小时前
计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫
大数据·hadoop·python·spark·课程设计·数据可视化·推荐算法
觅远2 小时前
python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
python·自动化
ghostwritten3 小时前
Python FastAPI 实战应用指南
开发语言·python·fastapi
CM莫问3 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
通信.萌新4 小时前
OpenCV边沿检测(Python版)
人工智能·python·opencv
Bran_Liu4 小时前
【LeetCode 刷题】字符串-字符串匹配(KMP)
python·算法·leetcode