Python的2042小游戏及其详解
源码:
import random
import os# 游戏界面尺寸
SIZE = 4# 游戏结束标志
GAME_OVER = False# 初始化游戏界面
board = [[0] * SIZE for _ in range(SIZE)]# 随机生成一个初始方块
def add_random_tile():empty_tiles = [(i, j) for i in range(SIZE) for j in range(SIZE) if board[i][j] == 0]if empty_tiles:i, j = random.choice(empty_tiles)board[i][j] = random.choice([2, 4])# 绘制游戏界面
def draw_board():os.system('cls' if os.name == 'nt' else 'clear')print("2042小游戏")print("---------------------")for row in board:for num in row:print(f"{num:4}", end=" ")print()print("---------------------")# 检查游戏是否结束
def check_game_over():for i in range(SIZE):for j in range(SIZE):if board[i][j] == 0:return Falseif i < SIZE - 1 and board[i][j] == board[i + 1][j]:return Falseif j < SIZE - 1 and board[i][j] == board[i][j + 1]:return Falsereturn True# 处理方向键输入
def handle_input():key = input("请输入方向键(w上,s下,a左,d右):")if key == "w":move_up()elif key == "s":move_down()elif key == "a":move_left()elif key == "d":move_right()# 合并相同数字的方块
def merge_tiles(line):merged = [False] * SIZEmerged_line = []for i in range(SIZE):if i < SIZE - 1 and line[i] == line[i + 1] and not merged[i]:merged_line.append(line[i] * 2)merged[i] = Trueelif line[i] != 0:merged_line.append(line[i])merged_line.extend([0] * (SIZE - len(merged_line)))return merged_line# 将游戏界面向上移动
def move_up():global boardnew_board = []for j in range(SIZE):line = [board[i][j] for i in range(SIZE)]merged_line = merge_tiles(line)new_board.append(merged_line)board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]add_random_tile()# 将游戏界面向下移动
def move_down():global boardnew_board = []for j in range(SIZE):line = [board[i][j] for i in range(SIZE - 1, -1, -1)]merged_line = merge_tiles(line)new_board.append(merged_line[::-1])board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]add_random_tile()# 将游戏界面向左移动
def move_left():global boardnew_board = []for i in range(SIZE):line = board[i]merged_line = merge_tiles(line)new_board.append(merged_line)board = new_boardadd_random_tile()# 将游戏界面向右移动
def move_right():global boardnew_board = []for i in range(SIZE):line = board[i][::-1]merged_line = merge_tiles(line)new_board.append(merged_line[::-1])board = new_boardadd_random_tile()# 游戏主循环
while not GAME_OVER:draw_board()handle_input()GAME_OVER = check_game_over()draw_board()
print("游戏结束!")
这段代码实现了一个简单的2048游戏。下面是对整体代码的分析:
1. 导入了`random`和`os`模块,用于生成随机数和清空命令行窗口。
2. 定义了常量`SIZE`,表示游戏界面的尺寸,这里是4x4的方格。
3. 定义了全局变量`GAME_OVER`,用于判断游戏是否结束。
4. 初始化游戏界面`board`,使用二维列表表示,初始时所有元素都为0。
5. 定义了函数`add_random_tile()`,用于在空白位置随机生成一个初始方块,值为2或4。
6. 定义了函数`draw_board()`,用于绘制游戏界面,清空命令行窗口后打印出当前界面的方块布局。
7. 定义了函数`check_game_over()`,用于检查游戏是否结束。遍历游戏界面的每个方块,如果存在空白方块或相邻方块有相同的值,则游戏未结束,否则游戏结束。
8. 定义了函数`handle_input()`,用于处理方向键的输入。根据用户输入的方向键(w上,s下,a左,d右),调用相应的移动函数。
9. 定义了函数`merge_tiles(line)`,用于合并一行或一列中相同数字的方块。遍历行或列中的每个方块,如果相邻的方块有相同的值且未合并过,则合并它们,生成新的合并后的行或列。
10. 定义了四个移动函数`move_up()`、`move_down()`、`move_left()`和`move_right()`,分别实现游戏界面的上、下、左、右移动。在移动前,将每一行或每一列提取出来,调用`merge_tiles()`合并相同数字的方块,然后将合并后的行或列重新放回游戏界面,并随机生成一个新的方块。
11. 使用`while`循环来不断绘制游戏界面、处理用户输入并检查游戏是否结束,直到游戏结束为止。
12. 最后绘制最终的游戏界面,并打印游戏结束提示。
整体而言,该代码通过不断更新游戏界面、处理用户输入和检查游戏状态的方式,实现了一个简单的2048游戏。
相关文章:
Python的2042小游戏及其详解
源码: import random import os# 游戏界面尺寸 SIZE 4# 游戏结束标志 GAME_OVER False# 初始化游戏界面 board [[0] * SIZE for _ in range(SIZE)]# 随机生成一个初始方块 def add_random_tile():empty_tiles [(i, j) for i in range(SIZE) for j in range(SIZ…...
怎么去掉邮件内容中的回车符
上图是Outlook 截图,可见1指向的总有回车符; 故障原因: 不小心误按了箭头4这个选项; 解决方法: 点击2箭头确保tab展开; 点击3以找到箭头4. 取消勾选或者多次点击,即可解决。...
Git-概念与架构
GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区(working directory)2.暂存区(staging area)3.本地仓库(local…...
android 数独小游戏 经典数独·休闲益智
一款经典数独训练app 标题资源下载 (0积分)https://download.csdn.net/download/qq_38355313/88544810 首页页面: 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择; 记录页面: 1.记录用户训练过的数独信息&…...
GAT里面的sofamax函数的实现:
1.sofamx 公式: 2. GAT里的sofamax函数的实现: 1. 因为指数在x轴正轴爆炸式地快速增长,如果zi比较大,exp(zi)也会非常大,得到的数值可能会溢出。溢出又分为下溢出(Underflow)和上溢出&#x…...
Idea 编译SpringBoot项目Kotlin报错/Idea重新编译
原因应该是一次性修改了大量的文件, SpringBoot项目启动Kotlin报错, Build Project也是同样的结果, 报错如下 Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.1.13. Build-&…...
【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案
问题原因: 使用QWizard或者QWizardPage设置像素图,结果设置完不显示效果。 设置示例: setPixmap(QWizard::WatermarkPixmap, QPixmap("xxx/xxx/xxx.png"));setPixmap(QWizard::BackgroundPixmap, QPixmap("xxx/xxx/xxx.png&…...
mysql 设置远程登录
为了允许远程连接到MySQL服务器,你需要采取以下步骤: 编辑MySQL配置文件: 打开MySQL的配置文件 my.cnf 或 my.ini,这取决于你的操作系统和MySQL版本。该文件通常位于MySQL安装目录下的 etc 或 etc/mysql 目录中。 添加或确保以下行…...
ES的索引概念
1. 概念:Elasticsearch(ES)是一个开源的全文搜索引擎,可以快速地存储、搜索和分析大量的结构化和非结构化数据。 2. 索引的作用:ES索引是将数据存储在Elasticsearch中的基本方式。它用于存储、搜索、分析和查询数据。…...
text/xml和application/xml
困惑 在http消息中,同样是传送xml信息,有的时候看到Content-Type的值是text/xml,有的时候值是application/xml,感到困惑。 例如,用Postman发送http消息给Tomcat中的基于JAX-WS的 web服务: 请求中传送了xm…...
鸿蒙4.0正式版升级机型
官网支持升级机型入口:HarmonyOS 4支持机型 | 华为官网 (huawei.com) 正式版 手机 HUAWEI P60 HUAWEI P60 Pro HUAWEI P60 Art HUAWEI Mate X3 HUAWEI Mate X3 典藏版 HUAWEI Mate 50 HUAWEI Mate 50 Pro HUAWEI Mate 50 RS 保时捷设计 HUAWEI Mate 50E …...
架构开发与优化咨询和实施服务
服务概述 得益于硬件平台算力的提升,汽车电子电气架构的集成度逐渐提高,从单体ECU、到功能域集成控制器、到区域集成控制器,多域融合成为了目前行业中软件工程的重要工作内容。同时,在传统控制器C代码开发的基础上,C、…...
react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索
InfiniteScroll 的组件见: https://blog.csdn.net/Zhooson/article/details/134396945 search.tsx 页面 import { FC, useEffect, useState } from react import InfiniteScroll from ../../components/InfiniteScrollconst tabs [{id: 1,title: tab-1,index: 1…...
Java应用如何不改代码,调整窗口大小
最近工作上遇到了这个问题,浅浅的研究了一点,这里记录一下。 有不同意见欢迎评论区交流。 需求 项目需求: 客户已经开发好了应用,不过应用在系统上看起来有点小,希望应用能在不修改代码的情况下,通过其他…...
汽车 CAN\CANFD数据记录仪
CAN FD数据记录仪解决汽车电子数据记录与偶发性故障查找问题。 1、脱机离线记录两路CAN/CANFD通道数据 脱机离线记录两路CAN/CANFD通道数据,可记录6个月数据。每个通 道单独设置触发记录模式、触发前预记录报文个数(默认1000帧)及 过滤规则&a…...
Kafka中topic(主题)、broker(代理)、partition(分区)和replication(副本)它们的关系
在Apache Kafka中,有四个重要的概念:topic(主题)、broker(代理)、partition(分区)和replication(副本)。它们的关系如下: Topic(主题&…...
Mysql字符串类型编码问题
Q: 数据库 Redis 出现 字符比较不一致问题 A:调查后发现在数据库中使用的 account 编码为 utf8mb4_unicode_ci,而这种其实是不区分大小写的,后面我们根据情况,将编码换为 utf8mb4_bin就可以了 参考: utf8mb4_Sageice的博客-CSDN博客 MySQ…...
LabVIEW关于USRPRIO的示例代码
LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用: 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP模块的应用,请使用USRP示例项目。它可作为构建 USRP RIO 流式处理应用程序的起点,可从“创建项目”对话框…...
【深度学习实验】网络优化与正则化(六):逐层归一化方法——批量归一化、层归一化、权重归一化、局部响应归一化
文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正:动量法Momen…...
低代码编辑平台后台实现
背景 之前做过一个前端低代码编辑平台,可以实现简单的移动端页面组件拖拽编辑: https://github.com/li-car-fei/react-visual-design 最近基于C的oatpp框架实现了一下后台。使用oatpp框架做web后台开发时,发现按照官方的示例使用的话&#…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
