Python 版本的 2024详细代码

news2024/11/25 13:50:15

在这里插入图片描述

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

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

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

相关文章

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树: 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

(二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】

(二)手势识别——动作模型训练【代码数据集python环境(免安装)GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展,手势识别技术开始使用深度学习等方法进行手势识别,如Convolutional Neural…

React的基本知识:事件监听器、Props和State的区分、改变state的方法、使用回调函数改变state、使用三元运算符改变state

这篇教学文章涵盖了大量的React基本知识。 包括: 事件监听器Props和State的区分改变state的方法使用回调函数改变state使用三元运算符改变state处理state中的数组处理state中的object条件渲染 &&条件渲染 三元运算符React中的forms 1. Event Listeners 在…

JavaScript练习——文本与图形

要求实现下面这个效果&#xff1a; 观察图片&#xff0c;我们的需求如下&#xff1a; 准备画布和上下文&#xff1a;在开始绘制之前&#xff0c;需要有一个HTML5 <canvas> 元素&#xff0c;并且获取其绘图上下文&#xff08;context&#xff09;&#xff0c;这是进行绘图…

【线程】线程安全问题及解决措施

【线程】线程安全问题及解决措施 前言一、由“随机调度”引起的线程安全问题1.1现象1.2 原因1.3 解决办法1.4 不当加锁造成的死锁问题 二、由“系统优化”引起的线程安全问题2.1 内存可见性问题 / 指令重排序问题2.2 解决方案 前言 何为线程安全&#xff0c;即某段代码无论在单…

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#

一、引言 随着区块链技术的不断发展&#xff0c;Meme 文化在去中心化领域逐渐崭露头角。从 Dogecoin 到 Shiba Inu&#xff0c;再到更多细分的 Meme 项目&#xff0c;这类基于网络文化的加密货币因其幽默和社区驱动力吸引了广泛关注。作为近年来备受瞩目的区块链平台之一&…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

Dubbo源码解析-Dubbo的线程模型(九)

一、Dubbo线程模型 首先明确一个基本概念&#xff1a;IO 线程和业务线程的区别 IO 线程&#xff1a;配置在netty 连接点的用于处理网络数据的线程&#xff0c;主要处理编解码等直接与网络数据 打交道的事件。 业务线程&#xff1a;用于处理具体业务逻辑的线程&#xff0c;可以…

前端全栈 === 快速入 门 Redis

目录 简介 通过 docker 的形式来跑&#xff1a; set、get 都挺简单&#xff1a; incr 是用于递增的&#xff1a; keys 来查询有哪些 key: redis insight GUI 工具。 list 类型 left push rpush lpop 和 rpop 自然是从左边和从右边删除数据。​编辑 如果想查看数据…

Python MySQL SQLServer操作

Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL&#xff0c;通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例&#xff1a; 一、操作 MySQL&#xff1a;使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …

编程语言之C++诞生记!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C诞生的相关内容&#xff01; 关于【C诞…

核心差异:知识VS文档管理(+工具软件安利)

在讨论知识管理和文档管理时&#xff0c;我们经常会听到这两种说法被混淆使用。然而&#xff0c;它们各自服务于不同的目的&#xff0c;这一点至关重要。 想象一下&#xff0c;你是一名项目经理&#xff0c;面临以下两项任务&#xff1a; 存储最新的项目计划捕捉团队讨论中获…

医院挂号就诊系统(源码+数据库+报告)

基于SpringBoot的医院挂号就诊系统&#xff0c;系统包含三种角色&#xff1a;管理员、医生、用户,系统分为前台和后台两大模块&#xff0c;主要功能如下。 前台&#xff1a; - 首页&#xff1a;展示医院相关信息、推荐医生等内容。 - 健康教育&#xff1a;提供健康知识、文章等…

【热门主题】000065 探索人工智能学习框架:开启智能未来的钥匙

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

《智慧教育实时数据分析推荐项目》详细分析

一、项目介绍 1、背景介绍 在互联网、移动互联网的带动下&#xff0c;教育逐渐从线下走向线上&#xff0c;在线教育近几年一直处于行业的风口浪尖&#xff0c;那随着基础设施的不断完善&#xff0c;用户需求也发生不少变化&#xff0c;因此传统教育机构、新兴互联网企业都在探…

使用LUKS对Linux磁盘进行加密

前言 本实验用于日常学习用&#xff0c;如需对存有重要数据的磁盘进行操作&#xff0c;请做好数据备份工作。 此实验只是使用LUKS工具的冰山一角&#xff0c;后续还会有更多功能等待探索。 LUKS&#xff08;Linux Unified Key Setup&#xff09;是Linux系统中用于磁盘加密的一…

在 cmd 输入 python.exe 后不报错也无反应的问题

在 cmd 输入 python.exe 后不报错&#xff1a;‘python.exe ’不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件&#xff0c;也无反应。只是显示这样一个弹窗&#xff1a; 查了下环境变量path&#xff0c;看看有什么地方有python.exe&#xff0c;发现原来在C:\Us…

10、PyTorch autograd使用教程

文章目录 1. 相关思考 1. 相关思考