self.randomGenerateNumberself.randomGenerateNumber

然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分:

移动所有的数字块并进行必要的合并和记分;

随机地在一个还没有数字的位置上生成一个数字。

具体而言,代码实现如下:

'''更新游戏状态'''defupdate( self):game_matrix_before = copy.deepcopy( self.game_matrix)self.moveifgame_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 = 0iflen( array) < 2: returnarray, scorefori inrange( len( array) -1):ifarray[i] == 'null':breakifarray[i] == array[i+ 1]:array[i] *= 2array.pop(i+ 1)array.append( 'null')score += array[i]returnextract( array), score# 不需要移动的话直接returnifself.move_direction isNone: return# 向上ifself.move_direction == 'up':forj inrange(self.matrix_size[ 1]):col= []fori inrange(self.matrix_size[ 0]):col.append(self.game_matrix[i][j])col= extract( col)col.reversecol, score = merge( col)self.score += scorecol.reversecol= col+ [ 'null',] * (self.matrix_size[ 0] - len( col))fori inrange(self.matrix_size[ 0]):self.game_matrix[i][j] = col[i]# 向下elif self.move_direction == 'down':forj inrange(self.matrix_size[ 1]):col= []fori inrange(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)) + colfori inrange(self.matrix_size[ 0]):self.game_matrix[i][j] = col[i]# 向左elif self.move_direction == 'left':foridx, rowinenumerate(copy.deepcopy(self.game_matrix)):row= extract( row)row.reverserow, score = merge( row)self.score += scorerow.reverserow= row+ [ 'null',] * (self.matrix_size[ 1] - len( row))self.game_matrix[idx] = row# 向右elif self.move_direction == 'right':foridx, rowinenumerate(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啦:

'''游戏是否结束'''@propertydef isgameover( self):fori in range( self.matrix_size[ 0]):forj in range( self.matrix_size[ 1]):ifself.game_matrix[i][j] == 'null': returnFalseif(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]):returnFalseelif (j == self.matrix_size[ 1] - 1):if( self.game_matrix[i][j] == self.game_matrix[i+ 1][j]):returnFalseelse:if( self.game_matrix[i][j] == self.game_matrix[i+ 1][j]) or( self.game_matrix[i][j] == self.game_matrix[i][j+ 1]):returnFalsereturnTrue

其实很简单,如果二维列表被数字填满,且数字不能再进行合并的话,这局游戏就结束了,否则,游戏就没有结束。

定义完2048游戏类,我们的游戏基本上算是写完了。只需要在游戏主循环里根据用户操作来更新当前的游戏状态并将游戏里所有必要的元素显示在屏幕上就ok啦:

# 游戏主循环clock = pygame.time.Clockis_running = Truewhileis_running:screen.fill(pygame.Color(cfg.BG_COLOR))# --按键检测foreventinpygame. event. get:ifevent.type == pygame.QUIT:pygame.quitsys.exitelif event.type == pygame.KEYDOWN:ifevent.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.updateifgame_2048.isgameover:game_2048.saveMaxScoreis_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.updateclock.tick(cfg.FPS)returnendInterface(screen, cfg)

最后的效果大概是这样的:

大功告成,完整源代码详见相关文件~

公众号内回复‘game23’获取。(需要下载文件夹中的所有文件)

作者:Charles未晞

来源:Charles的皮卡丘

爆款游戏《贪吃蛇大作战》的Python实现 返回搜狐,查看更多

基于python的2048游戏设计_用python写一个2048游戏相关推荐

  1. python游戏设计_【Python】设计一款养成类游戏

    上一节: 想起自己初中时,上学时拿着诺基亚手机,敲着9宫格键盘,一个月50M的流量,只能玩玩文字游戏,却玩得不亦乐乎.为了唤起你的记忆,一起走进今天的代码吧! 编程有这样一个说法之分,面向过程和面向对 ...

  2. python上位机界面设计_用Python写界面--上位机开发

    Python真的可以说是无所不能,上到人工智能.图像识别.下到控制电机.爬虫.数据处理,前不久发现Python还可以做界面,虽然比较丑,但是还是可以一试. Python内置图形界面库--Tkinter ...

  3. 一个简易的游戏代码_500 行代码写一个俄罗斯方块游戏

    01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这个游戏就风靡了各个游戏平台. 俄罗斯方块归 ...

  4. python游戏设计_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  5. 初中python编程初步教学设计_初中Python程序设计顺序结构教学设计方案.docx

    教学设计方案一<顺序结构程序设计> 一.教学目标 (1)知识与技能 能够根据问题分析,设计顺序结构程序的算法 能够运用顺序结构,使用 Python程序编写.调试并运行代码 (2)过程与方法 ...

  6. python顺序结构教学设计_初中Python程序设计-顺序结构-教学设计方案

    教学设计方案-<顺序结构程序设计> 一.教学目标 ( 1 )知识与技能 ①能够根据问题分析,设计顺序结构程序的算法 ②能够运用顺序结构,使用 Python 程序编写.调试并运行代码 ( 2 ...

  7. 7和7的倍数游戏答案_一道数学题和一个数学游戏,二年级会孩子选哪个?

    ​ 今天在网上看到有人讨论这道二年级的数学题,有人说这道题严重超纲,有人说这道题涉及模9同余--从我接触过的家长辅导孩子做数学的情况来看,肯定会有许多家长把这道题讲复杂,或是不知道这道题究竟想干嘛. ...

  8. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  9. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

最新文章

  1. 《Redis设计与实现》简读
  2. 【luogu P4005 清华集训2017】小Y和地铁
  3. 显卡mx150和230哪个好_MX250显卡等于GTX1050?笔记本显卡MX250和MX150的区别对比
  4. 指数随机变量 泊松过程跳_《常见随机过程》(一)
  5. 升级到win10,安装visualstudio ,80端口被系统服务占用的解决
  6. POJ2112 Optimal Milking
  7. HDU - 5030 Rabbit's String(后缀数组+二分)
  8. 面向对象之三大特性:继承,封装,多态
  9. MySQL可以用localhost 连接,但不能用IP连接的问题
  10. Idea运行报错Error running ‘Application‘: Command line is too long的解决方法
  11. mysql动态sql语句_mysql 存储过程中使用动态sql语句
  12. Java 编程题自动评分技术的研究与实现(一)
  13. Berkeley CS 61B 学习笔记 - 1
  14. 微信视频强制分享观看源码 微信流量裂变源码吸粉变现源码
  15. Windows 7 利用电脑自带工具定时开关和重启方法
  16. 计算机教学能力提升体会,学习《信息技术助力教学能力提高》感悟
  17. 永磁同步发电机仿真,带四个牵引电机仿真。内燃机车仿真模型
  18. multiple definition of...
  19. AForge学习笔记(5):AForge.Imaging(上)
  20. Centos7 配置静态 IP 地址

热门文章

  1. 从零学习游戏服务器开发(一) 从一款多人联机实时对战游戏开始
  2. dm服务器未能启动,救命啊!IDES无法启动了!!!!
  3. C++课程设计(校车订票系统)
  4. iMac2021 在重新安装mac os系统后,电脑账户创建失败
  5. MATLAB如何解决弹出路径不存在的问题
  6. web3j错误解决:okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody
  7. 华为路由器怎么看是不是公网_华为路由器怎么判断有没有被蹭网
  8. 7. 【可编程定时器8253】:外部引脚、内部结构特点、计数启动方式、6种工作方式、控制字格式、应用
  9. python网格交易法详解_详解低风险投资策略—详解网格交易法
  10. 使用笔记:AWTK中文键盘按键字体加大