python设计拼图游戏tkinter_tkinter做一个拼图游戏
今天我们利用canvas绘制、删除图片的的函数,以及鼠标事件的绑定来制作一个简单的九宫格拼图游戏。
首先从网上下九张图,它们是把一张图分割成了九宫图,打乱后显示在canvas画布上。
接下来我们只要实现图片的选中与拖动即可,用到了鼠标左键、按下并拖动左键、鼠标右键和鼠标移动四个事件的绑定。
其他的并不难,直接看完整代码和注释吧:
from tkinter import *
import tkinter as tk
from PIL import Image, ImageTk
import random
a=0 #用来记录绘制的图片编号,其中1-9为初始的9张
List = [1,2,3,4,5,6,7,8,9]
random.shuffle(List) #打乱图片顺序
root = Tk()
root.title("拼图游戏")
root.geometry("1400x690")
canvas = Canvas(root,width=1400, height=690)
canvas.pack()
#获得鼠标位置
def callback(event):
global x,y
x = event.x
y = event.y
#删除刚绘制的图片
def delete(event):
try:
if a>14: #前九张和五条边界线不能删除
canvas.delete(a)
except:
return
#根据鼠标位置,确定当前区域,即选中的图片编号
def pick(event):
global a
if x<=230 and y<=230:
a=1
elif 230
a=2
elif 460
a=3
elif x<=230 and 230
a=4
elif 230
a=5
elif 460
a=6
elif x<=230 and 460
a=7
elif 230
a=8
elif 460
a=9
#删除并重新绘制选中的图片
def call(event):
global a,aa
if a>14: #原图和边界线不删除
canvas.delete(a)
exec('canvas.create_image(x,y,image=var{})'.format(i))
a=aa+1 #记录新的图片编号,aa的初始值为14
aa+=1
#九张图片的位置,以图片中心点为基准
lc=[[115,115],[230+115,115],[460+115,115],[115,230+115],[230+115,230+115],[460+115,230+115],[115,460+115],[230+115,460+115],[460+115,460+115]]
#绘制初始九张图
for j in range(1,10):
load = Image.open("pt/%s.png"%List[j-1])
exec('var{}= ImageTk.PhotoImage(load)'.format(j)) #批量创建变量
exec('canvas.create_image(lc[j-1][0],lc[j-1][1],image=var{})'.format(j))
#绘制初始五条边界线
canvas.create_line(690,0,690,690)
canvas.create_line(690,230,1400,230,fill="white")
canvas.create_line(690,460,1400,460,fill="white")
canvas.create_line(920,0,920,690,fill="white")
aa=canvas.create_line(1150,0,1150,690,fill="white")
#绑定鼠标事件
canvas.bind("",call) #拖动左键,移动图片
canvas.bind("",pick) #点击左键,确定图片编号
canvas.bind("",delete) #右键删除
root.bind("",callback) #移动鼠标获取坐标
root.mainloop()
注意事项:
代码中的难点是如何动态创建变量。exec('canvas.create_image(x,y,image=var{})'.format(i))
之所以必须动态创建,是因为用上面这句赋给image值的时候,传进来的变量不能在后续发生改变,否则就会显示不出图片。因此显示九张图,就得创建九个变量var1、var2……var9,而不能用同一个变量给image传值。为了简便,我们只能动态地创建变量和调用。
另外,注意call函数中,之所以通过aa来给a赋值,而不是直接用:exec('a=canvas.create_image(x,y,image=var{})'.format(i))
原因在于,exec里面赋值语句是不生效的(我也不知道为啥),a不会在里面被赋值。
成果展示:https://www.zhihu.com/video/1243626378958036992
其实拼图游戏只是次要的,重点是怎么用tkinter实现图片的拖动效果。如果真的想做拼图游戏的话,完全可以用点击对应区域的方法,让图片位置更新,而且摆放的位置肯定比手动拖的更加精准。
python设计拼图游戏tkinter_tkinter做一个拼图游戏相关推荐
- python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...
- python大作业数独_python做一个数独小游戏
最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...
- 用 Python 做一个 H5 游戏机器人
原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...
- 做一个FLASH游戏你需要掌握的东西【实用】
做一个FLASH游戏你需要掌握的东西 作者:jianzhong 一直想着什么时间好好做一个像样点的游戏,于是刻意的开始去了解FLASHGAME的相关资料,在这里把自己在整个制作和收集过程中的一些感觉使 ...
- 单枪匹马:4年只做一个iOS游戏 收入破千万美元
2011 年,一款叫做<Tiny Wings>的手游被苹果推荐为最佳 iPhone 游戏,对手游市场有所了解的同学一定会赞同<Tiny Wings>是过去几年中全球知名度仅次于 ...
- Python设计和实现聪明的尼姆游戏
Python设计和实现聪明的尼姆游戏 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品 ...
- 用 JS 做一个数独游戏(二)
用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...
- scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...
导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...
- 利用python加上ffmpeg,ffmpy,做一个音视频格式转换器
利用python加上ffmpeg,可以做一个简单的音乐或者视频格式转换器. 可以利用PyQt5做界面,本例中比较简单: 流程非常简单,点击"选择源文件",选取要转换的音频或者视频文 ...
最新文章
- java2实用教程--第二章基本数据类型与数组
- 在Python中,如何确定对象是否可迭代?
- Python监听剪切板的两种方法
- 全国计算机等级考试题库二级C操作题100套(第35套)
- System.Text.Json 自定义 Conveter
- 王道考研 计算机网络18 私有IP地址 网络地址转发NAT 路由器 路由表 路由转发
- java输出结果校验_2. Bean Validation声明式校验方法的参数、返回值
- Java计算两个经纬度间的距离
- 设置不输入密码ssh登录
- 【JQuery NoviceToNinja系列】目录
- 201671010139 徐楠 关于学习继承
- Synchronized的底层实现原理(看这篇就够了)
- QQ for linux不用udp8000端口?
- linux挂载ipsan存储,centos系统ISCSI挂载IPSAN存储
- FineBI 新增字段后 更新缓慢问题
- TestCase和TestSuite详解
- 深度揭秘阿里云函数计算异步任务能力
- 计算机的问卷调查的题目,新颖的调查问卷的题目
- Kali社会工程学套件入侵Windows
- nginx架构(修改版)