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 滑动操作
滑动操作包括两个主要步骤:
- 压缩:将所有非零数字向指定方向移动,消除中间的空白。
- 合并:将相邻的相同数字合并,并生成一个新数字。
以下是滑动操作的实现:
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()
第四步:优化和改进游戏体验
- 增加分数统计:记录玩家的总分数。
- 动画效果:虽然控制台无法实现动画,但可以通过延时打印来模拟。
- 难度调整:增加生成数字的概率(例如,增加生成 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 游戏,玩家可以通过控制台输入方向键进行操作。你可以在此基础上进一步优化和改进游戏体验,例如增加动画效果、调整难度或实现保存/加载功能。