python2048游戏

server/2025/2/12 6:50:40/

实现了一个完整的2048游戏,并将其展示在一个图形化界面上。具体功能包括:

  1. 初始化游戏:创建一个4x4的二维列表,表示游戏板,并在初始状态下随机放置两个数字(通常是2或4)。
  2. 绘制游戏:使用tkinter库中的Canvas对象来绘制游戏板,每个单元格根据其值显示不同的颜色和数字。
  3. 添加新方块:在空闲的单元格中随机添加一个新的数字(2或4)。
  4. 处理按键事件:监听键盘上的方向键输入,执行相应的移动操作(左、右、上、下)。
  5. 合并方块:当玩家移动时,相邻且相同的数字会合并成一个更大的数字。
  6. 旋转矩阵:为了简化上下移动的操作,通过旋转矩阵将上下移动转换为左右移动。
  7. 判断游戏结束:检查所有可能的移动方向,如果没有任何有效的移动,则游戏结束。
  8. 重启游戏:当游戏结束后,提示用户并允许重新开始游戏

使用的技术

  1. Python:编程语言的核心。
  2. Tkinter:Python的标准GUI库,用于创建图形用户界面。
    • Canvas:用于绘制游戏板和其中的数字。
    • bind:用于绑定键盘事件到特定的回调函数。
    • messagebox:用于显示游戏结束的消息框。
  3. 面向对象编程 (OOP):通过定义Game2048类来组织代码,使代码结构清晰且易于维护。
  4. 列表和字典:用于存储游戏状态和颜色映射。
  5. 随机数生成:使用random.choicerandom.random来决定新方块的位置和值。

代码展示:

python">import tkinter as tk
from tkinter import messagebox
import randomclass Game2048:def __init__(self, master):self.master = masterself.master.title("2048")self.board = [[0] * 4 for _ in range(4)]self.add_new_tile()self.add_new_tile()self.canvas = tk.Canvas(self.master, width=300, height=300, bg="#bbada0")self.canvas.pack()self.draw_board()self.master.bind("<Key>", self.key_press)def draw_board(self):self.canvas.delete("all")for i in range(4):for j in range(4):x1 = j * 75y1 = i * 75x2 = x1 + 75y2 = y1 + 75color = self.get_cell_color(self.board[i][j])self.canvas.create_rectangle(x1, y1, x2, y2, fill=color)if self.board[i][j] != 0:font_size = 36 if self.board[i][j] < 100 else 24 if self.board[i][j] < 1000 else 20self.canvas.create_text((x1 + x2) / 2, (y1 + y2) / 2, text=str(self.board[i][j]), font=("Arial", font_size), fill="#f9f6f2")def get_cell_color(self, value):colors = {0: "#cdc1b4",2: "#eee4da",4: "#ede0c8",8: "#f2b179",16: "#f59563",32: "#f67c5f",64: "#f65e3b",128: "#edcf72",256: "#edcc61",512: "#edc850",1024: "#edc53f",2048: "#edc22e"}return colors.get(value, "#ff6347")def add_new_tile(self):empty_cells = [(i, j) for i in range(4) for j in range(4) if self.board[i][j] == 0]if not empty_cells:return Falsei, j = random.choice(empty_cells)self.board[i][j] = 2 if random.random() < 0.9 else 4return Truedef key_press(self, event):moved = Falseif event.keysym == "Up":self.board, moved = self.move_up(self.board)elif event.keysym == "Down":self.board, moved = self.move_down(self.board)elif event.keysym == "Left":self.board, moved = self.move_left(self.board)elif event.keysym == "Right":self.board, moved = self.move_right(self.board)if moved:self.add_new_tile()self.draw_board()if self.game_over():messagebox.showinfo("Game Over", "You lost!")self.restart_game()def move_left(self, board):def merge(row):merged_row = []last_num = Nonefor num in row:if num == 0:continueif last_num is None:last_num = numelif last_num == num:merged_row.append(last_num + num)last_num = Noneelse:merged_row.append(last_num)last_num = numif last_num is not None:merged_row.append(last_num)merged_row.extend([0] * (4 - len(merged_row)))return merged_rownew_board = [merge(row) for row in board]return new_board, board != new_boarddef rotate_clockwise(self, board):return [list(reversed(col)) for col in zip(*board)]def move_right(self, board):rotated_board, changed = self.move_left(self.rotate_clockwise(board))return self.rotate_clockwise(self.rotate_clockwise(self.rotate_clockwise(rotated_board))), changeddef move_up(self, board):rotated_board, changed = self.move_left(self.rotate_clockwise(self.rotate_clockwise(board)))return self.rotate_clockwise(rotate_clockwise(rotated_board)), changeddef move_down(self, board):rotated_board, changed = self.move_left(self.rotate_clockwise(board))return self.rotate_clockwise(self.rotate_clockwise(self.rotate_clockwise(rotate_clockwise(rotated_board)))), changeddef game_over(self):for direction in [self.move_left, self.move_right, self.move_up, self.move_down]:_, changed = direction(self.board)if changed:return Falsereturn Truedef restart_game(self):self.board = [[0] * 4 for _ in range(4)]self.add_new_tile()self.add_new_tile()self.draw_board()if __name__ == "__main__":root = tk.Tk()game = Game2048(root)root.mainloop()

