继续来研究怎么实现消除后的下移,大体思想都已经说了,开始编写函数。

先找到第一轮需要下移的元素。

def find_fall_stars(board):all_stars = []single_star = {}find_fall_star = Falsefor column in range(columns):# 从底部往上找,每一个减少的row值都相当于往上走一行for row in range(rows-2, -1, -1):# 此位置星星可以下降,记录,使用字典记录类型,处于二维列表中的位置,然后放入all_stars中if board[row][column] != 'empty' and board[row+1][column] == 'empty':print(row, column)single_star['type'] = board[row][column]single_star['x'] = rowsingle_star['y'] = columnall_stars.append(single_star)single_star = {}find_fall_star = True# 返回当前找到的星星,同时返回标志位,为下次寻找作准备return find_fall_star, all_stars

先做一个单独往下移动一个固定位置的函数。

def one_column_falling_stars(board, star, speed):move_x = 0speed *= 0.01move_y = int(speed * tile_size)basex = star['x']basey = star['y']left_location = x_margin / 2 + (basey * tile_size) + 3top_location = y_margin / 2 + (basex * tile_size) + 3r = pygame.Rect((left_location + move_x, top_location + move_y, tile_size, tile_size))path = 'gems/' + board[basex][basey] + '.png'star = pygame.image.load(path)star = pygame.transform.scale(star, (tile_size - 5, tile_size - 5))display.blit(star, r)

给出要移动的星星坐标,因为必定是往下移动,所以最终偏差出现在y坐标上,同时speed即每次画出的图形下移的偏差,speed越大,看着移动越快。需要多次调用该函数,才能实现移动过程。

然后编写一个给定所有星星后下移一格的函数。

def animate_falling_stars(board, stars):speed = 0while speed < 110:display.fill(bg_color)draw_chest()draw_stars(board)for star in stars: # Draw each gem.one_column_falling_stars(board, star, speed)pygame.display.update()fps_clock.tick(fps)speed += 30

运行游戏,确实有移动了,但是因为这个只是动画过程,那么实际二维列表内容并没有发生变化,所以游戏界面出现的不是移动,而像是复制后移动,并且如果此刻重新画图,所有界面都恢复原样了。

现在考虑在绘制动画前先将二维列表里需要移动位置的星星删除,等动画完成后,把星星放到指定位置,完成数据交换,然后再查找下一轮可以移动的星星。

修改查找星星的函数,增加数据删除部分内容。这个数据处理过程隐隐觉得不是太妥…

def find_fall_stars(board):all_stars = []single_star = {}find_fall_star = Falsefor column in range(columns):# 从底部往上找,每一个减少的row值都相当于往上走一行for row in range(rows-2, -1, -1):# 此位置星星可以下降,记录,使用字典记录类型,处于二维列表中的位置,然后放入all_stars中if board[row][column] != 'empty' and board[row+1][column] == 'empty':print(row, column)single_star['type'] = board[row][column]single_star['x'] = rowsingle_star['y'] = column# 先从二维列表中清除原来的类型,主要是绘制动画需要board[row][column] = 'empty'all_stars.append(single_star)single_star = {}find_fall_star = True# 返回当前找到的星星,同时返回标志位,为下次寻找作准备return find_fall_star, all_stars

当动画完成后,需要将动画结束位置的星星类型放入实际的数据中。

def animate_falling_stars(board, stars):speed = 0while speed < 120:display.fill(bg_color)draw_chest()draw_stars(board)for star in stars: # Draw each gem.one_column_falling_stars(board, star, speed)pygame.display.update()fps_clock.tick(fps)speed += 30for star in stars:# 下移完成后交换数据board[star['x']+1][star['y']] = star['type']

因为当前只下移了一行,所以循环调用,直到没有可以移动的为止。

                    if remove_or_not:remove_stars(main_board, need_to_removed)while True:print(main_board)falling_or_not, falling_stars = find_fall_stars(main_board)if falling_or_not:animate_falling_stars(main_board, falling_stars)else:break

运行程序看看效果。

可以看到,效果还可以,因为没有编写补充星星的函数,所以会有空的。

秉承着消除几个星星增加几个星星的原则,我们开始增加新的星星。增加的过程也需要动画效果。

关于下落星星的思路是,根据empty位置蛇形寻找当前需要第一次需要下落的星星数,并随机产生星星,星星下标[x][-1]的位置,也就是游戏界面之上下落。完成当前下落后,再次寻找游戏界面的empty位置,重复之前的操作。

def show_new_fall_stars(board):limit_x = -1signal_star = {}new_stars = []# 从最后一行开始寻找for row in range(rows-1, -1, -1):# 每一行从左往右找for column in range(columns):# 找到当前最下面一行,最左边的空白点if board[row][column] == 'empty' and row > limit_x:signal_star['type'] = random.choice(stars)signal_star['x'] = -1signal_star['y'] = columnnew_stars.append(signal_star)signal_star = {}return new_stars

然后再循环里检查是否需要补空。

        if len(new_falling_stars):animate_falling_stars(main_board, new_falling_stars)while True:falling_or_not, falling_stars = find_fall_stars(main_board)if falling_or_not:animate_falling_stars(main_board, falling_stars)else:break

