如何用Python做三階拼圖?

AI科技大本營發表於2019-02-13

640?wx_fmt=jpeg


作者 | Ahab

來源 | Ahab雜貨鋪(ID:AhabBin)

今天是年假的最後一天,明天大家就要回到各自的工作崗位上去,公眾號從今天開始恢復更新。不知道大家假期過得怎麼樣,帥張提到假期多關注一些家裡的變化,自己也記錄了點東西,準備今天整理下跟大家分享,可是過了這一個假期,自己狀態全無,不知道大家會不會跟我一樣有節後焦慮症,不能很快恢復之前的工作狀態,最後還是寫點簡單有意思的技術文分享給大家,希望大家在輕鬆的狀態下開始工作。

今天這篇文章比較有意思,用python做一個三階拼圖,自己寫這個程式的出發點很簡單,就是為了哄自己的小外甥玩,不過他好像不是特別感興趣,那又怎樣。話不多說,我們開始學習吧。


程式介紹

640?wx_fmt=jpeg

先上圖讓大家感受一下

程式的功能很簡單,還是之前我們用到的pygame和隨機數的知識,整個流程非常的清晰,但是我們需要注意:該遊戲如果直接在地圖的二維陣列上進行隨機打亂,是會很大機率出現無解的情況。所以,我是在拼好的基礎上採用隨機移動(按照遊戲規則來移動)的思路進行地圖打亂。


具體實現

隨意的找一張照片跟程式碼檔案放在同一檔案資料夾下就可以。


import random
import pygame

# 初始化
pygame.init()
# 視窗標題
pygame.display.set_caption('Ahab雜貨鋪拼圖遊戲')
# 視窗大小
s = pygame.display.set_mode((1200600))

然後進行遊戲初始化,設定標題和遊戲介面的大小。


# 繪圖地圖
imgMap = [
    [012],
    [345],
    [678]
]

# 判斷勝利的地圖
winMap = [
    [012],
    [345],
    [678]
]

繪製初始地圖並且設定勝利地圖,這裡使用陣列的方式進行處理。


# 遊戲的單擊事件
def click(x, y, map):
    if y - 1 >= 0 and map[y - 1][x] == 8:
        map[y][x], map[y - 1][x] = map[y - 1][x], map[y][x]
    elif y + 1 <= 2 and map[y + 1][x] == 8:
        map[y][x], map[y + 1][x] = map[y + 1][x], map[y][x]
    elif x - 1 >= 0 and map[y][x - 1] == 8:
        map[y][x], map[y][x - 1] = map[y][x - 1], map[y][x]
    elif x + 1 <= 2 and map[y][x + 1] == 8:
        map[y][x], map[y][x + 1] = map[y][x + 1], map[y][x]

這裡需要設定遊戲的點選事件,簡單的說就是滑鼠點選圖片進行移動的邏輯,主要的邏輯程式碼就是做了if判斷,比較容易理解。


# 打亂地圖
def randMap(map):
    for i in range(1000):
        x = random.randint(02)
        y = random.randint(02)
        click(x, y, map)

使用隨機數的方式將地圖進行打亂。


# 載入圖片
img = pygame.image.load('2.jpg')
# 隨機地圖
randMap(imgMap)
# 遊戲主迴圈
while True:
    # 延時32毫秒,相當於FPS=30
    pygame.time.delay(32)
    for event in pygame.event.get():
        # 視窗的關閉事件
        if event.type == pygame.QUIT:
            exit()
        elif event.type == pygame.MOUSEBUTTONDOWN: 
            if pygame.mouse.get_pressed() == (100): 
                mx, my = pygame.mouse.get_pos()
                if mx < 498 and my < 498
                    x = int(mx / 166
                    y = int(my / 166)
                    click(x, y, imgMap) 
                    if imgMap == winMap:
                        print("成功!")

載入我們的照片,並且將地圖進行隨機打亂。設定遊戲的主迴圈,獲取滑鼠的座標,判斷滑鼠是否在操作範圍內,計算滑鼠點選的圖塊,判斷操作是否成功。


    # 背景色填充成綠色
    s.fill((02550))
    # 繪圖
    for y in range(3):
        for x in range(3):
            i = imgMap[y][x]
            if i == 8:  # 8號圖塊不用繪製
                continue
            dx = (i % 3) * 166  # 計算繪圖偏移量
            dy = (int(i / 3)) * 166
            s.blit(img, (x * 166, y * 166), (dx, dy, 166166))
    # 畫參考圖片
    s.blit(img, (5000))
    # 重新整理介面
    pygame.display.flip()

將背景進行填充,繪製圖片和設定參考圖片。


寫在最後

總之,新的一年,新的開始,一起努力吧。程式碼已經上傳到Github。

連結:

https://github.com/AhabWang/AhabCode/blob/master/%E6%8B%BC%E5%9B%BE%E6%B8%B8%E6%88%8F.py

(本文為AI科技大本營轉載文章,轉載請微信聯絡原作者)

徵稿

640?wx_fmt=png


推薦閱讀:


                         640?wx_fmt=png

點選“閱讀原文”,開啟CSDN APP 閱讀更貼心!

相關文章