用Python做一个2048小游戏

news/2024/7/27 7:40:04/文章来源:https://blog.csdn.net/m0_37816922/article/details/135478262

文章目录

    • 逻辑设计
    • 绘图逻辑
    • 主循环

逻辑设计

2048的逻辑无非是操作 4 × 4 4\times4 4×4的方格,每个方格中有一个数,这些数可以移动,如果两个相同的数字在移动时相撞了,就可以彼此合并。

而这个 4 × 4 4\times4 4×4的方格,无非是一个矩阵。只需设计好移动逻辑,再用PyGame将这个方格表现出来就算大功告成。

2048只有四个手势动作,即上下左右,这四个动作所引发的结果都可以归结为对单行或者单列的操作,进而归结为对一个列表的操作。

首先,对列表进行操作时,先排除0的影响,在排除0的影响之后,若相邻元素相等,即可合并。例如对于 [ 0 , 2 , 2 , 0 ] [0,2,2,0] [0,2,2,0],如果向左合并则输出为 [ 4 , 0 , 0 , 0 ] [4,0,0,0] [4,0,0,0]

def mergeLst(lst):lst = [x for x in lst if x] # 删除lst中的0newLst = []N, i = len(lst), 0while i < N:if i<N-1 and lst[i] == lst[i+1]:newLst.append(lst[i]*2)i += 2else:newLst.append(lst[i])i += 1return newLst + (4-len(newLst))*[0]

测试如下

mergeLst([0,2,2,0]) # [4, 0, 0, 0]
mergeLst([2,2,2,2]) # [4, 4, 0, 0]
mergeLst([2,2,8,4]) # [4, 8, 4, 0]

相应地,对一个矩阵进行合并,只需针对每一行进行操作即可

[mergeLst(x) for x in mat]

对于上下左右不同按键的操作,可以先将矩阵旋转,然后再进行合并操作,合并之后再逆转回来。

def rotate(mat):newMat = [[[] for _ in mat] for b in mat[0]]for i,row in enumerate(mat, 1):for j,r in enumerate(row, 0):newMat[j][-i] = rreturn newMat

在实际操作中,左、下、右、上分别对应旋转0,1,2,3次,即

KEY_DCT = {pygame.K_LEFT:0,   pygame.K_DOWN:1,pygame.K_RIGHT:2,  pygame.K_UP:3
}

从而游戏的总挪动逻辑如下

def updateMat(mat, key):N = KEY_DCT[key]for _ in range(N):mat = rotate(mat)mat = [mergeLst(x) for x in mat]for _ in range(4-N):mat = rotate(mat)   # 旋转回来return mat

2048游戏在开始之前,需要初始化一个4x4的矩阵,然后每次操作之前,需要在矩阵中为0的位置随机生成一个数。随机生成的数的取值范围决定了游戏的难度,所以生成方式也比较灵活,下面给出一种普通的生成方法

from itertools import product
from random import sample, randint
def addNew(mat):ijs = []for i,j in product(range(4), range(4)):if mat[i][j] == 0:ijs.appen((i,j))if len(ijs) == 0:return Falsei, j = sample(ijs, 1)[0]   # 挑选一个不为0的点x = randint(1,100)x = 7 - np.floor(np.log2(x))mat[i,j] = int(2**x)return True

绘图逻辑

这个游戏的绘图逻辑比较简单,只需为矩阵中每个元素赋予一个颜色即可。

GRAY = (205, 205, 205)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SIZE = 80def setColor(N):if N == 0:return (233, 233, 233)n = int(math.log2(N))delta = int(255/15)return (255-n*delta, n*delta, (128+n*delta)%255)def draw(win, font, mat):for i,j in product(range(4), range(4)):ch = str(mat[i][j])rect = (j*SIZE, i*SIZE, SIZE, SIZE)c = setColor(mat[i][j])pygame.draw.rect(win, c, rect)pygame.draw.rect(win, GRAY, rect, 5)txt = font.render(ch, True, GREEN)offset =  (0.5 - len(ch)/10)*SIZExy = (j*SIZE+offset, (i+0.3)*SIZE)win.blit(txt, xy)

主循环

最后,实现游戏的主循环如下

def gui():pygame.init()win = pygame.display.set_mode((4 * SIZE, 4 * SIZE))pygame.display.set_caption("迷宫游戏")font.init()f = font.Font('C:\\WINDOWS\\Fonts\\ARLRDBD.TTF', 32)running = Truemat = [[0]*4 for _ in range(4)]addNew(mat)while running:win.fill(WHITE)for evt in pygame.event.get():if evt.type == pygame.QUIT:returnif evt.type == pygame.KEYDOWN and evt.key in KEY_DCT:newMat = updateMat(mat, evt.key)if newMat!=mat:mat = newMatrunning = addNew(mat)draw(win, f, mat)# 判断玩家是否到达出口if max([max(x) for x in mat])==2048:print("恭喜通关")running = Falseif min([min(x) for x in mat])>0:print("游戏失败")running = Falsepygame.display.update()

