星辰秘典:揭开Python项目的神秘密码——2048游戏

news2024/9/23 9:31:55

博主:命运之光

🌸专栏:Python星辰秘典

🐳专栏:web开发(html css js)

❤️专栏:Java经典程序设计

☀️博主的其他文章:点击进入博主的主页

前言:你好,欢迎来到我的博客。我是一个热爱编程的人,特别喜欢用Python这门语言来创造一些有趣的图形项目。在这篇博客中,我将和你分享一些我用Python写的小的图形项目,包括它们的原理,代码和效果。我希望你能从中学到一些有用的知识,也能感受到编程的乐趣。如果你对我的项目有任何问题或建议,欢迎在评论区留言,我会尽快回复你。让我们开始吧!

目录

项目名称:Python 2048 游戏

项目介绍

项目功能

项目实现

项目应用

项目展示

游戏运行

 项目源代码

如何运行项目(超简单)

1.win+r打开命令行窗口 

2.在窗口中复制粘贴下面内容

打开pycharm

step1

step2

复制粘贴源代码运行

项目总结


项目名称:Python 2048 游戏

项目介绍

Python 2048 游戏是基于经典的2048游戏规则,使用Python编写的一款益智游戏。玩家需要通过合并相同数字的方块,不断合成更大的数字,最终达到2048方块,挑战自己的智力和策略。

项目功能

1. 游戏界面:提供一个可视化的游戏界面,显示2048方块的网格和当前得分。

2. 方块移动:玩家可以使用方向键(上、下、左、右)控制方块的移动方向,方块会沿指定方向移动,并合并相同数字的方块。

3. 方块合并:当两个相邻方块的数字相等时,它们会合并成一个更大的数字方块。

4. 得分计算:根据合并的方块数字计算得分,每次合并都会增加相应的分数。

5. 游戏结束判断:当所有方格都被填满且无法继续移动时,游戏结束。

6. 重新开始游戏:在游戏结束后,提供重新开始游戏的选项,玩家可以选择重新开始游戏。

项目实现

该项目使用Python编程语言实现了2048游戏的逻辑和图形界面展示。通过使用Python的图形界面库(例如Pygame、Tkinter等),创建游戏界面,并使用数据结构(如列表、数组等)存储和操作游戏方块的数字和位置信息。通过监听键盘事件,实现方块的移动和合并,并在界面上实时更新方块的显示和得分。

项目应用

Python 2048 游戏项目是一个有趣且具有挑战性的益智游戏。通过实现这个项目,可以加深对Python编程语言、图形界面和逻辑编程的理解和应用。此外,该项目也能提高玩家的问题解决能力、逻辑思考能力和策略规划能力。

项目展示

游戏运行

经典的2048游戏

游戏结束 

 项目源代码

import pygame
import random

# 游戏界面大小
GRID_SIZE = 4
CELL_SIZE = 100
GRID_WIDTH = GRID_SIZE * CELL_SIZE
GRID_HEIGHT = GRID_SIZE * CELL_SIZE

# 颜色定义
BACKGROUND_COLOR = (187, 173, 160)
CELL_COLOR = (205, 193, 180)
TEXT_COLOR = (255, 255, 255)

# 初始化Pygame
pygame.init()

# 创建游戏窗口
window = pygame.display.set_mode((GRID_WIDTH, GRID_HEIGHT + 50))
pygame.display.set_caption("2048")

# 加载字体
font = pygame.font.Font(None, 48)

# 积分变量
score = 0


def draw_grid():
    # 绘制游戏界面网格
    window.fill(BACKGROUND_COLOR)
    for row in range(GRID_SIZE):
        for col in range(GRID_SIZE):
            cell_value = grid[row][col]
            cell_color = get_cell_color(cell_value)
            cell_rect = pygame.Rect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE)
            pygame.draw.rect(window, cell_color, cell_rect)
            if cell_value != 0:
                draw_text(cell_value, cell_rect)

    # 绘制积分
    score_text = font.render("Score: " + str(score), True, TEXT_COLOR)
    window.blit(score_text, (10, GRID_HEIGHT + 10))


def draw_text(value, rect):
    # 绘制方块中的数字
    text_surface = font.render(str(value), True, TEXT_COLOR)
    text_rect = text_surface.get_rect()
    text_rect.center = rect.center
    window.blit(text_surface, text_rect)


