上一部分已经实现了2048游戏的核心规则内容,但是在我们移动了数字后,游戏界面并没有增加新的数字,所以我们需要在每次移动后,增加新的数字。同时如果按下按键,在按键方向上并没有可以移动的数字,那么此时不需要增加新的数字到游戏界面。

在编写之前,先编写一个空位检查函数,如果没有空位,那么则不需要再增加数字了。

def has_enough_space(board):enough_space_flag = Falsefor i in range(len(board)):for j in range(len(board[i])):if board[i][j] is None:enough_space_flag = Truereturn enough_space_flag

然后定义生成新数字函数

def generate_new_number(board):if has_enough_space(board):counter = 1while counter > 0:random_x = random.randint(0, board_height-1)random_y = random.randint(0, board_width-1)if board[random_x][random_y] is None:board[random_x][random_y] = 2counter -= 1

修改slide_to部分内容

            if slide_to:move_the_number(main_board, slide_to)generate_new_number(main_board)

考虑到新产生的数字因该有在移动完成后有个间隔,可以考虑增加一个等待。

        elif event.type == KEYUP:if event.key in (K_LEFT, K_a):slide_to = leftelif event.key in (K_RIGHT, K_d):slide_to = rightelif event.key in (K_UP, K_w):slide_to = upelif event.key in (K_DOWN, K_s):slide_to = down# print(slide_to)if slide_to:move_the_number(main_board, slide_to)draw_board(main_board, '2048')pygame.display.update()pygame.time.wait(120)generate_new_number(main_board)

注意slide_to的位置

接下来只剩下检查游戏结束的函数了,游戏结束条件是,首先已经没有进一步放数字的空间同时任何一个数字,上下左右四个方向都没有与自己相等用来组合的数字了,则游戏结束。

def game_over_check(board):game_over_flag = Truefor i in range(len(board)):for j in range(len(board[i])):if board[i][j] is None:game_over_flag = Falsefor direction in directions:next_i = i + direction[0]next_j = j + direction[1]if 0 <= next_i < board_width and 0 <= next_j < board_height:if board[i][j] == board[next_i][next_j]:game_over_flag = Falsereturn game_over_flag```将判断游戏结束代码放到循环内部
```

#判断游戏是否结束

    if game_over_check(main_board):main_board = generate_new_puzzle()

def game_over_animation(color=white, animation_speed=50):orig_surf = display.copy()flash_surf = pygame.Surface(display.get_size())flash_surf = flash_surf.convert_alpha()r, g, b = colorfor i in range(3):for start, end, step in ((0, 255, 1), (255, 0, -1)):for alpha in range(start, end, animation_speed * step):# 先铺一层新的界面,包含老界面所有内容display.blit(orig_surf, (0, 0))# flash界面填充颜色,开始很淡,越来越浓,然后越来越淡flash_surf.fill((r, g, b, alpha))# 把flash界面加载到display中,位置由当前颜色块决定display.blit(orig_surf, (0, 0))display.blit(flash_surf, (0, 0))# draw_game_board(maze)# 刷新看效果pygame.display.update()fps_clock.tick(fps)

增加结束界面

    if game_over_check(main_board):game_over_animation()main_board = generate_new_puzzle()

while循环所有内容

while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()elif event.type == MOUSEBUTTONUP:if reset_rect.collidepoint(event.pos):game_over_animation()main_board = generate_new_puzzle()elif event.type == KEYUP:if event.key in (K_LEFT, K_a):slide_to = leftelif event.key in (K_RIGHT, K_d):slide_to = rightelif event.key in (K_UP, K_w):slide_to = upelif event.key in (K_DOWN, K_s):slide_to = down# print(slide_to)if slide_to:move_the_number(main_board, slide_to)draw_board(main_board, '2048')pygame.display.update()pygame.time.wait(120)generate_new_number(main_board)# 判断游戏是否结束if game_over_check(main_board):game_over_animation()main_board = generate_new_puzzle()draw_board(main_board, '2048')pygame.display.update()fps_clock.tick(fps)

至此核心功能完结,我没有做得分系统,因为这个实现起来很简单,其次我真不知道这个分数因该怎么算才合适。所以就懒得做了。因为是随便做做,也没怎么测试,所以优化空间极大,哈哈。

最后说一下动画,因为动画过程比较麻烦,需要修改数字移动函数,然后增加新的动画函数,而效果呢不算特别明显,就不做了。说说我的思想,我做的时候是在移动函数中取出了所有的需要移动的元素的坐标,每一个元素用一个列表来存放,比如,数字2在二维列表的[3][2]处,需要往左移动到[3][0]位置,那么我存放的列表为[2, (3,2), (3,1), (3,0)],其他的元素也是一样,所有的这些数据都存放在一个二维列表中,当移动算法计算完成,我在来绘制移动动画,每次移动一格的动画,每一格移动的时候使用偏移量来模拟移动效果。还使用了另一块画布来实现这个过程,总之很麻烦。最终效果一般,我放上两种方式的对比视频。

