Python//自制2048小游戏 代码分析与收获

本文详细介绍了使用Python和pygame库制作2048小游戏的过程,包括代码思路、遇到的问题及解决方案、游戏功能实现,如音乐播放、矩阵操作和界面设计。同时,作者分享了在开发过程中遇到的坑和收获,如numpy数组比较、pygame界面刷新机制以及音乐文件格式限制。
摘要由CSDN通过智能技术生成

Python//2048小游戏

这是一篇关于2048小游戏自制记录,用于个人总结与回看。如果能对你有帮助,我很荣幸。  

成品效果图

伴随音乐,音量可调。
同时伴随音乐(音量可调)

0 仍存在的未解决问题

如果有大佬看见了这篇文章,能帮助我解决以下的一些问题,我十分感激。
1、在我电脑上,pygame(1.9.6)只能加载bmp图片格式,但我从查找的资料来看,pygame应该可以读取png jpg等图片格式的。
2、在我用pyinstaller将代码打包为exe文件时,添加-w(使用Windows子系统执行.当程序启动时侯不会打开命令行) 参数会出现错误,出现了我不太懂的一个名词bootloader,报错如下:在这里插入图片描述
3、在我用pyinstaller将代码打包为exe文件时,添加-i(修改exe默认图片)参数,图片十分模糊,且在打包好的文件夹中是正常的,移动到桌面(或者其他目录下)exe图标还是默认图标,十分疑惑。
4、我希望可以监测鼠标的点击位置(我希望是一个图片),但是我在pygame中发现只能(实时监测鼠标位置+鼠标点击事件)同时使用,以到达目的,但效果不好(因为要涉及到整个图片),我不太会操作。

一、写在前面

身为非计算机专业的大一小白,自知代码风格不佳,函数封装冗余,但会努力学习,如果你看我的代码觉得混乱,我十分抱歉。

1、出于Python课程大作业原因,借此机会,完成了我一直想写一个游戏的想法。
2、代码运用到了 numpy,random,pygame,sys库

import numpy as np
import random
import pygame
import sys

二、代码思路与分析

上一张粗略的思维导图
在这里插入图片描述
1、初始化部分,就是简单的生成两个4*4矩阵,record1记录上一步操作(希望添加返回上一步的功能,但设计不够完善,有一点小bug,后面会提到),record2记录当前操作,以0表示没有数字。用random.randint(0,9)来生成随机数,用以表示刷新2还是4(比例我设置为9:1)。然后将该数填入矩阵内随机位置即可,这里依然采用randint方式。
2、当发生移动时(上下左右),矩阵应该如何变化?
以向上移动为例说明。首先,排列数字(即不考虑合并),按顺序遍历矩阵,当出现数字时,放在该列最上面,此处顺序指的是:向上移动就是由小到大遍历,向下就是由大到小遍历,核心思想就是,从移动方向开始,寻找数字,并记录次数。排列完成后开始,合并相同的数字(如:4+4 = 8)这里只合并一次(做了适当简化,正常可玩一下2048,感受一下),合并过程为,遍历格子,向四周寻找相同的数字,当找到后,向移动方向合并,并把后续数字想该方向推进,然后跳出循环(这里对后续数字的判断有些冗余,我认为可以更简单,这里先不修改了),其余方向思想相同。
3、刷新矩阵,即产生一个新的数字(2或4)填入矩阵为0部分,因为此处希望可以满足按其他键(非方向键)不刷新的要求,先判断矩阵是否相同,

if not np.array_equal(record2, record1):

如果相同,则不进行刷新。此处刷新大体与初始化的刷新相同,其中一步变化就是需要判断矩阵元素是否为0,这里没有采用遍历方式,具体操作如下:

N = random.choice(np.where(record2.reshape(1, 16) == 0)[1])
Next_cell1_location_raw = N // 4
Next_cell1_location_clo = N
while Next_cell1_location_clo > 3:
Next_cell1_location_clo = Next_cell1_location_clo - 4
record2[Next_cell1_location_raw][Next_cell1_location_clo] = Next_cell1      

5、判断游戏结束,当矩阵没有元素为0时,遍历每个格子,向四周寻找相同数字,这里与合并判断一样,不懂赘述。(我写的确实是复杂了/菜)
6、最后一步就是运用pygame的界面设计,具体设计不讲,只说pygame中一些函数的运用。

pygame.init()#初始化各模块部件
size = width, height = 500, 600
screen = pygame.display.set_mode(size,flags = pygame.RESIZEABLE )#设置界面大小,可调模式(屏幕大小可调RESIZEABLE,屏幕没有边框NOFRAME,屏幕全屏显示FULLSCREEN)
icon1 = pygame.image.load('2048.bmp')#加载图片
pygame.display.set_caption('2048小游戏')#更改标题
screen.fill((238 ,220 ,130))#屏幕背景色
map_font = pygame.font.Font('msyh.ttc', 40)#生成一个字体对象,这里是微软雅黑
font_surf1 = map_font_start.render('2048 小游戏', T
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值