def get_cell_color(value):
    # 根据方块的值获取对应的颜色
    colors = {
        0: (205, 193, 180),
        2: (238, 228, 218),
        4: (237, 224, 200),
        8: (242, 177, 121),
        16: (245, 149, 99),
        32: (246, 124, 95),
        64: (246, 94, 59),
        128: (237, 207, 114),
        256: (237, 204, 97),
        512: (237, 200, 80),
        1024: (237, 197, 63),
        2048: (237, 194, 46),
    }
    return colors.get(value, (0, 0, 0))


def add_new_tile():
    # 在随机空位置生成一个新数字(2或4)
    empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if grid[i][j] == 0]
    if empty_cells:
        row, col = random.choice(empty_cells)
        grid[row][col] = random.choice([2, 4])


def move_tiles_left():
    # 向左移动所有数字块
    global score
    for row in range(GRID_SIZE):
        merged = [False] * GRID_SIZE
        for col in range(1, GRID_SIZE):
            if grid[row][col] != 0:
                k = col
                while k > 0 and grid[row][k - 1] == 0:
                    grid[row][k - 1] = grid[row][k]
                    grid[row][k] = 0
                    k -= 1
                if k > 0 and not merged[k - 1] and grid[row][k - 1] == grid[row][k]:
                    grid[row][k - 1] *= 2
                    grid[row][k] = 0
                    merged[k - 1] = True
                    score += grid[row][k - 1]  # 更新积分


def move_tiles_up():
    # 向上移动所有数字块
    global score
    for col in range(GRID_SIZE):
        merged = [False] * GRID_SIZE
        for row in range(1, GRID_SIZE):
            if grid[row][col] != 0:
                k = row
                while k > 0 and grid[k - 1][col] == 0:
                    grid[k - 1][col] = grid[k][col]
                    grid[k][col] = 0
                    k -= 1
                if k > 0 and not merged[k - 1] and grid[k - 1][col] == grid[k][col]:
                    grid[k - 1][col] *= 2
                    grid[k][col] = 0
                    merged[k - 1] = True
                    score += grid[k - 1][col]  # 更新积分


def move_tiles_right():
    # 向右移动所有数字块
    global score
    for row in range(GRID_SIZE):
        merged = [False] * GRID_SIZE
        for col in range(GRID_SIZE - 2, -1, -1):
            if grid[row][col] != 0:
                k = col
                while k < GRID_SIZE - 1 and grid[row][k + 1] == 0:
                    grid[row][k + 1] = grid[row][k]
                    grid[row][k] = 0
                    k += 1
                if k < GRID_SIZE - 1 and not merged[k + 1] and grid[row][k + 1] == grid[row][k]:
                    grid[row][k + 1] *= 2
                    grid[row][k] = 0
                    merged[k + 1] = True
                    score += grid[row][k + 1]  # 更新积分


def move_tiles_down():
    # 向下移动所有数字块
    global score
    for col in range(GRID_SIZE):
        merged = [False] * GRID_SIZE
        for row in range(GRID_SIZE - 2, -1, -1):
            if grid[row][col] != 0:
                k = row
                while k < GRID_SIZE - 1 and grid[k + 1][col] == 0:
                    grid[k + 1][col] = grid[k][col]
                    grid[k][col] = 0
                    k += 1
                if k < GRID_SIZE - 1 and not merged[k + 1] and grid[k + 1][col] == grid[k][col]:
                    grid[k + 1][col] *= 2
                    grid[k][col] = 0
                    merged[k + 1] = True
                    score += grid[k + 1][col]  # 更新积分


def is_game_over():
    # 检查游戏是否结束(无法再移动数字块)
    for row in range(GRID_SIZE):
        for col in range(GRID_SIZE):
            if grid[row][col] == 0:
                return False
            if col < GRID_SIZE - 1 and grid[row][col] == grid[row][col + 1]:
                return False
            if row < GRID_SIZE - 1 and grid[row][col] == grid[row + 1][col]:
                return False
    return True


def draw_grid():
    # 绘制游戏界面网格
    window.fill(BACKGROUND_COLOR)
    for row in range(GRID_SIZE):
        for col in range(GRID_SIZE):
            cell_value = grid[row][col]
            cell_color = get_cell_color(cell_value)
            cell_rect = pygame.Rect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE)
            pygame.draw.rect(window, cell_color, cell_rect)
            if cell_value != 0:
                draw_text(cell_value, cell_rect)

    # 绘制积分
    score_text = font.render("Score: " + str(score), True, TEXT_COLOR)
    window.blit(score_text, (10, GRID_HEIGHT + 10))


def update_score(points):
    # 更新积分
    global score
    score += points