这是没有动画版本的

这是有动画效果版本

主要是对于pygame的绘制部分理解得不透彻,所以这块儿效果一般。

终于…

python制作小游戏之二2048最终章相关推荐

  1. 用Python制作小游戏之‘植物大战僵尸’(一)

    1.引入需要的模块 import pygame import random 2.配置图片地址及页面宽高等 IMAGE_PATH = 'D:\桌面\练习\python\植物大战僵尸\imgs' scrr ...

  2. python小游戏之二

    20行python代码的入门级小游戏 20行python代码的入门级小游戏_linmo8256的博客-CSDN博客_py游戏代码 猜数字小游戏python实现(可用来撩妹撩汉) 猜数字小游戏pytho ...

  3. python编程小游戏代码-Python小游戏之300行代码实现俄罗斯方块

    前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很 ...

  4. python小游戏源码-Python小游戏之300行代码实现俄罗斯方块

    Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...

  5. python编写小游戏代码_Python小游戏之300行代码实现俄罗斯方块

    Python小游戏之300行代码实现俄罗斯方块 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python小游戏之300行代码实现俄罗斯方块.txt ] (友情提示:右键点上 ...

  6. python游戏制作软件_python制作小游戏(二)

    下载W3Cschool手机App,0基础随时随地学编程导语 T_T突然发现N久以前我还做过一个系列??? 利用Python制作小游戏??? 好吧,既然做了,就有头有尾吧~~~ 本期我们将制作一个类似八 ...

  7. Android五子棋小游戏之UI篇

    最近一直在学习Android自定义View方面的知识,正好看到一个讲解制作五子棋小游戏的案例,遂学习一番,记录下学习过程,帮助那些有需要的人. 首先放上效果图: 下面我将带领大家一步步完成这个五子棋小 ...

  8. python能制作游戏吗_如何用Python制作小游戏

    要想用Python制作小游戏,必须要安装一个插件Pygame 什么是Pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需 ...

  9. Python常用小技巧(二)——打开图片

    Python常用小技巧(二)--打开图片 前言:对于大量图片的文件夹,你很难手工去检查每张图片是否损坏,这时候就要用程序去检查每张图片是否能打开了 一.材料准备 - os - PIL 二.程序编写 i ...

最新文章

  1. gRPC异步处理应答
  2. JavaScript四(DOM编程)
  3. 汇编语言--常见转移指令
  4. linux 非登录shell自动,Linux登录shell和非登录(交互式shell)环境变量配置
  5. PHP(四)——性能优化
  6. 为什么要返回function_宇宙飞船返回时,为什么要冒着烧毁的风险加速穿过大气层?...
  7. 爬虫智能解析库 Readability 和 Newspaper 的用法
  8. 神经网络之感知器算法简单介绍和MATLAB简单实现
  9. android studio 自动生成sql语句,Android Studio Plugin 插件开发教程(三) —— 制作一个自动生成数据库代码的插件...
  10. 最强战队 | 三维视觉、SLAM方向全球顶尖实验室汇总
  11. 数模3—Matlab线性规划、非线性规划、多目标规划(超全解法合集)
  12. Awesome Crowd Counting
  13. SpringBoot----即时聊天(webSocket)
  14. select函数使用方法
  15. charles mac端代理设置方法(含https)
  16. 基于Java的电影售票网站
  17. lo流讲解 和使用(大纲)
  18. 公有iot私有iot架构_玩洋葱Omega IoT设备在OLED屏幕上显示实时血糖
  19. 工作经验是积累总结出来的
  20. 为什么你裹成粽子还冷得瑟瑟发抖,别人在雪山徒步却轻装上阵,全因这件黑科技上装!...

热门文章

  1. POI 边框样式BorderStyle
  2. Plato Farm在Elephant Swap上铸造的ePLATO是什么?为何具备高溢价?
  3. 自动化新闻写作机器人:会不会导致记者失业
  4. 新媒体层出不穷,企业如何做好网络营销?
  5. 大白话5分钟带你走进人工智能-第十三节多项式回归之维度爆炸和过拟合
  6. 从青铜到王者,进阶数据可视化2.0的五个Python库
  7. Nakagami-m分布、Gamma分布的无线信道及Python代码
  8. NC后台任务插件开发代码
  9. sql的if用法,时间处理以及start with用法
  10. python waitpid_linux中waitpid及wait的用法