国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:3日期:2022-07-05 11:20:22

需要自己添加圖片素材呦

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

運行效果:

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

完整代碼

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Date : 2017-10-02 15:19:24# @Author : Salamander([email protected])# @Link : http://51lucy.comimport os, randomimport tkinter as tkimport tkinter.messageboxfrom PIL import Image, ImageTkclass MainWindow():__gameTitle = '連連看游戲'__windowWidth = 700__windowHeigth = 500__icons = []__gameSize = 10 # 游戲尺寸__iconKind = __gameSize * __gameSize / 4 # 小圖片種類數(shù)量__iconWidth = 40__iconHeight = 40__map = [] # 游戲地圖__delta = 25__isFirst = True__isGameStart = False__formerPoint = NoneEMPTY = -1NONE_LINK = 0STRAIGHT_LINK = 1ONE_CORNER_LINK = 2TWO_CORNER_LINK = 3def __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 = Truedef clickCanvas(self, event):if self.__isGameStart:point = self.getInnerPoint(Point(event.x, event.y))# 有效點擊坐標if point.isUserful() and not self.isEmptyInMap(point):if self.__isFirst:self.drawSelectedArea(point)self.__isFirst= Falseself.__formerPoint = pointelse:if self.__formerPoint.isEqual(point):self.__isFirst = Trueself.canvas.delete('rectRedOne')else:linkType = self.getLinkType(self.__formerPoint, point)if linkType[’type’] != self.NONE_LINK:# TODO Animationself.ClearLinkedBlocks(self.__formerPoint, point)self.canvas.delete('rectRedOne')self.__isFirst = Trueif self.isGameEnd():tk.messagebox.showinfo('You Win!', 'Tip')self.__isGameStart = Falseelse:self.__formerPoint = pointself.canvas.delete('rectRedOne')self.drawSelectedArea(point)# 判斷游戲是否結束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 Falsereturn True’’’提取小頭像數(shù)組’’’def extractSmallIconList(self):imageSouce = Image.open(r’imagesNARUTO.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.__gameSizefor x in range(0, total):index = random.randint(0, total - x - 1)records.append(tmpRecords[index])del tmpRecords[index]# 一維數(shù)組轉為二維,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)部坐標對應矩形左上角頂點坐標’’’def getOuterLeftTopPoint(self, point):return Point(self.getX(point.x), self.getY(point.y))’’’獲取內(nèi)部坐標對應矩形中心坐標’’’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.__deltadef getY(self, y):return y * self.__iconHeight + self.__delta’’’獲取內(nèi)部坐標’’’def getInnerPoint(self, point):x = -1y = -1for i in range(0, self.__gameSize):x1 = self.getX(i)x2 = self.getX(i + 1)if point.x >= x1 and point.x < x2:x = ifor j in range(0, self.__gameSize):j1 = self.getY(j)j2 = self.getY(j + 1)if point.y >= j1 and point.y < j2:y = jreturn Point(x, y)’’’選擇的區(qū)域變紅,point為內(nèi)部坐標’’’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')’’’消除連通的兩個塊’’’def ClearLinkedBlocks(self, p1, p2):self.__map[p1.y][p1.x] = self.EMPTYself.__map[p2.y][p2.x] = self.EMPTYself.canvas.delete(’im%d%d’ % (p1.x, p1.y))self.canvas.delete(’im%d%d’ % (p2.x, p2.y))’’’地圖上該點是否為空’’’def isEmptyInMap(self, point):if self.__map[point.y][point.x] == self.EMPTY:return Trueelse:return False’’’獲取兩個點連通類型’’’def getLinkType(self, p1, p2):# 首先判斷兩個方塊中圖片是否相同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 = -1end = -1# 水平if p1.y == p2.y:# 大小判斷if p2.x < p1.x:start = p2.xend = p1.xelse:start = p1.xend = p2.xfor x in range(start + 1, end):if self.__map[p1.y][x] != self.EMPTY:return Falsereturn Trueelif p1.x == p2.x:if p1.y > p2.y:start = p2.yend = p1.yelse:start = p1.yend = p2.yfor y in range(start + 1, end):if self.__map[y][p1.x] != self.EMPTY:return Falsereturn Truereturn Falsedef 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 pointCornerpointCorner = Point(p2.x, p1.y)if self.isStraightLink(p1, pointCorner) and self.isStraightLink(pointCorner, p2) and self.isEmptyInMap(pointCorner):return pointCornerdef 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:continueif 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:continueif 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 = xself.y = ydef isUserful(self):if self.x >= 0 and self.y >= 0:return Trueelse:return False’’’判斷兩個點是否相同’’’def isEqual(self, point):if self.x == point.x and self.y == point.y:return Trueelse:return False’’’克隆一份對象’’’def clone(self):return Point(self.x, self.y)’’’改為另一個對象’’’def changeTo(self, point):self.x = point.xself.y = point.yMainWindow()

以上就是python tkinter實現(xiàn)連連看游戲的詳細內(nèi)容,更多關于python tkinter連連看的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: xxx国产老太婆视频 xxx欧美老熟 | 91精品久久 | 精品国产一区二区三区免费 | 国产亚洲精品一区二区在线观看 | 永久免费不卡在线观看黄网站 | 成人自拍在线 | 真实一级一级一片免费视频 | 特黄女一级毛片 | 特黄日韩免费一区二区三区 | 美女张开腿让男人捅的视频 | 在线日本看片免费人成视久网 | 香蕉超级碰碰碰97视频蜜芽 | 欧美一级毛片欧美毛片视频 | 91国在线视频| 免费看欧美一级特黄a大片一 | 久久精品一区二区免费看 | 亚洲欧美日韩在线不卡中文 | 久久精品国内一区二区三区 | 成免费网站 | 宅女深夜福利视频在线 | 国产精品亚洲二线在线播放 | 青青热在线精品视频免费 | 亚洲国产精品不卡毛片a在线 | 日韩欧美不卡在线 | 午夜宅男在线永远免费观看网 | 神马午夜视频 | 欧美一区二区三区四区在线观看 | 国产精品大全国产精品 | 国产精品黄在线观看免费 | 国产香蕉在线视频一级毛片 | 综合刺激网 | 免费观看成人久久网免费观看 | 欧美久草 | 黄色毛片播放 | 天天激情站 | 狠狠干香蕉 | 成年女人在线观看片免费视频 | 亚洲国产日韩综合久久精品 | 中文字幕一区在线 | 亚洲精品人成网在线播放影院 | 亚洲国产一区二区三区四区 |