最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python tkinter實(shí)現(xiàn)連連看游戲

 更新時(shí)間:2020年11月16日 17:04:47   作者:salamander-mh  
這篇文章主要介紹了python tkinter實(shí)現(xiàn)連連看游戲的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

需要自己添加圖片素材呦

運(yùn)行效果:

完整代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date  : 2017-10-02 15:19:24
# @Author : Salamander	(1906747819@qq.com)
# @Link  : http://51lucy.com

import os, random
import tkinter as tk
import tkinter.messagebox
from PIL import Image, ImageTk

class MainWindow():
	__gameTitle = "連連看游戲"
	__windowWidth = 700
	__windowHeigth = 500
	__icons = []
	__gameSize = 10 # 游戲尺寸
	__iconKind = __gameSize * __gameSize / 4 # 小圖片種類(lèi)數(shù)量
	__iconWidth = 40
	__iconHeight = 40
	__map = [] # 游戲地圖
	__delta = 25
	__isFirst = True
	__isGameStart = False
	__formerPoint = None
	EMPTY = -1
	NONE_LINK = 0
	STRAIGHT_LINK = 1
	ONE_CORNER_LINK = 2
	TWO_CORNER_LINK = 3

	def __init__(self):
		self.root = tk.Tk()
		self.root.title(self.__gameTitle)
		self.centerWindow(self.__windowWidth, self.__windowHeigth)
		self.root.minsize(460, 460)

		self.__addComponets()
		self.extractSmallIconList()

		self.root.mainloop()

	def __addComponets(self):
		self.menubar = tk.Menu(self.root, bg="lightgrey", fg="black")

		self.file_menu = tk.Menu(self.menubar, tearoff=0, bg="lightgrey", fg="black")
		self.file_menu.add_command(label="新游戲", command=self.file_new, accelerator="Ctrl+N")

		self.menubar.add_cascade(label="游戲", menu=self.file_menu)
		self.root.configure(menu=self.menubar)

		self.canvas = tk.Canvas(self.root, bg = 'white', width = 450, height = 450)
		self.canvas.pack(side=tk.TOP, pady = 5)
		self.canvas.bind('<Button-1>', self.clickCanvas)
    

	def centerWindow(self, width, height):
	  screenwidth = self.root.winfo_screenwidth() 
	  screenheight = self.root.winfo_screenheight() 
	  size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)
	  self.root.geometry(size)


	def file_new(self, event=None):
		self.iniMap()
		self.drawMap()
		self.__isGameStart = True

	def clickCanvas(self, event):
		if self.__isGameStart:
			point = self.getInnerPoint(Point(event.x, event.y))
			# 有效點(diǎn)擊坐標(biāo)
			if point.isUserful() and not self.isEmptyInMap(point):
				if self.__isFirst:
					self.drawSelectedArea(point)
					self.__isFirst= False
					self.__formerPoint = point
				else:
					if self.__formerPoint.isEqual(point):
						self.__isFirst = True
						self.canvas.delete("rectRedOne")
					else:
						linkType = self.getLinkType(self.__formerPoint, point)
						if linkType['type'] != self.NONE_LINK:
							# TODO Animation
							self.ClearLinkedBlocks(self.__formerPoint, point)
							self.canvas.delete("rectRedOne")
							self.__isFirst = True
							if self.isGameEnd():
								tk.messagebox.showinfo("You Win!", "Tip")
								self.__isGameStart = False
						else:
							self.__formerPoint = point
							self.canvas.delete("rectRedOne")
							self.drawSelectedArea(point)


	# 判斷游戲是否結(jié)束
	def isGameEnd(self):
		for y in range(0, self.__gameSize):
			for x in range(0, self.__gameSize):
				if self.__map[y][x] != self.EMPTY:
					return False
		return True

							

	'''
	提取小頭像數(shù)組
	'''
	def extractSmallIconList(self):
		imageSouce = Image.open(r'images\NARUTO.png')
		for index in range(0, int(self.__iconKind)):
			region = imageSouce.crop((self.__iconWidth * index, 0, 
					self.__iconWidth * index + self.__iconWidth - 1, self.__iconHeight - 1))
			self.__icons.append(ImageTk.PhotoImage(region))

	'''
	初始化地圖 存值為0-24
	'''
	def iniMap(self):
		self.__map = [] # 重置地圖
		tmpRecords = []
		records = []
		for i in range(0, int(self.__iconKind)):
			for j in range(0, 4):
				tmpRecords.append(i)

		total = self.__gameSize * self.__gameSize
		for x in range(0, total):
			index = random.randint(0, total - x - 1)
			records.append(tmpRecords[index])
			del tmpRecords[index]

		# 一維數(shù)組轉(zhuǎn)為二維,y為高維度
		for y in range(0, self.__gameSize):
			for x in range(0, self.__gameSize):
				if x == 0:
					self.__map.append([])
				self.__map[y].append(records[x + y * self.__gameSize])

	'''
	根據(jù)地圖繪制圖像
	'''
	def drawMap(self):
		self.canvas.delete("all")
		for y in range(0, self.__gameSize):
			for x in range(0, self.__gameSize):
				point = self.getOuterLeftTopPoint(Point(x, y))
				im = self.canvas.create_image((point.x, point.y), 
					image=self.__icons[self.__map[y][x]], anchor='nw', tags = 'im%d%d' % (x, y))

	'''
	獲取內(nèi)部坐標(biāo)對(duì)應(yīng)矩形左上角頂點(diǎn)坐標(biāo)
	'''
	def getOuterLeftTopPoint(self, point):
		return Point(self.getX(point.x), self.getY(point.y))

	'''
	獲取內(nèi)部坐標(biāo)對(duì)應(yīng)矩形中心坐標(biāo)
	'''
	def getOuterCenterPoint(self, point):
		return Point(self.getX(point.x) + int(self.__iconWidth / 2), 
				self.getY(point.y) + int(self.__iconHeight / 2))
		
	def getX(self, x):
		return x * self.__iconWidth + self.__delta

	def getY(self, y):
		return y * self.__iconHeight + self.__delta

	'''
	獲取內(nèi)部坐標(biāo)
	'''
	def getInnerPoint(self, point):
		x = -1
		y = -1

		for i in range(0, self.__gameSize):
			x1 = self.getX(i)
			x2 = self.getX(i + 1)
			if point.x >= x1 and point.x < x2:
				x = i

		for j in range(0, self.__gameSize):
			j1 = self.getY(j)
			j2 = self.getY(j + 1)
			if point.y >= j1 and point.y < j2:
				y = j

		return Point(x, y)

	'''
	選擇的區(qū)域變紅,point為內(nèi)部坐標(biāo)
	'''
	def drawSelectedArea(self, point):
		pointLT = self.getOuterLeftTopPoint(point)
		pointRB = self.getOuterLeftTopPoint(Point(point.x + 1, point.y + 1))
		self.canvas.create_rectangle(pointLT.x, pointLT.y, 
				pointRB.x - 1, pointRB.y - 1, outline = 'red', tags = "rectRedOne")


	'''
	消除連通的兩個(gè)塊
	'''
	def ClearLinkedBlocks(self, p1, p2):
		self.__map[p1.y][p1.x] = self.EMPTY
		self.__map[p2.y][p2.x] = self.EMPTY
		self.canvas.delete('im%d%d' % (p1.x, p1.y))
		self.canvas.delete('im%d%d' % (p2.x, p2.y))

	'''
	地圖上該點(diǎn)是否為空
	'''
	def isEmptyInMap(self, point):
		if self.__map[point.y][point.x] == self.EMPTY:
			return True
		else:
			return False

	'''
	獲取兩個(gè)點(diǎn)連通類(lèi)型
	'''
	def getLinkType(self, p1, p2):
		# 首先判斷兩個(gè)方塊中圖片是否相同
		if self.__map[p1.y][p1.x] != self.__map[p2.y][p2.x]:
			return { 'type': self.NONE_LINK }

		if self.isStraightLink(p1, p2):
			return {
				'type': self.STRAIGHT_LINK
			}
		res = self.isOneCornerLink(p1, p2)
		if res:
			return {
				'type': self.ONE_CORNER_LINK,
				'p1': res
			}
		res = self.isTwoCornerLink(p1, p2)
		if res:
			return {
				'type': self.TWO_CORNER_LINK,
				'p1': res['p1'],
				'p2': res['p2']
			}
		return {
			'type': self.NONE_LINK
		}


	'''
	直連
	'''
	def isStraightLink(self, p1, p2):
		start = -1
		end = -1
		# 水平
		if p1.y == p2.y:
			# 大小判斷
			if p2.x < p1.x:
				start = p2.x
				end = p1.x
			else:
				start = p1.x
				end = p2.x
			for x in range(start + 1, end):
				if self.__map[p1.y][x] != self.EMPTY:
					return False
			return True
		elif p1.x == p2.x:
			if p1.y > p2.y:
				start = p2.y
				end = p1.y
			else:
				start = p1.y
				end = p2.y
			for y in range(start + 1, end):
				if self.__map[y][p1.x] != self.EMPTY:
					return False
			return True
		return False

	def isOneCornerLink(self, p1, p2):
		pointCorner = Point(p1.x, p2.y)
		if self.isStraightLink(p1, pointCorner) and self.isStraightLink(pointCorner, p2) and self.isEmptyInMap(pointCorner):
			return pointCorner

		pointCorner = Point(p2.x, p1.y)
		if self.isStraightLink(p1, pointCorner) and self.isStraightLink(pointCorner, p2) and self.isEmptyInMap(pointCorner):
			return pointCorner

	def isTwoCornerLink(self, p1, p2):
		for y in range(-1, self.__gameSize + 1):
			pointCorner1 = Point(p1.x, y)
			pointCorner2 = Point(p2.x, y)
			if y == p1.y or y == p2.y:
				continue
			if y == -1 or y == self.__gameSize:
				if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner2, p2):
					return {'p1': pointCorner1, 'p2': pointCorner2}
			else:
				if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner1, pointCorner2) and self.isStraightLink(pointCorner2, p2) and self.isEmptyInMap(pointCorner1) and self.isEmptyInMap(pointCorner2):
					return {'p1': pointCorner1, 'p2': pointCorner2}

		# 橫向判斷
		for x in range(-1, self.__gameSize + 1):
			pointCorner1 = Point(x, p1.y)
			pointCorner2 = Point(x, p2.y)
			if x == p1.x or x == p2.x:
				continue
			if x == -1 or x == self.__gameSize:
				if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner2, p2):
					return {'p1': pointCorner1, 'p2': pointCorner2}
			else:
				if self.isStraightLink(p1, pointCorner1) and self.isStraightLink(pointCorner1, pointCorner2) and self.isStraightLink(pointCorner2, p2) and self.isEmptyInMap(pointCorner1) and self.isEmptyInMap(pointCorner2):
					return {'p1': pointCorner1, 'p2': pointCorner2}


