pygame(十五)拼图游戏

前情提要

本节提要

内容详情

截取目标矩形图片

上节课,我们学到一个裁剪图片的方法: chop()
这个方法是将原截掉一个十字形的位置,将剩下的四个矩形合并成一个新的矩形图片.这样非常不利于我们截取图片.
因此,我们将这个方法进行改进,变成截取矩形位置的图片的方法rect_chop()

代码

def rect_chop(img:pygame.Surface, rect:pygame.Rect):'''截取指定位置的图形'''result_surface = pygame.transform.chop(img, (0, 0, rect.left, rect.top))rect = pygame.Rect(0, 0, rect.width, rect.height)result_surface = pygame.transform.chop(result_surface, (rect.width, rect.height, result_surface.get_width(), result_surface.get_height()))return result_surface

代码解析

根据我们chop()方法的逻辑,任何的图片,都是裁掉一个十字形的内容
因此,根据这个逻辑,我们先裁掉上边与左边

result_surface = pygame.transform.chop(img, (0, 0, rect.left, rect.top))

再将裁取的图片,再裁掉右边与下边

result_surface = pygame.transform.chop(result_surface, (rect.width, rect.height, result_surface.get_width(), result_surface.get_height()))

生成子图片

将一个游戏图片,截成九个子图片

代码

def creat_imgs(image):
imgs = []
pos_rects = []
for i in range(3):
for j in range(3):
temp_rect = pygame.Rect(160 * j + 10 * j, 160 * i + 10 * i, 160, 160) # 位置矩形
imgs.append(rect_chop(image, temp_rect)) # 零乱图
temp_rect.move_ip(0, 120)
pos_rects.append(temp_rect)
return pos_rects, imgs

代码解析

根据原始图片的大小:500 * 500 切割成160 大小的正方形. 多出20 刚好做为图片与图片之间的间矩
先生成切割位置矩形

 temp_rect = pygame.Rect(160 * j + 10 * j, 160 * i + 10 * i, 160, 160)  # 位置矩形

根据行列关系确定左上角坐标

然后用我们自己定义的切割函数来切割,并将结果加入到列表

 imgs.append(rect_chop(image, temp_rect))  # 零乱图

打乱顺序

代码


# 检测生成的随机序列是否有解
def check_can_do():nums = [x for x in range(1, 9)]while 1:count = 0shuffle(nums)for i in range(8):for j in range(i+1, 8):if nums[j] < nums[i]:count += 1if count % 2 == 0:return nums

代码解析

生成的随机序列是不一定有解的.因此要检测是否有解.
这里有展开讨论是否有解的问题.给出生成随机序列及检测是否有解的判断程序

点击响应

代码

 mouse_key = pygame.mouse.get_pressed()if mouse_key[0]:mouse_pos = pygame.mouse.get_pos()for i in range(9):# 检测鼠标有没有落在矩形内if pos_list[i].collidepoint(mouse_pos):# 检测该位置有没有图片if not pos_list[i][1]:move(pos_list, i)  # 调用移动方法

代码解析

先检测是否点击鼠标左键

mouse_key = pygame.mouse.get_pressed()if mouse_key[0]:

再检测点击位置是否是有效的图片位置

for i in range(9):# 检测鼠标有没有落在矩形内if pos_list[i].collidepoint(mouse_pos):

最后调用移动方法

移动方法

代码:

def move(i):l_list = [x for x in range(9) if x % 3 != 0] # 可以左移的位置if i in l_list:if pos_list[i - 1][1] == 0: # 可以左移print(pos_list[i - 1][1], pos_list[i][1])pos_list[i - 1][1] = pos_list[i][1]pos_list[i][1] =  0returnr_list = [x for x in range(9) if x % 3 != 2] # 可能右移0 1 3 4 6 7if i in r_list:if pos_list[i + 1][1] == 0: # 可以右移pos_list[i + 1] [1] = pos_list[i][1]pos_list[i][1] =  0returnu_list = [x for x in range(9) if x > 2]  # 可以上移 3,4,5,6,7,8if i in u_list:if pos_list[i - 3][1] == 0: # 可以上移pos_list[i - 3][1] =  pos_list[i][1]pos_list[i][1] = 0returnd_list = [x for x in range(9) if x < 6]  # 可以下移 0,1,2,3,4,5if i in d_list:if pos_list[i + 3][1] == 0: # 可以下移pos_list[i + 3] [1] = pos_list[i][1]pos_list[i][1] = 0return

分四个方向来检测
看点的位置否可移.
如:2号位,只能进行左下两个方向的移动
能左移的位置有:1,2,4,5, 7,8
能下移的位置有0,1,2,3,4,5
能右移的位置有0,1,3,4,6,7
能上移的位置有:3,4,5,6,7,8
显然2号位只能左移和下移
然后相应的方向只需要要检测相应的位置上是否是空的,如果是空的就移动去,且将原来的位置设置为0

判断胜利

代码

def check_game():for i in range(9):if pos_list[i][1] != i:return Falsereturn True

代码解析

只要pos_list的序列按0-8排列,说明拼图成功

画图程序

代码
def draw():screen.fill((0, 0, 0))screen.blit(result_img, (200, 10))for i in range(9):nums = pos_list[i][1]if nums:screen.blit(img_list[nums], (pos_list[i][0].left, pos_list[i][0].top))pygame.display.update()

