使用pythondiam开发出一个简易的拼图游戏,3*3的九宫格拼图,记录所用步数表示成绩,
先看一下项目运行后的预览图,

再看一下运行的gif动图:录的gif图失真,将就一下

开发过程:

设置图像 --> 图像块的类–>拼接图片 --> 重置游戏 --> 设置各个元素 --> 定义鼠标的点击事件–>搭建框架 --> 注册鼠标事件–>初始化–>启动框架

首先就是设置图像
设置需要用于拼接的图片,以及页面的大小,画布大小,棋盘的行列,坐标,图像块列表
,在使用simplegui.load_image要先导入import simpleguitk as simplegui这个库,可直接使用pip install命令进行安装,

import random
import simpleguitk as simplegui
# 1.设置图像,载入图像
baymax = simplegui.load_image('http://img.netbian.com/file/2020/0130/c5d20fe416022a3d72be820e76bfba9b.jpg')# 设置画布尺寸
w = 600
h = w + 100# 定义图像块的边长
image_size = w / 3# 定义图像块坐标列表
all_coordinates = [[image_size * 0.5, image_size * 0.5], [image_size * 1.5, image_size * 0.5],[image_size * 2.5, image_size * 0.5], [image_size * 0.5, image_size * 1.5],[image_size * 1.5, image_size * 1.5], [image_size * 2.5, image_size * 1.5],[image_size * 0.5, image_size * 2.5], [image_size * 1.5, image_size * 2.5], None]# 棋盘的行列
row = 3
col = 3# 定义步数
steps = 0# 保存所有图像块的列表
board = [[None, None, None], [None, None, None], [None, None, None]]

定义图像块类
再者,使用面向对象的思想,我们需要定义一个图像块的类Square用于初始化界面,即使用其构造函数,在类当中定义一个绘制图像的方法。

# 定义一个图像块的类
class Square:# 定义一个构造函数,用于初始化def __init__(self, coordinate):self.center = coordinate# 绘制图像的方法def draw(self, canvas, board_pos):canvas.draw_image(baymax, self.center, [image_size, image_size],[(board_pos[1] + 0.5) * image_size, (board_pos[0] + 0.5) * image_size],[image_size, image_size])

拼接图片
使用一个自定义方法,init_board首先需要打乱图像顺序,再者对3*3表格进行遍历,使得图像块的坐标发生改变,从而实现图片的拼接,也就是移动图片

# 定义一个方法进行拼接
def init_board():random.shuffle(all_coordinates)  # 打乱图像# 填充并且拼接图版for i in range(row):for j in range(col):idx = i * row + jsquar_center = all_coordinates[idx]# 如果坐标值是空的,让该框为空if squar_center is None:board[i][j] = Noneelse:board[i][j] = Square(squar_center)

重置游戏
重置游戏,游戏从新开始,对steps步数清零,再重新打乱顺序,

def play_game():global stepssteps = 0init_board()

设置各个元素
将元素画出来,首先是步数的显示,其次是游戏界面的元素

def draw(canvas):  # 画步数canvas.draw_image(baymax, [w / 2, h / 2], [w, h], [50, w + 50], [98, 98])canvas.draw_text('步数:' + str(steps), [400, 680], 22, 'white')  # 64分钟# 绘制游戏界面各元素for i in range(row):for j in range(col):if board[i][j] is not None:board[i][j].draw(canvas, [i, j])

定义鼠标的点击事件
获取拼接板的row和col即在1-3的取值范围当中,对其进行上下左右四个方位的判断,从而使其进行移动等操作,

def mouseclick(pos):global steps# 将点击的位置换算成拼接板上的坐标r = int(pos[1] / image_size)c = int(pos[0] / image_size)if r < 3 and c < 3:if board[r][c] is None:  # 表示点击的是一个空白位置returnelse:# 检查上下左右是否有空位置,有则移动过去current_square = board[r][c]if r - 1 >= 0 and board[r - 1][c] is None:  # 判断上面board[r][c] = Noneboard[r - 1][c] = current_squaresteps += 1elif c + 1 <= 2 and board[r][c + 1] is None:  # 判断右边board[r][c] = Noneboard[r][c + 1] = current_squaresteps += 1elif r + 1 <= 2 and board[r + 1][c] is None:  # 判断下边board[r][c] = Noneboard[r + 1][c] = current_squaresteps += 1elif c - 1 >= 0 and board[r][c - 1] is None:  # 判断左边board[r][c] = Noneboard[r][c - 1] = current_squaresteps += 1

创建框架
创建框架,有标题栏,背景颜色,按钮等

frame = simplegui.create_frame("拼图游戏", w, h)
frame.set_canvas_background('Black')
frame.set_draw_handler(draw)
frame.add_button('重新开始', play_game, 60)

注册鼠标事件

frame.set_mouseclick_handler(mouseclick)

初始化和启动框架

play_game()
frame.start()

以上所有代码组合起来就是这一个项目的源码,注意的是,在类当中只定义了一个构造方法和draw方法,其他的方法不是类当中的方法。

关于图片

