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后台开发时,发现按照官方的示例使用的话&#…...
论文初稿被批太水?,有哪些真正亲测好用的的降AI率软件推荐?
论文初稿被批太水?关键要选对降AIGC率、去AI痕迹、降查重的工具,语义优化 学术润色 AI痕迹清除是核心。免费与付费工具结合使用更高效,既能控制成本又能提升质量。下面按中文、英文、免费 / 付费分类推荐,附实测效果与适用场景。…...
四大音乐平台一键解析:免费开源music-api打破会员壁垒
四大音乐平台一键解析:免费开源music-api打破会员壁垒 【免费下载链接】music-api Music API 项目地址: https://gitcode.com/gh_mirrors/mu/music-api 在音乐流媒体平台林立的今天,你是否曾被各大平台的会员壁垒所困扰?想听周杰伦的歌…...
轨迹在线识别导向的3D折线焊缝机器人摆动GMAW实时跟踪系统【附程序】
✨ 长期致力于3D折线焊缝、机器人、GMAW、轨迹在线识别、焊缝跟踪研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于激光位移传感与密度聚类点云在线…...
《纳瓦尔宝典》幸福篇精读:程序员如何在敲码之余获得内心的平静与幸福
本文是《纳瓦尔宝典》第三部分"学习幸福"的完整精读笔记,专为程序员群体量身打造。结合技术职场高压、内卷严重的现状,拆解纳瓦尔关于幸福的核心哲学,提供可落地的日常实践方法。引言:为什么程序员更需要学习幸福&#…...
手把手教你用Wireshark抓包分析:一个Easymesh设备到底是怎么‘发现’并‘加入’你家网络的?
用Wireshark解密Easymesh组网:从设备发现到网络接入的全流程解析 当你在客厅新添置了一台支持Easymesh的路由器,通电后它就像有自主意识般自动加入了现有的家庭网络——这种看似"魔法"般的体验背后,其实是一系列精密的协议交互在发…...
NotebookLM实验结果可信吗?(P值阈值设定与多重检验校正全拆解)
更多请点击: https://codechina.net 第一章:NotebookLM实验结果可信吗?(P值阈值设定与多重检验校正全拆解) NotebookLM 作为基于文档的AI实验助手,其内置的“实验模式”常用于自动比对不同提示策略或模型配…...
终极指南:Claude Desktop Debian版脚本自动化批量操作与任务调度全攻略
终极指南:Claude Desktop Debian版脚本自动化批量操作与任务调度全攻略 【免费下载链接】claude-desktop-debian Claude Desktop for Linux 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debian Claude Desktop Debian版是一款强大的Li…...
解密市场结构:Chanlun-Pro 如何将缠论理论转化为智能交易引擎
解密市场结构:Chanlun-Pro 如何将缠论理论转化为智能交易引擎 【免费下载链接】chanlun-pro 基于缠中说禅所讲缠论理论,以便量化分析市场行情的工具 项目地址: https://gitcode.com/gh_mirrors/ch/chanlun-pro 在瞬息万变的金融市场中,…...
GPT5.5怎么切中文界面设置教程一看就会
做多模型中文能力对比测试时用了AI模型聚合平台,一站接入多个模型方便对比不同模型的中文输出质量。GPT-5.5上线快一个月了。注册完打开一看全是英文界面,切了半天没找到在哪改。搜了一圈教程要么过时要么步骤不全。这次把2026年5月最新的中文设置全流程…...
Unity碰撞器性能优化:Collider类型选择与物理系统调优
1. 为什么一个“看不见”的组件,能让帧率从60掉到20?在Unity项目上线前的性能压测阶段,我遇到过最让人头皮发麻的场景不是Shader报错,也不是内存泄漏,而是——主角刚跑进森林,帧率瞬间从58fps断崖式跌到18f…...