代码分析::

这里就简了.只需要画两个图:一个是参考图,一个是正在游戏中的八个子图即可

后记

拼图游戏是一个小游戏.曾经最早出现的时候,还不是电子游戏,而是用一个板子,里面装了8个小方块来实现的游戏.
现在市面上已经很少见了.
但是小游戏却充满大智慧,想要将这个游戏玩好,还是非常考验一个人的随机应变能力,观察能力及总结能力的.
因此,可以考虑加入竞速模式,也可以考虑加入计步模式.
请各位自行发挥吧

pygame(十五)拼图游戏相关推荐

  1. html js制作高级拼图,基于JavaScript实现十五拼图代码实例

    顾名思义,十五拼图就是将游戏画面中的数字从上到下,从左到右按顺序从1到15排列下来,看起来很简单,但是玩起来不容易. css代码 body { font-family: cursive; font-s ...

  2. 《游戏系统设计十五》游戏房间服的设计

  3. Python拼图游戏源代码,可定制拼图图片,支持多种难度,可九宫格、十六宫格、二十五宫格

    配置环境 安装pygame模块 pip install pygame 引入资源 将照片,添加到resources/pictures路径下 照片.jpg格式 主函数代码 pintu.py 一个配置文件c ...

  4. C# C#应用 十五字小游戏

    1.用C#编辑出来一个小游戏,和小时玩的拼图游戏有些类似,还是蛮有趣得到,来和大家分享一下. 2.该十五字游戏下面有三个按钮,作用分别为:乱序:打乱上面十五个数字的顺序:提交:当你把游戏恢复到原位后, ...

  5. 怎样追女孩子?当然是用python把她的照片做成拼图游戏,给她看啦..

    前言: 跟着小编,用pygame给你心中那个女孩子,做一款专属于她的拼图游戏给她,万一有什么意外收获呢? 正文: 先上效果 我用隔壁诗诗小姐姐的照片,给她做了一个拼图游戏. 结果,我自己的拼不出来了 ...

  6. python实现拼图游戏

    源码说明 一款使用pygame制作的拼图游戏,有多种方式选择 5×5,4×4,3×3 python实现拼图 源码下载: 长按左侧二维码 2 秒 回复「拼图」即可获取源码 (非本号) 一.运行效果 二. ...

  7. Python基础篇(十五)-- Pygame游戏编程

    1 初识Pygame Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像.声音.视频.事件.碰撞等的支持.Pygame建立在SDL的基础上,SDL是一套跨 ...

  8. 计算机 游戏第15关,锈湖根源第十五关攻略 Rusty Lake:Roots第15关图文攻略

    故事越来越精彩了,不妨赶紧到锈湖根源第十五关攻略中来理解吧.如果你对Rusty Lake:Roots第15关怎么过有疑问的话,就不要错过这里的图文攻略哦. 1.先点击场景的左下角,将下图中的道具带走, ...

  9. pygame做的著名游戏_pygame教程(十):汉诺塔游戏

    前言 这一章我们继续来学习游戏的设计,带孩子去科技馆,看到有一种叫做"汉诺塔"的小游戏,这个智力游戏应该很多同学听说过,它首先在三根柱子中的第一根上摆放大小不一的圆盘,然后要求玩家 ...

最新文章

  1. mysql get lock_MYSQL-GET_LOCK锁
  2. 增大胸围!Mr Burning带你在家全方位虐胸!
  3. Win10使用以前的图片查看器
  4. 北大开源ECCV2018深度去雨算法:RESCAN
  5. 访问php页面显示源码解决方法
  6. 一张图回顾Hadoop十年:Hadoop老矣,尚能饭否?
  7. 新浪企业邮箱服务器怎么设置,新浪企业邮箱|手机端设置
  8. 利用Arcgis制作图像分割数据集
  9. 滑雪问题(dfs+dp)
  10. 蔡明亮 “水”三部曲
  11. java word模版填充_Java 数据填充到word模板中
  12. HTML5文件夹隐藏了怎么打开,如何打开隐藏文件夹,详细教您打开隐藏文件夹的方法...
  13. 浅谈我对元宇宙、Web3、区块链与NFT的理解
  14. 你是否愿意为他人撑起一把伞?
  15. 如何在公众号添加查询链接
  16. 国网GIM设备三维模型要求细则 - 交流断路器
  17. 使用预计算实时全局光照优化照明-微调光照贴图参数
  18. 线性回归方程参数的最小二乘估计
  19. CorelDraw安装时,安装界面显示不全的解决方法,
  20. C语言——字符串旋转问题

热门文章

  1. 解题-->在线OJ(十二)
  2. Hyperion Services启动顺序
  3. 短视频课程内容培训(短视频培训课程大纲)
  4. 源支付最新版V6.52版本源码正版授权
  5. 圣诞节文案,C语言画一个 blingbling 的圣诞树
  6. GitHub does not provide shell access.
  7. 这是一条更有味道的推文......
  8. Android Telephony9.0 Connection 区分关系
  9. 电脑关机状态重置BIOS
  10. oracle表空间追加数据文件,oracle数据库表空间追加数据库文件方法