游戏效果如下

在这里插入图片描述

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

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

相关文章

Jenkins自动化部署docker

Jenkins自动化部署docker和普通方式构建 docker外挂目录 准备测试服务器docker环境准备jdk环境将上传jar包修改为app.jar对外暴露1000端口启动jar FROM openjdk:8-jdk-alpine ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 1000 ENTRYPOINT ["java","-jar&q…

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

(学习日记)2024.01.09

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…

领导看了就给我升职加薪的年终总结,我只花5分钟就写完了!

年末正是做总结的时候&#xff0c;如果你正苦于年终总结不知道该如何下手&#xff0c;ProcessOn刚好上线了AI一键帮你生成年终总结的活动&#xff0c;还可以下载成PPT格式&#xff0c;或许可以助你一臂之力&#xff0c;操作起来十分简单。当然&#xff0c;计划也可以一键生成&a…

Linux 内核大转变:是否将迈入现代 C++ 的时代?

Linux开发者 H. Peter Anvin 在邮件列表中重启了关于 Linux内核C代码转换为C的讨论&#xff0c;并陈述了自己的观点。说之前先看一下这个话题的历史背景。 早在2018年4月1日&#xff0c;Andrew Pinski提议将 Linux 内核源码转为 C&#xff0c;在文中写道之所以引入是由于以下优…

2023 年公链发展报告

作者&#xff1a;stellafootprint.network 2023 年&#xff0c;公链领域展现出强大的韧性和持续的创新力。这一年&#xff0c;比特币的强势回归、以太坊的稳步增长以及 Solana 的惊人崛起&#xff0c;共同绘制出一幅市场复苏的生动画面。在这一背景下&#xff0c;公链加密货币…

Springboot + websocket 实现 一对一 单人聊天

Springboot websocket 实现 一对一 单人聊天 要使用websocket ,需要添加 jar 打开项目中的pom.xml,添加以下内容 创建java端代码 配置websocke的endpoints 配置websocket的server ServerEndpoint(value "/websocket/{username}") 这句话 一定要注意, 这里 路…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

使用swift创建第一个ios程序

一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试

Arduino快速上手esp32方案开发

一、什么是ESP32&#xff1f; ESP32是Espressif Systems推出的一款高性能、低功耗的Wi-Fi和蓝牙双模系统级芯片&#xff08;SoC&#xff09;&#xff0c;广泛应用于物联网、智能家居、可穿戴设备等领域。它基于极低功耗的Tensilica Xtensa LX6微处理器&#xff0c;并集成了丰富…

云计算概述(发展过程、定义、发展阶段、云计算榜单)(一)

云计算概述&#xff08;一&#xff09; &#xff08;发展过程、定义、发展阶段、云计算榜单&#xff09; 本文目录&#xff1a; 零、00时光宝盒 一、前言 二、云计算的发展过程 三、云计算的定义 四、云计算发展阶段 五、云计算公司榜单看云计算兴衰 六、参考资料 零、0…

C++ 设计模式之组合模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是组合模式 组合模式是⼀种结构型设计模式&#xff0c;它将对象组合成树状结构来表示“部分-整体”的…

自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结&#xff1a; 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化&#xff0c;因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…

ES数据聚合

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…

Python办公自动化 – 自动化文本翻译和Oracle数据库操作

Python办公自动化 – 自动化文本翻译和Oracle数据库操作 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自…

Smallpdf扫描、转换、压缩、编辑、签名PDF

【应用名称】&#xff1a;Smallpdf: 扫描、转换、压缩、编辑、签名PDF 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Smallpdf 【应用版本】&#xff1a;1.71.0 【应用大小】&#xff1a;150MB 【软件说明】&#xff1a;通过 Smallpdf&#xff0c;您可以&…

【河海大学论文LaTeX+VSCode全指南】

河海大学论文LaTeXVSCode全指南 前言一、 LaTeX \LaTeX{} LATE​X的安装二、VScode的安装三、VScode的配置四、验证五、优化 前言 LaTeX \LaTeX{} LATE​X在论文写作方面具有传统Word无法比拟的优点&#xff0c;VScode作为一个轻量化的全功能文本编辑器&#xff0c;由于其极强的…

Python 二维平面Delaunay三角网建立

目录 一、算法概念二、代码实现三、结果示例根据二维平面内的离散点建立平面三角网。 一、算法概念 三角剖分与Delaunay剖分定义:如何把一个散点集剖分成不均匀的三角形网格,即在给定的平面点集上,生成三角形集合的过程。考虑平面点集P={p1,p2,p3,…,pn},我们希望得到三…

Kibana:使用反向地理编码绘制自定义区域地图

Elastic 地图&#xff08;Maps&#xff09;附带预定义区域&#xff0c;可让你通过指标快速可视化区域。 地图还提供了绘制你自己的区域地图的功能。 你可以使用任何您想要的区域数据&#xff0c;只要你的源数据包含相应区域的标识符即可。 但是&#xff0c;当源数据不包含区域…