Python 版本的 2024详细代码

2048游戏的Python实现
概述:
2048是一款流行的单人益智游戏,玩家通过滑动数字瓷砖来合并相同的数字,目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能,包括游戏逻辑、界面绘制和用户交互。
主要功能:
- 游戏界面:游戏界面由一个4x4的网格组成,每个格子可以显示不同的数字。游戏开始时,随机生成两个瓷砖,分别为2或4。
- 用户输入:玩家可以通过键盘的方向键(上、下、左、右)来控制瓷砖的移动和合并。
- 瓷砖合并:当两个相同的数字瓷砖碰撞时,它们会合并成一个新的瓷砖,数字会加倍。
- 胜利条件:当玩家成功合成2048时,游戏会显示胜利信息。
- 游戏重置:玩家可以通过按空格键重置游戏,开始新一轮。
代码结构:
- 颜色设置:定义了不同数字对应的颜色,以便在界面上进行美观的显示。
- 绘制函数:包括
draw_grid和draw_tile函数,用于绘制游戏网格和瓷砖。 - 移动逻辑:实现了瓷砖的移动和合并逻辑,包括
move_left、move_right、move_up和move_down函数。 - 游戏循环:包含主菜单和游戏循环,处理用户输入并更新游戏状态。
运行环境:
- Python 3.x
- Pygame库(可通过
pip install pygame安装)
总结:
这个2048游戏的Python实现是一个很好的练手项目,适合初学者学习游戏开发的基本概念。通过这个项目,开发者可以掌握如何处理用户输入、绘制图形界面以及实现简单的游戏逻辑。可以根据需要进一步扩展功能,例如添加分数记录、游戏结束提示、音效等。
import pygame
import random
import sys# 初始化pygame
pygame.init()# 设置屏幕大小
screen_width = 400
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))# 设置颜色
background_color = (187, 173, 160)
tile_colors = {0: (205, 193, 180),2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (246, 149, 72),32: (245, 124, 36),64: (246, 94, 51),128: (237, 207, 114),256: (237, 204, 97),512: (237, 200, 80),1024: (237, 197, 63),2048: (237, 194, 46),
}# 设置字体
font = pygame.font.Font(None, 32)# 游戏变量
grid_size = 4
tiles = [[0] * grid_size for _ in range(grid_size)]def draw_grid():for x in range(1, grid_size):pygame.draw.line(screen, (105, 104, 104), (x * (screen_width // grid_size), 0), (x * (screen_width // grid_size), screen_height))for y in range(1, grid_size):pygame.draw.line(screen, (105, 104, 104), (0, y * (screen_height // grid_size)), (screen_width, y * (screen_height // grid_size)))def draw_tile(value, x, y):size = screen_width // grid_sizestart_x = x * sizestart_y = y * sizecolor = tile_colors.get(value, tile_colors[0]) # 使用get方法提供默认颜色pygame.draw.rect(screen, color, (start_x + 5, start_y + 5, size - 10, size - 10))if value:text_surface = font.render(str(value), True, (255, 255, 255))text_rect = text_surface.get_rect(center=(start_x + size // 2, start_y + size // 2))screen.blit(text_surface, text_rect)def draw_board():screen.fill(background_color)draw_grid()for x in range(grid_size):for y in range(grid_size):draw_tile(tiles[x][y], x, y)def add_new_tile():available_positions = [(x, y) for x in range(grid_size) for y in range(grid_size) if tiles[x][y] == 0]if available_positions:x, y = random.choice(available_positions)tiles[x][y] = random.choice([2, 4])def move_left():for y in range(grid_size):new_line = [tiles[x][y] for x in range(grid_size) if tiles[x][y] != 0]new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for x in range(grid_size - 1, 0, -1):if new_line[x] == new_line[x - 1]:new_line[x] = new_line[x] + new_line[x - 1]new_line[x - 1] = 0new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for x in range(grid_size):tiles[x][y] = new_line[x]def move_right():for y in range(grid_size):new_line = [tiles[x][y] for x in range(grid_size) if tiles[x][y] != 0]new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for x in range(0, grid_size - 1):if new_line[x] == new_line[x + 1]:new_line[x] = new_line[x] + new_line[x + 1]new_line[x + 1] = 0new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for x in range(grid_size):tiles[x][y] = new_line[x]def move_up():for x in range(grid_size):new_line = [tiles[x][y] for y in range(grid_size) if tiles[x][y] != 0]new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for y in range(grid_size - 1, 0, -1):if new_line[y] == new_line[y - 1]:new_line[y] = new_line[y] + new_line[y - 1]new_line[y - 1] = 0new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for y in range(grid_size):tiles[x][y] = new_line[y]def move_down():for x in range(grid_size):new_line = [tiles[x][y] for y in range(grid_size) if tiles[x][y] != 0]new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for y in range(0, grid_size - 1):if new_line[y] == new_line[y + 1]:new_line[y] = new_line[y] + new_line[y + 1]new_line[y + 1] = 0new_line = [value for value in new_line if value != 0]new_line += [0] * (grid_size - len(new_line))for y in range(grid_size):tiles[x][y] = new_line[y]def check_for_winner():for x in range(grid_size):for y in range(grid_size):if tiles[x][y] == 2048:return Truereturn Falsedef main_menu():running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:for i in range(grid_size):for j in range(grid_size):tiles[i][j] = 0add_new_tile()add_new_tile()elif event.key == pygame.K_ESCAPE:running = Falsescreen.fill((0, 0, 0))text_surface = font.render('Press SPACE to start', True, (255, 255, 255))text_rect = text_surface.get_rect(center=(screen_width // 2, screen_height // 2))screen.blit(text_surface, text_rect)pygame.display.flip()returndef game_loop():running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:move_left()add_new_tile()elif event.key == pygame.K_RIGHT:move_right()add_new_tile()elif event.key == pygame.K_UP:move_up()add_new_tile()elif event.key == pygame.K_DOWN:move_down()add_new_tile()elif event.key == pygame.K_ESCAPE:running = Falseif check_for_winner():running = Falsegame_message = "You win!"print(game_message)draw_board()pygame.display.flip()returnmain_menu()
game_loop()pygame.quit()
sys.exit()
相关文章:
Python 版本的 2024详细代码
2048游戏的Python实现 概述: 2048是一款流行的单人益智游戏,玩家通过滑动数字瓷砖来合并相同的数字,目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能,包括游戏逻辑、界面绘制和用户交互。 主…...
SpringCloud框架学习(第四部分:Gateway网关)
目录 十一、Gateway新一代网关 1.概述 2.Gateway三大核心 3.工作流程 4.入门配置 5.路由映射 (1)8001 外部添加网关 (2)服务间调用添加网关 (3)存在问题 6.Gateway高级特性 (1&#x…...
C++ 类和对象 (上 )
学习本身就是一件很快乐的事情 一. 面向对象和面向过程 我们在学习计算机的过程中经常会听到xxx是一门面向对象的语言 xxx是一门面向过程的语言 那么到底什么是面向对象 什么是面向过程呢? 简单介绍下 面向过程 面向过程关注的是过程 分析出求解问题的步骤&…...
HAProxy面试题及参考答案(精选80道面试题)
目录 什么是 HAProxy? HAProxy 主要有哪些功能? HAProxy 的关键特性有哪些? HAProxy 的主要功能是什么? HAProxy 的作用是什么? 解释 HAProxy 在网络架构中的作用。 HAProxy 与负载均衡器之间的关系是什么? HAProxy 是如何实现负载均衡的? 阐述 HAProxy 的四层…...
探索PyCaret:一个简化机器学习的全栈库
探索PyCaret:一个简化机器学习的全栈库 机器学习领域充满了挑战,从数据预处理、特征工程到模型训练与评估,再到模型部署。对于数据科学初学者或者时间有限的开发者,这一流程可能显得繁琐且复杂。幸运的是,PyCaret 提供…...
英语写作中“联系、关联”associate correlate 及associated的用法
似乎是同义词的associate correlate 实际上意思差别明显,associate 是人们把两者联系在一起(主观联系),而correlate 指客观联系。 例如: We always associate sports with health.(我们总是将运动和健康联…...
深度学习之目标检测的技巧汇总
1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法:画出loss曲线,如果训练集loss持续减小但是验证集loss增大,就说明是过拟合了。 数据增强目的 通过数据增强…...
【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案
【Ubuntu 22.04FlaskGunicornNginx】部署目标检测模型API完整解决方案 文章目录 1. 搭建深度学习环境1.1 下载Anaconda1.2 打包环境1.3 创建虚拟环境1.4 报错 2. 安装flask3. 安装gunicorn4. 安装Nginx4.1 安装前置依赖4.2 安装nginx4.3 常用命令 5. NginxGunicornFlask5.1 ng…...
Spark核心组件解析:Executor、RDD与缓存优化
Spark核心组件解析:Executor、RDD与缓存优化 Spark Executor Executor 是 Spark 中用于执行任务(task)的执行单元,运行在 worker 上,但并不等同于 worker。实际上,Executor 是一组计算资源(如…...
“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体
作者|郭源 前言 在后LLM时代,随着大语言模型和多模态大模型技术的日益成熟,AI技术的实际应用及其社会价值愈发受到重视。AI智能体(AI Agent)技术通过集成行为规划、记忆存储、工具调用等机制,为大模型装上…...
离散数学【关系】中的一些特殊关系
在数学中,关系是描述集合之间元素间关系的方式。以下是对一些常见关系的详细分析及举例: 1. 空关系 (Empty Relation) 空关系是指在一个集合中,没有任何元素之间存在关系。即对于集合中的所有元素,空关系都不包含任何有序对。 …...
docker 配置代理
创建 Docker 服务配置文件: sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf添加代理配置: [Service] Environment"HTTP_PROXYhttp://<proxy-address>:<port>&q…...
Dockerfile详解:构建简单高效的容器镜像
引言 在容器化技术日益普及的今天,Dockerfile 成为了构建 Docker 镜像的核心工具。通过编写 Dockerfile,开发者可以将应用程序及其依赖打包成一个可移植、可复用的镜像,从而简化部署和运维工作。本文将详细介绍 Dockerfile 的基本概念、常用指…...
RHCD-----shell
要求: 通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 2.判断服务是否安装 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务 没有安装;安装对应的软件包 3.测试 判断服务是…...
<硬件有关> 内存攒机认知入门,内存的选择 配置 laptop PC 服务器
原因 这不是黑五吗,给我儿子买了台最便宜 ($300) DELL laptop,CPU 是 i5-1235U,但只有 8GB 内存。升级内存吧。 如何选择内存:家用范围 这里不考虑品牌,在我眼里,区别就是价格,还有所谓的物理…...
基于springboot的来访管理系统的设计与实现
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的来访管理系统的设计与实…...
window11编译pycdc.exe
一、代码库和参考链接 在对python打包的exe文件进行反编译时,会使用到uncompyle6工具,但是这个工具只支持python3.8及以下,针对更高的版本的python则不能反编译。 关于反编译参考几个文章: Python3.9及以上Pyinstaller 反编译教…...
11.22.2024 面试后记
Watching those fucking ap’s paper is bullshit and wasting your time. you’d mother fucker directly say I’m not qualified. if I’m qualified, how could I see u at this place. your dad is alread being rich and enjoy the world. 抽了一周时间去看那些教授的文章…...
Bug Fix 20241122:缺少lib文件错误
今天有朋友提醒才突然发现 gitee 上传的代码存在两个很严重,同时也很低级的错误。 因为gitee的默认设置不允许二进制文件的提交, 所以PH47框架下的库文件(各逻辑层的库文件),以及Stm32Cube驱动的库文件都没上传到Gi…...
Pinia 实战教程:构建高效的 Vue 3 状态管理系统
前言 在前端开发中,状态管理已成为必不可少的一部分,Vue.js 生态系统中提供了多种状态管理解决方案。Pinia 是 Vue 3 推出的一种全新的状态管理库,旨在取代 Vuex,提供更简洁的 API、更优雅的 TypeScript 支持以及更高效的性能表现…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
