【Python游戏】用Python实现一个2048小游戏 | 附带源码
导语
感觉好几天没和大家一起写小游戏玩了,今天恰巧有空。这次我们来用Python做个2048小游戏吧。废话不多说,上才艺
相关文件
公众号:Python日志
可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!!
源码领取:加Python学习交流群:773162165 可以领取哟
开发环境
Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理介绍
“使用方向键移动方块,两个数字相同的方块撞在一起后,将会合并为一个数字是原来两倍的新方块。游戏的时候尽可能多地合并这些数字方块就行了。”
大概了解了游戏规则之后,我们就可以开始写这个游戏啦~首先,进行一下游戏初始化操作并播放一首自己喜欢的游戏背景音乐:
# 游戏初始化pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('2048 公众号:Python日志 Python学习交流群:773162165')# 播放背景音乐pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1)
接着,我们来定义一个2048游戏类,里面主要负责实现2048的各种游戏规则:
'''2048游戏'''
class Game2048(object):def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):# matrix_size: (num_rows, num_cols)self.matrix_size = matrix_size# 游戏最高分保存路径self.max_score_filepath = max_score_filepath# 初始化self.initialize()
具体而言,我们先用一个二维的列表来保存当前的游戏状态:
self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]
其中null表示当前的块里没有数字。否则,对应的位置则用当前的数字表示。很显然地,2048小游戏的当前游戏状态是可以用一个4*4的列表表示的:
游戏一开始,我们需要在这个二维列表里随机地选择两个位置生成数字(即2或者4):
'''在新的位置随机生成数字'''
def randomGenerateNumber(self):empty_pos = []for i in range(self.matrix_size[0]):for j in range(self.matrix_size[1]):if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])i, j = random.choice(empty_pos)self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4self.randomGenerateNumber()
self.randomGenerateNumber()
然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分:
移动所有的数字块并进行必要的合并和记分;
随机地在一个还没有数字的位置上生成一个数字。
具体而言,代码实现如下:
'''更新游戏状态'''
def update(self):game_matrix_before = copy.deepcopy(self.game_matrix)self.move()if game_matrix_before != self.game_matrix: self.randomGenerateNumber()
其中,移动所有的数字并进行必要的合并的代码实现如下:
'''根据指定的方向, 移动所有数字块'''
def move(self):# 提取非空数字def extract(array):array_new = []for item in array:if item != 'null': array_new.append(item)return array_new# 合并非空数字def merge(array):score = 0if len(array) < 2: return array, scorefor i in range(len(array)-1):if array[i] == 'null':breakif array[i] == array[i+1]:array[i] *= 2array.pop(i+1)array.append('null')score += array[i]return extract(array), score# 不需要移动的话直接returnif self.move_direction is None: return# 向上if self.move_direction == 'up':for j in range(self.matrix_size[1]):col = []for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j])col = extract(col)col.reverse()col, score = merge(col)self.score += scorecol.reverse()col = col + ['null',] * (self.matrix_size[0] - len(col))for i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i]# 向下elif self.move_direction == 'down':for j in range(self.matrix_size[1]):col = []for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j])col = extract(col)col, score = merge(col)self.score += scorecol = ['null',] * (self.matrix_size[0] - len(col)) + colfor i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i]# 向左elif self.move_direction == 'left':for idx, row in enumerate(copy.deepcopy(self.game_matrix)):row = extract(row)row.reverse()row, score = merge(row)self.score += scorerow.reverse()row = row + ['null',] * (self.matrix_size[1] - len(row))self.game_matrix[idx] = row# 向右elif self.move_direction == 'right':for idx, row in enumerate(copy.deepcopy(self.game_matrix)):row = extract(row)row, score = merge(row)self.score += scorerow = ['null',] * (self.matrix_size[1] - len(row)) + rowself.game_matrix[idx] = rowself.move_direction = None
懒得动脑子了(反正就4*4那么大T_T),所以直接遍历了这个二维列表以实现我们想要的所有操作了。最后,我们再写个函数以根据当前的游戏状态来判断游戏是否结束就ok啦:
'''游戏是否结束'''
@property
def isgameover(self):for i in range(self.matrix_size[0]):for j in range(self.matrix_size[1]):if self.game_matrix[i][j] == 'null': return Falseif (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):continueelif (i == self.matrix_size[0] - 1):if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):return Falseelif (j == self.matrix_size[1] - 1):if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):return Falseelse:if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):return Falsereturn True
其实很简单,如果二维列表被数字填满,且数字不能再进行合并的话,这局游戏就结束了,否则,游戏就没有结束。
定义完2048游戏类,我们的游戏基本上算是写完了。只需要在游戏主循环里根据用户操作来更新当前的游戏状态并将游戏里所有必要的元素显示在屏幕上就ok啦:
# 游戏主循环
clock = pygame.time.Clock()
is_running = True
while is_running:screen.fill(pygame.Color(cfg.BG_COLOR))# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])# --更新游戏状态game_2048.update()if game_2048.isgameover:game_2048.saveMaxScore()is_running = False# --将必要的游戏元素画到屏幕上drawGameMatrix(screen, game_2048.game_matrix, cfg)start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)drawGameIntro(screen, start_x, start_y, cfg)# --屏幕更新pygame.display.update()clock.tick(cfg.FPS)
return endInterface(screen, cfg)
最后的效果大概是这样的:
玩这个我还是一个菜鸡,嘿嘿~
大家要是有啥不懂的或者有啥疑问的话,可以在下面评论哟,当然别忘了一键三连关注一下小编啦!
【Python游戏】用Python实现一个2048小游戏 | 附带源码相关推荐
- 安装Docker,在本机上跑一个‘2048’小游戏(脉冲云在线体验)
安装Docker,在本机上跑一个'2048'小游戏 脉冲云–让软件开发效率提升十倍.在线免费体验 下面的步骤是在本机上运行的,也可以免费在脉冲云官网上部署一个在线的'2048'小游戏体验一下. 1 ...
- linux安装2048游戏,如何在CentOS上安装一个2048小游戏
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
- 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)
刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码) 测试开发社区 6天前 文章转载自公众号 AirPython , 作者 星安果 阅读文本大概需要 12 分钟. 1 目 标 场 景 ...
- python画圣诞帽_使用Python给头像加上圣诞帽或圣诞老人小图标附源码
随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhi ...
- python画圣诞老人_使用Python给头像加上圣诞帽或圣诞老人小图标附源码
随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhi ...
- 用Python写一个双人对战足球小游戏,堪比国足的技术【附带源码】
开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 这是一个 ...
- c#小游戏_.NET手撸2048小游戏
前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...
- Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏
开发工具 Python版本: 3.7.4 相关模块: pygame模块: 以及一些python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 首先, ...
- python实训报告pygame_[源码和文档分享]基于Python的PyGame库实现的2048小游戏
一.简介 2048的游戏规则很简单,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相 ...
- 基于Python的PyGame库实现的2048小游戏
一.简介 2048的游戏规则很简单,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相 ...
最新文章
- 回调函数在replace方法中的应用
- 农历法定日历_木瓜日历安卓版下载-木瓜日历V1.5下载
- 黄聪:WordPress判断当前用户是否为管理员登录
- C#跨线程操作控件的线程安全方法
- CSS的一些零碎总结
- 【USACO Feb 2014】Cow Decathlon
- Spring Tool Suite 4安装Lombok
- RCNN,fast R-CNN,faster R-CNN
- 调试信息清除小工具的编写
- Ubuntu 16.04服务器 软件的安装及配置
- 树莓派 摄像头 html5,视频演示如何给树莓派安装摄像头模块
- Photoshop安装:详细安装步骤
- 情话套路大全,哈哈哈~~~
- 抢滩抖音、B站,快手港股IPO进程加速
- Python文件和数据格式化(教程)
- AliAGC 自动增益控制算法:解决复杂场景下的音量问题
- Failed to resolve directive: XXX
- Linux常见的软件包管理任务
- python 储存汉字_汉字存储字节
- MapReduce通俗理解
热门文章
- 电脑鼠标单击变成了双击如何恢复
- Algorithm Review 5 图论
- matlab 峰值提取,Matlab2019b信号峰值检测与提取
- 红帽子 linux 声卡驱动,RedHat Linux系统下安装ALSA驱动的方法
- C语言股票交易软件,甩手掌柜股票自动交易程序(2021年5月版)
- FreeMarker模板导出word报表
- WoShop分销积分拼团裂变APP小程序商城全开源无加密商城源码
- 小米手机 浏览器 添加收藏页面到主页
- 基于PHP+MySQL共享自行车租赁管理系统的设计与实现
- Unity3D自动寻路之Nav Mesh Agent(导航网格代理)