class Point():
	def __init__(self, x, y):
		self.x = x
		self.y = y

	def isUserful(self):
		if self.x >= 0 and self.y >= 0:
			return True
		else:
			return False
					
	'''
	判斷兩個(gè)點(diǎn)是否相同
	'''
	def isEqual(self, point):
		if self.x == point.x and self.y == point.y:
			return True
		else:
			return False

	'''
	克隆一份對(duì)象
	'''
	def clone(self):
		return Point(self.x, self.y)


	'''
	改為另一個(gè)對(duì)象
	'''
	def changeTo(self, point):
		self.x = point.x
		self.y = point.y

MainWindow()

以上就是python tkinter實(shí)現(xiàn)連連看游戲的詳細(xì)內(nèi)容,更多關(guān)于python tkinter連連看的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python3多進(jìn)程 multiprocessing 模塊實(shí)例詳解

    Python3多進(jìn)程 multiprocessing 模塊實(shí)例詳解

    這篇文章主要介紹了Python3多進(jìn)程 multiprocessing 模塊,結(jié)合實(shí)例形式詳細(xì)分析了Python3多進(jìn)程 multiprocessing 模塊的概念、原理、相關(guān)方法使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • 一小時(shí)學(xué)會(huì)TensorFlow2之基本操作2實(shí)例代碼

    一小時(shí)學(xué)會(huì)TensorFlow2之基本操作2實(shí)例代碼

    這篇文章主要介紹了TensorFlow2的基本操作和實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python 實(shí)現(xiàn)邏輯回歸

    python 實(shí)現(xiàn)邏輯回歸

    這篇文章主要介紹了python 實(shí)現(xiàn)邏輯回歸的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python GUI編程之tkinter模塊Toplevel控件實(shí)現(xiàn)搭建父子窗口

    Python GUI編程之tkinter模塊Toplevel控件實(shí)現(xiàn)搭建父子窗口

    這篇文章主要介紹了Python使用tkinter模塊Toplevel控件搭建父子窗口的實(shí)現(xiàn)方法,Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù),Python使用Tkinter可以快速的創(chuàng)建GUI應(yīng)用程序,用到相關(guān)控件的同學(xué)可以參考下
    2023-12-12
  • opencv中cv2.minAreaRect函數(shù)輸出角度問(wèn)題詳解

    opencv中cv2.minAreaRect函數(shù)輸出角度問(wèn)題詳解

    minAreaRect返回的數(shù)據(jù)包括了矩形的中心點(diǎn),寬、高,和旋轉(zhuǎn)角度,下面這篇文章主要給大家介紹了關(guān)于opencv中cv2.minAreaRect函數(shù)輸出角度問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python實(shí)現(xiàn)多張圖片合成一張馬賽克圖片

    Python實(shí)現(xiàn)多張圖片合成一張馬賽克圖片

    這篇文章主要介紹了了Python如何實(shí)現(xiàn)將多張圖片合成一張馬賽克圖片。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • 使用keras內(nèi)置的模型進(jìn)行圖片預(yù)測(cè)實(shí)例

    使用keras內(nèi)置的模型進(jìn)行圖片預(yù)測(cè)實(shí)例

    這篇文章主要介紹了使用keras內(nèi)置的模型進(jìn)行圖片預(yù)測(cè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python的這些庫(kù),你知道多少?

    Python的這些庫(kù),你知道多少?

    最近整理了一些好用的庫(kù)但是只是初級(jí)介紹,如果大家用得到的話(huà)還請(qǐng)自己到官網(wǎng)上查一下,因?yàn)闁|西太多我一 一介紹的話(huà)可能不太現(xiàn)實(shí),需要的朋友可以參考下
    2021-06-06
  • Anaconda第三方庫(kù)下載慢的解決方法

    Anaconda第三方庫(kù)下載慢的解決方法

    本文主要介紹了Anaconda第三方庫(kù)下載慢的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python辦公自動(dòng)化之操控遠(yuǎn)程桌面和文件版本控制

    Python辦公自動(dòng)化之操控遠(yuǎn)程桌面和文件版本控制

    這篇文章主要為大家詳細(xì)介紹了Python辦公自動(dòng)化中操控遠(yuǎn)程桌面和文件版本控制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01

最新評(píng)論

扎鲁特旗| 古浪县| 通城县| 西贡区| 泸西县| 美姑县| 绍兴市| 沙坪坝区| 乳山市| 开阳县| 新巴尔虎左旗| 诏安县| 鹤庆县| 鲜城| 长泰县| 那曲县| 保康县| 巧家县| 织金县| 定远县| 清苑县| 门源| 台东市| 荃湾区| 英超| 海淀区| 巴青县| 磐安县| 阳泉市| 英超| 贵溪市| 阿拉善左旗| 新竹县| 大竹县| 辽源市| 梧州市| 和平区| 肇东市| 屏东县| 抚松县| 富阳市|