效果图
在这里插入图片描述


http://www.ppmy.cn/server/166629.html

相关文章

论文笔记-COLING2025-LLMTreeRec

论文笔记-COLING2025-LLMTreeRec: Unleashing the Power of Large Language Models for Cold-Start Recommendations LLMTreeRec: 释放大语言模型在冷启动推荐中的力量摘要1.引言2.框架2.1项目树构建2.2以LLM为中心的基于树的推荐2.2.1推荐链策略2.2.2检索策略 3.实验3.1实验设…

【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离

多维动态规划 机器人路径问题思路代码实现 最小路径和问题动态规划思路状态转移方程边界条件 代码实现 最长回文子串思路代码实现 最长公共子序列&#xff08;LCS&#xff09;题目描述解决方案 —— 动态规划1. 状态定义2. 状态转移方程3. 初始化4. 代码实现 编辑距离&#xff…

1.攻防世界 baby_web

题目描述这里有提示&#xff0c;初始页面 进入题目页面如下 很简洁的页面只有一行HELLO WORLD ctrlu查看了源码也没有信息 用burp suite抓包&#xff0c;并发送到重放器 根据提示&#xff08;初始页面&#xff09;修改访问index.php文件 index.php index.php 是一种常见的…

【漫话机器学习系列】083.安斯库姆四重奏(Anscombe‘s Quartet)

安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09; 1. 什么是安斯库姆四重奏&#xff1f; 安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09;是一组由统计学家弗朗西斯安斯库姆&#xff08;Francis Anscombe&#xff09; 在 1973 年 提出的 四组数据集。它们…

Objective-C语言的云计算

Objective-C语言的云计算探索 引言 随着信息技术的快速发展&#xff0c;云计算作为一种新兴的计算模式&#xff0c;正逐渐改变着我们的生活和工作方式。云计算通过互联网提供了强大的计算能力和存储资源&#xff0c;使得用户能够按照需求随时获取服务。在这个背景下&#xff…

使用外骨骼灵活远程控制协作机器人案例

外骨骼控制器采用可调节结构&#xff0c;简化了机器人编程&#xff0c;使协作机器人 FR3 的远程控制变得容易。 一、引言 在开发机器人手臂或双臂系统的应用程序时&#xff0c;经常会遇到以下挑战&#xff1a; 1. 使用拖动和示教进行定位的困难&#xff1a;拖动和示教功能通常…

javaEE初阶————多线程初阶(1)

多线程初阶———— 1&#xff0c;认识线程 1.1 概念 1&#xff09;线程是什么 线程就是一个“执行流”&#xff0c;可以理解为程序执行的最小单位&#xff1b; 可以看成轻量级的进程&#xff1b; 2&#xff09;为啥要有线程 “并发编程” 的需要&#xff0c;但是我们不…

详解在Pytest中忽略测试目录的三种方法

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 你是否曾因无关或过时的代码导致测试失败&#xff1f; 这可能会增加调试和故障排除…