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

博主:命运之光

🌸专栏: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.mfbz.cn/a/34008.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习与神经网络

文章目录 引言1. 神经网络1.1 什么是神经网络1.2 神经元1.3 多层神经网络 2. 激活函数2.1 什么是激活函数2.2 激活函数的作用2.3 常用激活函数解析2.4 神经元稀疏 3. 设计神经网络3.1 设计思路3.2 对隐含层的感性认识 4. 深度学习4.1 什么是深度学习4.2 推理和训练4.3 训练的相…

python语法(高阶)-多线程编程

""" 演示多线程编程的使用 """ import time import threadingdef sing(msg):while True:print(msg)time.sleep(1)return Nonedef dance(msg):while True:print(msg)time.sleep(1)return Noneif __name__ __main__:# 创建一个唱歌的线程&#xf…

html实现好看的多种风格导航菜单(附源码)

文章目录 1.设计来源1.1 顶部导航菜单1.1.1 界面风格1-一二级连体导航菜单1.1.2 界面风格2-二级导航下拉框1.1.3 界面风格3-系统开始风格1.1.4 界面风格4-购物类导航菜单1.1.5 界面风格5 - 带搜索扩展的导航条1.1.6 界面风格6-火热效果多级导航条 1.2 悬浮按钮菜单1.2.1 界面风…

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

Ceph分布式存储系统搭建

目录 安装部署示例 &#xff08;一&#xff09;准备环境 1). 设置主机名 2). 关闭防火墙 3).添加sdb磁盘并格式化 4).配置hosts解析文件 5).配置免密登录 6).同步时区 7). 安装 Ceph 包 &#xff08;二&#xff09;创建 Ceph 集群 1、 安装ceph-deploy管理工具 2、 …

Linux 用户名称高亮和最近路径显示

1、通常情况下&#xff0c;Linux中的路径名称会不断叠加显示&#xff0c;如下图&#xff0c;这样看起来会很长。 2、为了设置路径只是当前最近的文件路径&#xff0c;先进入自己的家目录&#xff0c;然后进入.bashrc&#xff1a; 3、在.bashrc文件中的最后一行加入以下内容…

C国演义 [第三章]

第三章 组合分析步骤递归函数的返回值和参数递归结束的条件单层逻辑 组合总和 III 组合 力扣链接 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1…

Echarts区域面积areaStyle用图片进行纹理填充

React DOM结构代码&#xff1a; import fillImg from xx/fillImg.png; // 填充纹理图片...... {/* 趋势图填充纹理图片 */} <img id"fillImg" src{fillImg} style{{ width: 0 }} /> <div id"line" style{{ width: 100%, height: 300 }}></…

蓝绿发布、灰度发布和滚动发布

系列文章目录 文章目录 系列文章目录一、1.金丝雀发布&#xff08;Canary Release&#xff09;的工作原理&#xff1a;2.滚动发布&#xff08;Rolling Release&#xff09;3.蓝绿发布&#xff08;Blue-Green Deployment&#xff09;有钱人玩的&#xff01; 总结 一、 当涉及到…

深入理解深度学习——注意力机制(Attention Mechanism):带掩码的多头注意力(Masked Multi-head Attention)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

WPF中的Behavior及Behavior在MVVM模式下的应用

WPF中的Behavior及Behavior在MVVM模式下的应用 在WPF中&#xff0c;Behaviors&#xff08;行为&#xff09;是一种可重用的组件&#xff0c;可以附加到任何UI元素上&#xff0c;以添加特定的交互行为或功能。Behaviors可以通过附加属性或附加行为的方式来实现。 Behavior并不…

知识蒸馏学习记录(二)

上一篇博文中我们介绍了知识蒸馏的一些基础知识&#xff0c;这里我们来学习其到底是如何完成知识蒸馏过程的。 知识蒸馏为何可以让学生网络模型小却性能强&#xff1f; 详细很多同学与我有相同的疑问&#xff0c;尽管它依靠不同的蒸馏温度T可以学得一些hard target标注无法包…

三维空间刚体运动之旋转矩阵与变换矩阵

1. 旋转矩阵 1.1 点、向量和坐标系 点&#xff1a;点是空间中的基本元素&#xff0c;没有长度&#xff0c;没有体积&#xff1b; 向量&#xff1a;把两个点连接起来&#xff0c;就构成了向量&#xff0c;向量可以看成从某点指向另一点的一个箭头&#xff1b;只有当我们指定这…

hive基于新浪微博的日志数据分析——项目及源码

有需要本项目的全套资源资源以及部署服务可以私信博主&#xff01;&#xff01;&#xff01; 该系统的目的是利用大数据技术&#xff0c;分析新浪微博的日志数据&#xff0c;从而探索用户行为、内容传播和移动设备等各个层面的特性和动向。这项研究为公司和个人在制定营销战略、…

Redis数据库的简介、部署及常用命令

Redis数据库的简介、部署及常用命令 一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库3、关系数据库与非关系型数据库区别4、非关系型数据库产生背景 二、Redis简介1、Redis服务器程序的单线程模型2、Redis的优点 三、Redis部署四、Redis 命令工具1、redis…

【Openvino03】深入了解OpenVINO™ 工具包与Jupyter Notebooks工程

接上一篇&#xff0c;本篇将以OpenVINO™ 工具包、Jupyter Notebook工具以及OpenVINO™ Notebooks工程为基础&#xff0c;依照构建环境、工具学习、案例学习、实战部署的顺序引导初学者完成从0到1学习人工智能的全过程&#xff0c;希望众多对人工智能感兴趣的开发者&#xff0c…

说说@EnableConfigurationProperties那点事

两者的对比 ConfigurationProperties 使用ConfigurationProperties的时候&#xff0c;把配置类的属性与yml配置文件绑定起来的时候&#xff0c;还需要加上Component注解才能绑定并注入IOC容器中&#xff0c;若不加上Component&#xff0c;则会无效。 EnableConfigurationPro…

RNN其中的X.reshape

假设RNN中的输入为2528&#xff0c;2是batchsize可以理解为有几句话&#xff0c;5是timestep可以理解为有几个词&#xff0c;28是vocab_size。如下就是两个句子&#xff0c;每个句子由5个单词组成。28则为每个单词的词向量&#xff0c;在此略去。 在输入的时候&#xff0c;首先…

一步一步学OAK之十一:实现在RGB相机上进行对象跟踪

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4:定义和加载模型相关的路径和标签Setup 5: 创建pipelineSetup 6: 创建节点Setup 7: 设置属性设置相机属性设置神经网络节点属性设置物体跟踪对象属性 Setup 8: 建立链接Setup 9: 连接设备并启动管道Setup …