当完成第一次补空后,那么情况类似于之前消除的情况,所以使用与消除一样的方法,再次下落。完成一次这样的操作后,循环还会继续补空,直到所有的空位填补完成。

运行游戏,效果如下:

抛开已知未知bug不谈,目前我感觉已经进入尾声。接下来需要做的就是设定一种机制,让游戏结束。那么比较简单的就是采用定时机制,比如游戏有60秒时间游玩,看游玩过程中最多能拿多少分。可以考虑如果一次消除6个以上的星星,增加一点时间。还有就是,如果发生完全没法消除的情况,又该如何?

考虑有可能出现完全无法消除的情况,那么可以再游戏里增加检查机制,可以在游戏过程中,不断检查游戏状态,利用之前的消除算法,不停查找是否还有可以消除的星星,如果没有了,则重新生成棋盘。这个很简单,就不做了,我稍微偷个懒,修改一下游戏机制,即只要有2个以上相同的星星,就可以消除,那么游戏就可能出现无法消除的情况。把只消除2个星星的情况设定为无法得分或者扣分即可。

到此,剩下的部分就完全没有任何算法内容和难度了。就不放出来具体过程了,直接看图。

关于用pygame来编写类满天星游戏的全记录二相关推荐

  1. 关于用pygame来编写类满天星游戏的全记录

    编写类满天星游戏,目前自己设定需要用到的算法内容,包括第一点点击某一个图标后,自动检查图标上下左右是有与之相同的图形,如果包括自身在内有三个以上的图形,则可以消除.第二,当界面中有图形消除后,那么需要 ...

  2. Pygame:编写一个小游戏

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

  3. 使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

    目录 一.安装Pyinstaller 1.直接安装 2.Anaconda环境下安装 二.使用Pyinstaller打包生成exe文件 三.运行生成的exe文件 四.exe文件运行中的问题 一.安装Py ...

  4. c#控件弹幕效果_基于C#弹幕类射击游戏的实现——(二)渲染

    这个游戏打算是用C#+GDI做~所以渲染效率上还是要进行一些考虑的 public interface IRenderHandler { void Clear(Color backgroundColor ...

  5. class unity 定义类_Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性...

    在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITORusing UnityEditor; #endif using UnityEngine; ...

  6. 农场游戏的开发记录二

    决定做成控制台输入的游戏模式 因为不懂动画那些,先做一个古老的控制台输入命令的游戏吧. 今天在主类增加了一个控制台输入的功能,和一个仓库类.一个农场类.另外改成类名首字母小写的错误.很晚了才开始改,所 ...

  7. pygame只能编写游戏_游戏框架搭建

    游戏框架搭建 目标 -- 使用 面相对象 设计 飞机大战游戏类 目标 明确主程序职责 实现主程序类 准备游戏精灵组 01. 明确主程序职责 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分 ...

  8. Pygame制作答题类游戏的实现

    代码地址如下: http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程 ...

  9. pygame制作rpg类游戏或者模拟经营类游戏的思路

    Pygame 能够支持开发 RPG 类或者模拟经营类游戏.Pygame 提供了图形界面.事件处理.音频处理等基础功能,开发者可以利用这些功能实现自己的游戏逻辑. 例如,开发者可以利用 Pygame 实 ...

最新文章

  1. 2022-2028年中国车载充电机行业深度调研及投资前景预测报告
  2. stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验
  3. html marquee
  4. Nginx + 阿里云SSL + tomcat 实现https访问代理
  5. matlab 返回变量类型的命令,MATLAB主要命令汇总
  6. 分布式Session框架
  7. 语音识别学习日志 2019-7-13 语音识别基础知识准备 1{语音基础知识}
  8. c++怎么输入带有空格的字符串_C 语言入门 11 fscanf() 函数对空格的处理
  9. pytorch,cuda8,torch.cuda.is_available return flase (ubuntu14)
  10. 面试题 35 : 复杂链表的复制
  11. 并发编程(进程与线程)
  12. 2. Anaconda下使用Pip或者conda安装库指南
  13. SQL注入漏洞与参数化查询
  14. C++提高进阶,你知道多少?
  15. POI 操作word
  16. [算法]Floyd-Warshall算法理解
  17. 笔记本电脑常识:噪音
  18. Windows下swig安装与配置
  19. 数据库和数据仓库联系和区别
  20. PVT的spatial reduction attention(SRA)

热门文章

  1. 健脾祛湿按摩哪里有效果
  2. appscan无法连接到服务器_安装天联标准版,局域网内金蝶客户端无法连接金蝶服务器解决办法...
  3. CGCTF 起名字真难
  4. html时钟自动刷新抖音,JS+CSS3实现时钟效果(抖音)
  5. angularjs2 mysql_AngularJS2初学小结
  6. 星座符号Unicode值
  7. 数计学院小苹果---2015年迎元旦晚会
  8. cad的php文件怎么用,cad格式刷怎么用
  9. 学计算机新学期新目标新计划,新学期新目标新计划作文范文10篇
  10. 台州科技职业学院计算机教研室主任,台州科技职业学院