Python 版本的 2024详细代码

在这里插入图片描述

2048游戏的Python实现

概述:
2048是一款流行的单人益智游戏,玩家通过滑动数字瓷砖来合并相同的数字,目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能,包括游戏逻辑、界面绘制和用户交互。

主要功能:

  1. 游戏界面:游戏界面由一个4x4的网格组成,每个格子可以显示不同的数字。游戏开始时,随机生成两个瓷砖,分别为2或4。
  2. 用户输入:玩家可以通过键盘的方向键(上、下、左、右)来控制瓷砖的移动和合并。
  3. 瓷砖合并:当两个相同的数字瓷砖碰撞时,它们会合并成一个新的瓷砖,数字会加倍。
  4. 胜利条件:当玩家成功合成2048时,游戏会显示胜利信息。
  5. 游戏重置:玩家可以通过按空格键重置游戏,开始新一轮。

代码结构:

  • 颜色设置:定义了不同数字对应的颜色,以便在界面上进行美观的显示。
  • 绘制函数:包括draw_griddraw_tile函数,用于绘制游戏网格和瓷砖。
  • 移动逻辑:实现了瓷砖的移动和合并逻辑,包括move_leftmove_rightmove_upmove_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_size
    start_x = x * size
    start_y = y * size
    color = 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] = 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):
            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] = 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):
            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] = 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):
            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] = 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):
            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 True
    return False

def main_menu():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif 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] = 0
                    add_new_tile()
                    add_new_tile()
                elif event.key == pygame.K_ESCAPE:
                    running = False

        screen.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()

    return

def game_loop():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif 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 = False

        if check_for_winner():
            running = False
            game_message = "You win!"
            print(game_message)

        draw_board()
        pygame.display.flip()

    return

main_menu()
game_loop()

pygame.quit()
sys.exit()

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

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

相关文章

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

大家好,我是锋哥。今天分享关于【在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?】面试题。希望对大家有帮助; 在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的? 在 Elasticsearch 中…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构,用于表示节点(顶点)之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的(边有方向)或无向的(边没有方向),可以是加权的&#xff…

Mac 系统上控制台常用性能查看命令

一、top命令显示 在macOS的控制台中,top命令提供了系统当前运行的进程的详细信息以及整体系统资源的利用情况。下面是对输出中各个字段的解释: Processes: 483 total: 系统上总共有483个进程。 2 running: 当前有2个进程正在运行。 481 sleeping: 当前有…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题,NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

极简开源Windows桌面定时提醒休息python程序

当我们长期在电脑面前坐太久后,会产生一系列健康风险,包括干眼症,颈椎,腰椎,肌肉僵硬等等。解决方案是在一定的时间间隔内我们需要have a break, 远眺可以缓解干眼症等眼部症状,站起来走动两步,…

Windows Qtcreator不能debug 调试 qt5 程序

Windows下 Qt Creator 14.0.2 与Qt5.15.2 正常release打包都是没有问题的,就是不能debug,最后发现是两者不兼容导致的; 我使用的是 编译器是 MinGW8.1.0 ,这个版本是有问题的,需要更新到最新,我更新的是Mi…

【论文笔记】Number it: Temporal Grounding Videos like Flipping Manga

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Number it: Temporal Grou…

【模版进阶】—— 我与C++的不解之缘(十八)

前言: ​ 之前浅浅的学了一下模版,这里来深入学习一下模版 1、非类型模版参数 模版参数可以分为类型形参 和非类型形参 类型形参:出现在模板参数列表中,跟在**class或者typename**之类的参数类型名称。非类型形参: 就是…

Diving into the STM32 HAL-----Timers笔记

嵌入式设备会按时间执行某些活动。对于真正简单且不准确的延迟,繁忙的循环可以执行任务,但是使用 CPU 内核执行与时间相关的活动从来都不是一个聪明的解决方案。因此,所有微控制器都提供专用的硬件外设:定时器。定时器不仅是时基生…

质量留住用户:如何通过测试自动化提供更高质量的用户体验

在当今竞争异常激烈的市场中,用户手头有无数种选择,但有一条真理至关重要: 质量留住用户。 产品的质量,尤其是用户体验 (UX),直接决定了客户是留在您的品牌还是转而选择竞争对手。随着业务的发展,出色的用户…

C++ 优先算法 —— 长度最小的子数组(滑动窗口)

目录 题目:长度最小的子数组 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口(同向双指针) 滑动窗口正确性 3. 代码实现 Ⅰ. 暴力枚举(会超时) Ⅱ. 滑动窗口(同向双指针) 题目:长…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结:GPT 是一种半监督学习,采用两阶段任务模型,通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…

进程间通信5:信号

引入 我们之前学习了信号量,信号量和信号可不是一个东西,不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的,无法预测信号可以临时保存下来,之后再处理信号是异步发送的…

代理模式:静态代理和动态代理(JDK动态代理原理)

代理模式:静态代理和动态代理以及JDK动态代理原理 为什么要使用代理模式?静态代理代码实现优缺点 动态代理JDK动态代理JDK动态代理原理JDK动态代理为什么需要被代理的对象实现接口?优缺点 CGLIB动态代理优缺点 代理模式的应用 为什么要使用代…

【AI技术赋能有限元分析应用实践】pycharm终端与界面设置导入Abaqus2024自带python开发环境

目录 一、具体说明1. **如何在 Windows 环境中执行 Abaqus Python 脚本**2. **如何在 PyCharm 中配置并激活 Abaqus Python 环境**3. **创建 Windows 批处理脚本自动执行 Abaqus Python 脚本**总结二、方法1:通过下面输出获取安装路径导入pycharm方法2:终端脚本执行批处理脚本…

【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…

虚拟局域网PPTP配置与验证(二)

虚拟局域网PPTP配置与验证(二) windows VPN客户端linux 客户端openwrt客户端性能验证虚拟局域网PPTP配置与验证(一)虚拟局域网PPTP配置与验证(二) : 本文介绍几种客户端连接PPTP服务端的方法,同时对linux/windows/openwrt 操作系统及x86、arm硬件平台下PPTP包转发性能进…

uniapp中使用uni-forms实现表单管理,验证表单

前言 uni-forms 是一个用于表单管理的组件。它提供了一种简化和统一的方式来处理表单数据,包括表单验证、字段绑定和提交逻辑等。使用 uni-forms可以方便地创建各种类型的表单,支持数据双向绑定,可以与其他组件及API进行良好的集成。开发者可…

Hive构建日搜索引擎日志数据分析系统

1.数据预处理 根据自己或者学校系统预制的数据 使用less sogou.txt可查看 wc -l sogou.txt 能够查看总行数 2.数据扩展部分 我的数据位置存放在 /data/bigfiles 点击q退出 将一个文件的内容传递到另一个目录文件下 原数据在 /data/bigfiles ->传递 到/data/workspac…