# 初始化游戏界面
grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]
add_new_tile()
add_new_tile()

# 游戏循环
running = True
while running:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if not is_game_over():
                if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                    move_tiles_left()
                    add_new_tile()
                elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                    move_tiles_right()
                    add_new_tile()
                elif event.key == pygame.K_w or event.key == pygame.K_UP:
                    move_tiles_up()
                    add_new_tile()
                elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
                    move_tiles_down()
                    add_new_tile()  # 在移动后生成新数字块

    # 绘制界面
    draw_grid()
    pygame.display.update()

    if is_game_over():
        print("游戏结束!")
        print("最终积分:", score)

# 退出游戏
pygame.quit()

如何运行项目(超简单)

在运行上述代码之前,你需要确保你的环境中已经安装了Pygame依赖项:

Pygame:一个用于开发游戏的Python库。你可以使用以下命令通过pip安装Pygame

如果没有安装用以下方法进行安装

1.win+r打开命令行窗口 

2.在窗口中复制粘贴下面内容

使用国内的镜像源:将pip的默认源替换为国内的镜像源可以加快下载速度。你可以使用以下命令来更换pip的源:

下载:Pygame:一个用于游戏开发的Python库,用于创建游戏界面和处理用户输入。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame

下载:numpy:一个用于数值计算和数组操作的Python库。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy

打开pycharm

step1

step2

复制粘贴源代码运行

项目总结

Python 2048 游戏项目是一个有趣的益智游戏,通过合并方块数字来挑战自己的智力和策略。通过使用Python编程语言和图形界面库,实现了游戏的逻辑和界面展示。希望这个项目能够给玩家们带来娱乐和挑战,同时提升编程和思维能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/697245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 部署 jar 项目

文章目录 1、上传jar包2、新建 Dockerfile 文件3、新建 deploy.sh 脚本&#xff08;创建并运行&#xff09;4、新建 upgrade.sh 脚本&#xff08;更新&#xff09; 1、上传jar包 2、新建 Dockerfile 文件 添加jar包及修改端口 # 基础镜像 FROM java:8 # 添加jar包 ADD servic…

百度智能车竞赛丝绸之路智能车设计与编程实现控制

一、项目简介 本项目现已基于鲸鱼机器人开发套件对其整体外形进行设计&#xff0c;并且对应于实习内容——以“丝绸之路”为题&#xff0c;对机器人各个功能与机器人结构部分进行相关设计与调整。主要可以实现“车道线巡检”“音乐交际”、“城堡检测”、“翻山越岭”。 本项…

Java使用策略模式和工厂模式来消除冗余的if-else语句(UML类图+案例+提供Gitee源码)

前言&#xff1a;在最近的后端开发中&#xff0c;多多少少会发现有很多if-else语句&#xff0c;如果条件过多则会造成整体代码看起来非常臃肿&#xff0c;这边我就举一个我在实际开发中的例子&#xff0c;来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式…

把Jar打包为Maven 把jar打包为maven 将java项目打包为maven 将Java项目打包为Maven

把Jar打包为Maven 把jar打包为maven 将java项目打包为maven 将Java项目打包为Maven 自己写了一个通用SDK Jar包&#xff0c;但是现在的项目都是Maven项目&#xff0c;需要把Jar打包为Maven格式&#xff0c;输出到本地Maven仓库&#xff0c;在项目中可以引用查看Maven是否安装打…

nginx进行反向代理

Nginx是一个开源的高性能Web服务器和反向代理服务器。它最初是由Igor Sysoev在2004年开发的&#xff0c;现在由一个全球性的社区维护和支持。 Nginx的主要特点包括&#xff1a; 高性能&#xff1a;Nginx使用事件驱动模型&#xff0c;可以处理高并发请求&#xff0c;具有出色的…

A* 算法研究(附 Python / C++ 实现)

A* 算法研究 参考 A*寻路算法详解 #A星 #启发式搜索 路径规划之 A* 算法 最短路搜索-从Dijkstra到Best-First再到A-Star 路径规划算法学习笔记&#xff08;一&#xff09;&#xff1a;A*算法 A*算法寻路&#xff08;C代码实现&#xff09; 《基于A*算法的自动泊车全局路径规划…

恒生电子联合恒生聚源发布数智金融新品,聚焦大模型技术金融业务应用

