8パズルのプログラムについて質問です。
以下のような仕様に改良したいです。(回答していただいたプログラムコードも追加しました。)
1.パネルが正解の位置に動かせたらそのパネルを固定したい。
2.空白パネル(pice0)を斜めに交換出来てしまうので、斜め移動できないようにしたい。
どうすればよろしいでしょうか。
import tkinter as tk import random from tkinter import messagebox # 指定された番号がどの位置に表示されているか返却する def searchPiceIndex(pice_num): for idx, num in pice_dict.items(): if pice_num == num: return idx # クリックイベントの定義 def clickPice(event): num = int(event.widget['text']) changePice(num) drawPice() if pice_dict==answer_dict: close() # クリア処理 def close(): messagebox.showinfo('完成',message='完成しました') root.destroy() # 指定した数字のピースと0のピースの入替 def changePice(num): # クリックしたピースと0のピースの位置の特定 num_index = searchPiceIndex(num) zero_index = searchPiceIndex(0) # ピース位置管理の入替 pice_dict[num_index] = 0 pice_dict[zero_index] = num # 表示するピースの入替 pice_label_dict[num_index].configure(text=0) pice_label_dict[zero_index].configure(text=num) # 禁則事項の処理 def canSwapSpacePice(num): zero_idx = searchPiceIndex(0) idx = searchPiceIndex(num) upper_idx = idx - 3 lower_idx = idx + 3 left_idx = idx - 1 right_idx = idx + 1 if (upper_idx == zero_idx): return True elif (lower_idx == zero_idx): return True elif (left_idx!=3)and(left_idx!=6)and(left_idx == zero_idx): return True elif (right_idx!=4)and(right_idx!=7)and(right_idx == zero_idx): return True else: return False # ピース位置管理のランダム生成、解答生成 pice_dict = {} # ピース位置管理 answer_dict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:0} #解答 pice_numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8] # 表示する番号の種類 random_pice_list = random.sample(pice_numbers, 9) # 表示する番号をランダムに並べ替え for idx in range(1, 10): pice_dict[idx] = random_pice_list[idx - 1] # ランダムな値をセット # ウィンドウ生成 root = tk.Tk() root.title('8パズル') root.geometry('400x400') flm = tk.LabelFrame(root) # 画像読み込み pice_image = {} pice_image[0] = tk.PhotoImage(file='./image/0.png') pice_image[1] = tk.PhotoImage(file='./image/1.png') pice_image[2] = tk.PhotoImage(file='./image/2.png') pice_image[3] = tk.PhotoImage(file='./image/3.png') pice_image[4] = tk.PhotoImage(file='./image/4.png') pice_image[5] = tk.PhotoImage(file='./image/5.png') pice_image[6] = tk.PhotoImage(file='./image/6.png') pice_image[7] = tk.PhotoImage(file='./image/7.png') pice_image[8] = tk.PhotoImage(file='./image/8.png') # ピースの配列生成 pice_label_dict = {} def drawPice(): # ピース生成 pice1 = tk.Label(flm, text=pice_dict[1], image = pice_image[pice_dict[1]]) pice1.grid(column=0, row=0, padx=30, pady=30) pice1.bind('<1>', clickPice) pice_label_dict[1] = pice1 pice2 = tk.Label(flm, text=pice_dict[2], image = pice_image[pice_dict[2]]) pice2.grid(column=1, row=0, padx=30, pady=30) pice2.bind('<1>', clickPice) pice_label_dict[2] = pice2 pice3 = tk.Label(flm, text=pice_dict[3], image = pice_image[pice_dict[3]]) pice3.grid(column=2, row=0, padx=30, pady=30) pice3.bind('<1>', clickPice) pice_label_dict[3] = pice3 pice4 = tk.Label(flm, text=pice_dict[4], image = pice_image[pice_dict[4]]) pice4.grid(column=0, row=1, padx=30, pady=30) pice4.bind('<1>', clickPice) pice_label_dict[4] = pice4 pice5 = tk.Label(flm, text=pice_dict[5], image = pice_image[pice_dict[5]]) pice5.bind('<1>', clickPice) pice5.grid(column=1, row=1, padx=30, pady=30) pice_label_dict[5] = pice5 pice6 = tk.Label(flm, text=pice_dict[6], image = pice_image[pice_dict[6]]) pice6.bind('<1>', clickPice) pice6.grid(column=2, row=1, padx=30, pady=30) pice_label_dict[6] = pice6 pice7 = tk.Label(flm, text=pice_dict[7],image = pice_image[pice_dict[7]]) pice7.grid(column=0, row=2, padx=30, pady=30) pice7.bind('<1>', clickPice) pice_label_dict[7] = pice7 pice8 = tk.Label(flm, text=pice_dict[8], image = pice_image[pice_dict[8]]) pice8.grid(column=1, row=2, padx=30, pady=30) pice8.bind('<1>', clickPice) pice_label_dict[8] = pice8 pice0 = tk.Label(flm, text=pice_dict[9], image = pice_image[pice_dict[9]]) pice0.grid(column=2, row=2, padx=30, pady=30) pice0.bind('<1>', clickPice) pice_label_dict[9] = pice0 drawPice() flm.pack(side='top', pady=40) root.mainloop()