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

相关推荐
失败尽常态5231 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447741 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农1 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿1 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Leuanghing2 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
xinxiyinhe3 小时前
如何设置Cursor中.cursorrules文件
人工智能·python
诸神缄默不语4 小时前
如何用Python 3自动打开exe程序
python·os·subprocess·python 3
橘子师兄4 小时前
分页功能组件开发
数据库·python·django
Logintern094 小时前
使用VS Code进行Python编程的一些快捷方式
开发语言·python
Multiple-ji4 小时前
想学python进来看看把
开发语言·python