from tkinter import * from tkinter.messagebox import * import random root = Tk('拼圖遊戲') root.title("拼圖") # 載入外部圖像 Pics = [] for i in range(9): filename ="p"+str(i)+".png" Pics.append(PhotoImage(file=filename)) # 定義常量 # 畫布的尺寸 WIDTH = 800 HEIGHT = 730 # 圖像塊的邊長 IMAGE_WIDTH = WIDTH//3 IMAGE_HEIGHT = HEIGHT//3 #棋盤行列數 ROWS = 3 COLS = 3 # 移動步數 steps = 0 # 保存全部圖像塊的列表 board = [[0,1,2], [3,4,5], [6,7,8]] # 圖像塊類 class Square: def __init__(self,orderID): self.orderID = orderID def draw(self,canvas,board_pos): img = Pics[self.orderID] canvas.create_image(board_pos,image=img) # 初始化拼圖版 def init_board(): # 打亂圖像塊座標 L=list(range(8)) L.append(None) random.shuffle(L) # 填充拼板圖 for i in range(ROWS): for j in range(COLS): idx = i * ROWS + j orderID=L[idx] if orderID is None: board[i][j] = None else: board[i][j] = Square(orderID) # 重置遊戲 def play_game(): global steps steps = 0 init_board() # 繪製遊戲界面各元素 def drawBoard(canvas): # 畫黑框 canvas.create_polygon((0,0,WIDTH,HEIGHT,0,HEIGHT),width=1,outline='Black',fill='green') # 畫圖像塊 # 代碼寫在這裏 for i in range(ROWS): for j in range(COLS): if board[i][j] is not None: board[i][j].draw(canvas,(IMAGE_WIDTH*(j+0.5),IMAGE_HEIGHT*(i+0.5))) def mouseclick(pos): global steps #將點擊位置換算成拼圖版上的座標 r = int(pos.y//IMAGE_HEIGHT) c = int(pos.x//IMAGE_WIDTH) print(r,c) if r < 3 and c < 3: #點擊位置在拼圖板內才移動圖片 if board[r][c] is None: #點到空位置上什麼也不移動 return else: #依次檢查當前圖像塊的上,下,左,右是否有空位置,若是有就移動當前圖像塊 current_square = board[r][c] if r - 1 >=0 and board[r-1][c] is None: #判斷上面 board[r][c] = None board[r-1][c] = current_square steps +=1 elif c + 1 <=2 and board[r][c+1] is None: #判斷右面 board[r][c] = None board[r][c+1] = current_square steps += 1 elif r + 1 <=2 and board[r+1][c] is None: #判斷下面 board[r][c] = None board[r+1][c] = current_square steps += 1 elif c -1 >= 0 and board[r][c-1] is None: #判斷左面 board[r][c] = None board[r][c-1] = current_square steps +=1 #printd(board) label1["text"]=str(steps) cv.delete('all') #清除canvas畫布上的內容 drawBoard(cv) if win(): showinfo(title="恭喜",message="你成功了!") def win(): for i in range(ROWS): for j in range(COLS): if board[i][j] is not None and board[i][j].orderID!=i * ROWS + j: return False return True def callBack2(): print("從新開始") play_game() cv.delete('all') #清除canvas畫布上的內容 drawBoard(cv) #設置窗口 cv = Canvas(root,bg = 'white',width = WIDTH,height = HEIGHT) b1=Button(root,text="從新開始",command=callBack2,width=20) label1=Label(root,text="0",fg="red",width=20) label1.pack() cv.bind("<Button-1>",mouseclick) cv.pack() b1.pack() play_game() drawBoard(cv) root.mainloop()