6月28日&#xff0c;恒生电子和旗下子公司恒生聚源正式发布基于大语言模型技术打造的数智金融新品&#xff0c;金融智能助手光子和全新升级的智能投研平台WarrenQ。此外&#xff0c;恒生电子金融行业大模型LightGPT也首次对外亮相&#xff0c;并公布最新研发进展。 恒生电子董…

升级Win10后多了个恢复分区,有什么用

很多用户从Win7/Win8/Win8.1升级到Win10之后发现电脑硬盘上多出了一个“恢复分区”&#xff0c;64位系统下这个分区大小在450MB左右。那么为什么会多出这样一个分区&#xff0c;这个分区又是干什么的&#xff0c;能不能删除呢&#xff1f;下面以MBR硬盘情况为例来说明。 1.全盘…

MySQL数据库 SQL语言命令总结 数据类型、运算符和聚合函数汇总

数据库&#xff1a;存储数据的仓库&#xff0c;有组织的进行存储数据。SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准。常用的关系型数据库管理系统&#xff1a;Oracle、MySQL、Microsoft SQL Server等。 Oracle是大型收费数据库&…

初识express/路由/中间件

路由的概念 模块化路由 中间件(要有输入输出) 简化版本 全局生效中间件 局部生效中间件 注意事项 中间件分类 内置中间件,解析请求体/url-encoded 自定义中间件 使用querystring模块解析请求体数据 编写接口 ​​​​​​​

x86_64(intel64、amd64)和ARM64的区别以及发展

文章目录 区别引用 区别 ARM64架构 ARM 公司研发的&#xff0c;用的是精简指令集&#xff08;追求节能&#xff0c;低功耗&#xff09;。通常用于手机、平板等CPU&#xff0c;目前笔记本电脑也会采用ARM64构架的CPU&#xff0c;比如mac m1就是arm64(查看命令&#xff1a;uname…

智能佳—LoCoBot WX250 6自由度

&#xff08;用于科研与教学的ROS智能车&#xff09; LoCoBot是用于映射、导航和操纵&#xff08;可选&#xff09;等ROS研究的智能车&#xff0c;研究人员、教育工作者和学生都可以使用LoCoBot专注于高级代码的开发&#xff0c;而不是专注硬件和构建低级代码。通过开放的源代码…

EasyExcel实现指定列自定义导出

效果展示 全部导出 自定义导出 代码实现 1.引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version> </dependency> 2.实体类 Data public class User {Exc…

vue PC端完成电子签名

最近接到一任务&#xff0c;有一个功能&#xff0c;重来没有遇到过。就是电子签名 看了原型其他基本都是对接口、写表单&#xff0c;难度不大&#xff0c;先把电子签名给攻克了起。 因为项目是vue 所有使用了 vue-esign 组件 1. 安装依赖 npm install vue-esign --save2.使用…

C++中的关联容器map下标运算符[]使用分析

最近使用到C中的map&#xff0c;发现一个问题&#xff0c;如果一个键不存在时&#xff0c;下标运算符会创建一个新的元素&#xff0c;其关键字为键。 一&#xff0c;问题重现 首先看一下问题描述&#xff1a; 本题要求读入 N 名学生的成绩&#xff0c;将获得某一给定分数的学生…

最细接口自动化测试yaml框架,超全详解,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 YAML文件介绍 YAM…

津津乐道设计模式 - 责任链模式详解(教你更优雅的处理商城下单业务)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Linux系统的目录结构与基本命令

目录 Linux系统使用注意 Linux严格区分大小写 Linux文件"扩展名" Linux系统中常见的后缀名称&#xff1a; Linux中所有内容以文件形式保存 Linux中存储设备都必须在挂载之后才能使用 Linux系统的目录结构 Linux分区与Windows分区 Linux系统文件架构 Linux系…

用AI帮助小学一年级记住常用字

这几天娃就要一年级毕业放假了&#xff0c;感觉时间过得太快了。再开学就要上二年级&#xff0c;可汉字表上的区区三四百字&#xff0c;咋就那么的难读&#xff1f;难记&#xff1f;喊他们来认字&#xff0c;拉都拉不过来。哎&#xff0c;愁啊&#xff0c;替他们焦虑。突发奇想…

Docker发布VUE vhr微人事前端(Nginx 403 forbidden)

本文代码来源于&#xff08;感谢作者&#xff09; GitHub - lenve/vhr: 微人事是一个前后端分离的人力资源管理系统&#xff0c;项目采用SpringBootVue开发。 发布过程参考博主 【Docker】使用docker容器发布vue项目_docker 发布vue_TOP灬小朋友的博客-CSDN博客 1.创建Do…