在这里使用的是外网图片,关于图片的链接怎么获取?我们可以直接通过图床进行图片上传,之后我们就可以得到这个图片的url地址了,也就是在代码第4行的那个链接。可以使用这个网站进行上传 https://imgchr.com/ 转换,点击上传,选择图片,

之后进行上传。上传成功之后就可以得到这个图片的url地址了。

还有一点就是,因为拼图游戏是一个正方形,也就是1:1。所以在上传图片之前可以把自己需要的图片剪成1:1的比例再进行上传,否则在加载的时候会默认使用左上角。

Python项目--拼图游戏(附源码)相关推荐

  1. 小白都会的Python项目实战(附源码)3分钟画一棵圣诞树

    前言 本文给大家分享的是如何通过 Python 脚本一次运行成功圣诞树代码,圣诞节快到了,兄弟们可以get起来了,拿去哄哄女朋友了! 开发工具 Python版本:3.11.0 编译器: pycharm ...

  2. 7个惊艳众人的 Python 实用项目!【附源码】

    今天分享7个学妹看见都惊呆的 Python 小项目![附源码] 建议收藏 界面应用 1.计算器 1. 案例介绍 本例利用 Python 开发一个可以进行简单的四则运算的图形化计算器,会用到 Tkint ...

  3. 基于嵌入式linux五子棋游戏,Android 实战项目之五子棋 附源码

    Android五子棋游戏五子连珠算法实现 1.游戏规则 五子棋是两个人之间进行的竞技活动,黑方白方规则规则相同,黑棋必须先行,五连子的方向为横.竖.斜,如黑白色任一方先五子连一线则算胜出. 2.五子连 ...

  4. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  5. Python实现物流管理系统(附源码)

    前言 基于Django实现的物流管理系统,工作时忙里偷闲写的练手项目. 特点 前端基于Bootstrap 4框架和AdminLTE框架. 使用MySQL作为数据库后端. 实现了运单录入.发车出库.到货 ...

  6. 13行代码实现:Python实时视频采集(附源码)

    一.前言 本文是<人脸识别完整项目实战>系列博文第3部分:程序设计篇(Python版),第1节<Python实时视频采集程序设计>,本章内容系统介绍:基于Python+open ...

  7. html实现扫雷小游戏(附源码)

    文章目录 实现功能 1.扫雷设计 1.1 主界面 1.2 扫雷难度 1.3 附带功能 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blo ...

  8. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

    运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明. Java手机网络版象棋游戏附源码 (1 folders, 2 f ...

  9. cvtcolor python opencv_13行代码实现:Python实时视频采集(附源码)

    程序逻辑 Python实时视频采集程序主要流程共分为10个步骤,具体如下图所示: 流程描述: 库文件导入:导入程序依赖的python安装包: 摄像头管理对象创建和初始化:是对opencv VideoC ...

  10. 【Python】一文弄懂python装饰器(附源码例子)

    目录 前言 一.什么是装饰器 二.为什么要用装饰器 三.简单的装饰器 四.装饰器的语法糖@ 五.装饰器传参 六.带参数的装饰器 七.类装饰器 八.带参数的类装饰器 九.装饰器的顺序 总结 写在后面 前 ...

最新文章

  1. C 语言编程 — 高级数据类型 — 共用体
  2. 正则表达式基本语法详解
  3. 本地传送命令到远程主机上执行的方法
  4. MySQL安全等于的介绍
  5. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入
  6. 机器学习基础(四十)—— 将距离转换为权重
  7. 【Luogu4921】情侣?给我烧了!(组合计数)
  8. Vue双向绑定的实现原理系列(三):监听器Observer和订阅者Watcher
  9. linux端口快速释放,Linux 快速释放端口与释放内存缓存,linux释放端口缓存
  10. 微信获取unionid
  11. sciencesoftware科学软件
  12. 矩阵最简行阶梯型计算器_商人懂技术,谁也挡不住——首位将机械计算器推向全世界的人...
  13. 西门子——不同数据的存储方式
  14. 绝地求生手游qq和微信不在一个服务器,绝地求生刺激战场微信和qq好友能一起玩吗 qq和微信服务器互通吗...
  15. Windows10平台优秀软件及设置调整
  16. 如何对儿童虐待照片进行地理定位?
  17. npm 配置项registry修改为淘宝镜像
  18. php where 时间条件,thinkphp5日期时间查询比较和whereTime使用方法
  19. asterisk安装、配置
  20. win10如何把右下角的时间隐藏

热门文章

  1. 国王游戏.2333_微扰(邻项交换)证明
  2. BZOJ 4668: 冷战
  3. 如何删除CSDN上自己上传的资源方法汇总(第一种方法神操作,亲测有效)
  4. ASP.NET程序员常用的85个工具
  5. iverilog搭建简易仿真平台
  6. 3种常用系统制作ubuntu U盘安装盘
  7. 电竞英雄联盟数据API接口 - 【英雄联赛统计】API调用示例代码
  8. 【云原生|Docker】Docker镜像操作
  9. golang路由mux的介绍及基本使用
  10. Jetpack Compose(一):Text