pygame(十五)拼图游戏
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(十五)拼图游戏相关推荐
- html js制作高级拼图,基于JavaScript实现十五拼图代码实例
顾名思义,十五拼图就是将游戏画面中的数字从上到下,从左到右按顺序从1到15排列下来,看起来很简单,但是玩起来不容易. css代码 body { font-family: cursive; font-s ...
- 《游戏系统设计十五》游戏房间服的设计
- Python拼图游戏源代码,可定制拼图图片,支持多种难度,可九宫格、十六宫格、二十五宫格
配置环境 安装pygame模块 pip install pygame 引入资源 将照片,添加到resources/pictures路径下 照片.jpg格式 主函数代码 pintu.py 一个配置文件c ...
- C# C#应用 十五字小游戏
1.用C#编辑出来一个小游戏,和小时玩的拼图游戏有些类似,还是蛮有趣得到,来和大家分享一下. 2.该十五字游戏下面有三个按钮,作用分别为:乱序:打乱上面十五个数字的顺序:提交:当你把游戏恢复到原位后, ...
- 怎样追女孩子?当然是用python把她的照片做成拼图游戏,给她看啦..
前言: 跟着小编,用pygame给你心中那个女孩子,做一款专属于她的拼图游戏给她,万一有什么意外收获呢? 正文: 先上效果 我用隔壁诗诗小姐姐的照片,给她做了一个拼图游戏. 结果,我自己的拼不出来了 ...
- python实现拼图游戏
源码说明 一款使用pygame制作的拼图游戏,有多种方式选择 5×5,4×4,3×3 python实现拼图 源码下载: 长按左侧二维码 2 秒 回复「拼图」即可获取源码 (非本号) 一.运行效果 二. ...
- Python基础篇(十五)-- Pygame游戏编程
1 初识Pygame Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像.声音.视频.事件.碰撞等的支持.Pygame建立在SDL的基础上,SDL是一套跨 ...
- 计算机 游戏第15关,锈湖根源第十五关攻略 Rusty Lake:Roots第15关图文攻略
故事越来越精彩了,不妨赶紧到锈湖根源第十五关攻略中来理解吧.如果你对Rusty Lake:Roots第15关怎么过有疑问的话,就不要错过这里的图文攻略哦. 1.先点击场景的左下角,将下图中的道具带走, ...
- pygame做的著名游戏_pygame教程(十):汉诺塔游戏
前言 这一章我们继续来学习游戏的设计,带孩子去科技馆,看到有一种叫做"汉诺塔"的小游戏,这个智力游戏应该很多同学听说过,它首先在三根柱子中的第一根上摆放大小不一的圆盘,然后要求玩家 ...
最新文章
- 一文看尽2020全年AI技术突破
- BaseAdapter的一个简单案例
- C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“位域”
- Java异常之try,catch,finally,throw,throws
- 禁止ensp弹出提示
- java web快速入门_Web安全快速入门
- SAP WM Stock Removal Strategy - StringentFIFO 在仓库号级别下的先进先出
- ISO 3166-1标准国家代码表
- vue防止用户恶意点击按钮
- 【重要】有三AI知识星球不再对外公开!还想加入的有哪些途径?
- pyecharts 地图绘制
- 【对话通信原理】第3章 信息的坐骑——信号
- idea中pom.xml中插件无法加载
- Admixture使用说明文档cookbook
- day02 智能合约
- windows USB读卡器驱动详解
- 最新版Git 2.32.0下载安装教程
- 蒲福风力等级c语言编程,风力等级标准(蒲福风级表)
- 电子科技大约计算机博士读几年,成都电子科技大学的博士的毕业条件 你能做到么...
- android 悬浮按钮 功能实现,android悬浮按钮实现方法
热门文章
- uni-app checkbox全选的实现
- 除了编程,你还需要练胸练背练肌肉!
- 国产免费高配版“谷歌地球”,地图分析用这款软件秒杀谷歌地球
- [图解] 孔明锁的正确安装方法
- Introduction to wireless digital communication——chapter1
- 全网天花板,软件测试项目实战,银行项目支付业务测试看这一篇就够了
- mysql 完全限定表名列名_mysql必知必会 - 使用完全限定名
- Synergy实现一套鼠标和键盘控制两台电脑
- mac 命令用户切换
- ER图连接线上加个圆圈什么意思_你们要的PS抠图插件来了 抠图神器:Topaz教程 Winamp;Mac双版本下载...