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. 一文看尽2020全年AI技术突破
  2. BaseAdapter的一个简单案例
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“位域”
  4. Java异常之try,catch,finally,throw,throws
  5. 禁止ensp弹出提示
  6. java web快速入门_Web安全快速入门
  7. SAP WM Stock Removal Strategy - StringentFIFO 在仓库号级别下的先进先出
  8. ISO 3166-1标准国家代码表
  9. vue防止用户恶意点击按钮
  10. 【重要】有三AI知识星球不再对外公开!还想加入的有哪些途径?
  11. pyecharts 地图绘制
  12. 【对话通信原理】第3章 信息的坐骑——信号
  13. idea中pom.xml中插件无法加载
  14. Admixture使用说明文档cookbook
  15. day02 智能合约
  16. windows USB读卡器驱动详解
  17. 最新版Git 2.32.0下载安装教程
  18. 蒲福风力等级c语言编程,风力等级标准(蒲福风级表)
  19. 电子科技大约计算机博士读几年,成都电子科技大学的博士的毕业条件 你能做到么...
  20. android 悬浮按钮 功能实现,android悬浮按钮实现方法

热门文章

  1. uni-app checkbox全选的实现
  2. 除了编程,你还需要练胸练背练肌肉!
  3. 国产免费高配版“谷歌地球”,地图分析用这款软件秒杀谷歌地球
  4. [图解] 孔明锁的正确安装方法
  5. Introduction to wireless digital communication——chapter1
  6. 全网天花板,软件测试项目实战,银行项目支付业务测试看这一篇就够了
  7. mysql 完全限定表名列名_mysql必知必会 - 使用完全限定名
  8. Synergy实现一套鼠标和键盘控制两台电脑
  9. mac 命令用户切换
  10. ER图连接线上加个圆圈什么意思_你们要的PS抠图插件来了 抠图神器:Topaz教程 Winamp;Mac双版本下载...