5.Python圖像處理——人物拼圖遊戲

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()
相關文章
相關標籤/搜索