pygame設計舒爾特方格遊戲python舒爾特方格小程序

之前用pygame完成了刮刮樂的遊戲,也就是一個:4×4的方格,16只動物圖片隨機排序,點擊後顯示隨機數字。如下圖。
在這裏插入圖片描述
具體內容見:pygame設計一個刮刮樂加分小遊戲小程序,教師加分獎,翻牌遊戲

完成後想到可以利用這種方法,設計一個舒爾特方格的遊戲,也可以設計一個記憶力訓練翻牌遊戲。先來嘗試舒爾特方格遊戲。

初步設想思路如下:

  • 3*3方格,9個數字。
  • 數字位置隨機。
  • 點擊正確的數字時,該數字變色。點擊錯誤的數字時,發出錯誤的提示音,該數字不變色。
  • 開始按鈕和重新開始按鈕的設計~~
  • 顯示計時時間,且玩家全部完成後要結束計時,並顯示總用時。~
  • 封裝成exe文件。

ok,邊做邊琢磨。

STEP1前期準備。

  1. 安裝python。
  2. win+R,輸入cmd,進入命令提示符。。
    安裝pygame:pip install pygame
    安裝python轉exe的工具PyInstaller:pip install PyInstaller
    安裝numpy:pip install numpy
  3. 準備圖片,我是用ppt設計了圖片,並另存爲圖片。
    在這裏插入圖片描述
    然後利用畫圖軟件修改圖片像素爲200×200。完成後如下圖:
    在這裏插入圖片描述
    其中,白色數字爲未點擊狀態,藍色數字爲點擊後數字。文件嗎分別爲pic什麼和qic什麼。

STEP2. 9幅數字圖片顯示

import pygame
import sys
import random
import numpy as np
import itertools

pygame.init()  # 初始化pygame
size = width, height = 600, 600  # 設置窗口大小
screen = pygame.display.set_mode(size)  # 顯示窗口

Xpts=[0, 200, 400]
Ypts=[0, 200, 400]
map = np.array(list(itertools.product(Xpts, Ypts)))   #9幅圖片座標
status =  [0 for i in range(9)]    #是否被翻開的狀態位
list1 = [[i] for i in range(9)]
random.shuffle(list1)     #將圖片打亂順序,並載入圖片
print(list1)   #注意該句,下面要用到它輸出的數組。
for i in range(9):    #這裏必須 9
    screen.blit(pygame.image.load("pic/pic" + str(*list1[i-1]) + ".jpg"), map[i])

while True:  # 死循環確保窗口一直顯示
    for event in pygame.event.get():  # 遍歷所有事件
        if event.type == pygame.QUIT:  
            sys.exit()

        pygame.display.flip()  # 更新全部顯示
pygame.quit()  # 退出pygame

上面的代碼和之前刮刮樂遊戲的代碼是一樣的,只不過圖片數量變爲9幅,去掉了點擊後圖片變化效果(之前刮刮樂程序是點擊圖片嘔隨機出現一張分數圖片,這裏不能隨機出現了,只能出現和點擊的一樣的藍色圖片)。
在這裏插入圖片描述

STEP3 設計點擊後圖片變色效果

在這裏插入圖片描述
要注意程序中這句代碼:

print(list1)   #注意該句,下面要用到它輸出的數組。

爲了確定點開的到底是哪幅圖片以便顯示點擊後的圖片,要去研究pygame的界面和輸出的數組對應的關係。
在這裏插入圖片描述
對上圖的說明:數組中的數字是顯示圖片時打亂的順序,也就是將0-8這9個數字隨機排序,然後系統依次顯示這9個數字對應的圖片,第1個數字“7”對應的圖片爲8號圖片(第1幅圖),但它顯示在了第一列第2個;第2個數字“1”對應圖片爲2號圖片,顯示在了第一列第3(第2幅圖),所以圖片的顯示順序爲:
在這裏插入圖片描述
而上面圖片中的座標則爲每一幅圖片的左上角的座標。(不用管)
添加點擊效果,進行測試:
在這裏插入圖片描述
代碼如下:

  for i in range(9):
            if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200 and status[i] != 1: #判斷鼠標位置以及是否摁了下去。:
                print(i)

發現變量i的分佈如圖:
在這裏插入圖片描述

   for i in range(9):
            if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200 and status[i] != 1: #判斷鼠標位置以及是否摁了下去。:
                print(i)
                screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])

上面的代碼:當點擊一個圖片後,獲取變量i值,如果i=2,說明點擊了第1列第3幅圖,對應隨機圖片list1數組裏的圖片順序爲第2張圖片。注意代碼list1[]前面的星號。

screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])

運行後效果如下:
在這裏插入圖片描述

STEP4 設計順序點擊才變色的效果。

增加了zero的變量,初始值爲0,根據確定的i值,找到list1列表中的翻開的數字圖片,判斷是否是最小的圖片。添加了音效,如果按的數字不是小的播放音效。音效提前放到了sound文件夾下。

import pygame
import sys
import random
import numpy as np
import itertools

pygame.init()  # 初始化pygame
size = width, height = 600, 600  # 設置窗口大小
screen = pygame.display.set_mode(size)  # 顯示窗口

Xpts=[0, 200, 400]
Ypts=[0, 200, 400]
map = np.array(list(itertools.product(Xpts, Ypts)))   #9幅圖片座標
zero = 0   #此處添加了一個變量用來確保從最小的數字開始變。
list1 = [[i] for i in range(9)]
random.shuffle(list1)     #將動物圖片打亂順序,並載入圖片
print(list1)
for i in range(9):    #這裏必須 9
    screen.blit(pygame.image.load("pic/pic" + str(*list1[i-1]) + ".jpg"), map[i])
wavFileName = 'sound/sound1.wav'     #載入音效
sndTrack = pygame.mixer.music.load(wavFileName)

while True:  # 死循環確保窗口一直顯示
    for event in pygame.event.get():  # 遍歷所有事件
        if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
            sys.exit()
        for i in range(9):
            if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200: #判斷鼠標位置以及是否摁了下去。:
                print(i)
                if int(*list1[i-1]) <= zero:
                    screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])
                    zero = zero + 1
                else:
                    pygame.mixer.music.play()   #錯誤時播放音樂
                       
        pygame.display.flip()  # 更新全部顯示
pygame.quit()  # 退出pygame

運行效果見下圖:
點擊不正確額數字時會播放音效
STEP5 添加開始界面。

import pygame
import sys
import random
import numpy as np
import itertools

pygame.init()  # 初始化pygame
size = width, height = 600, 600  # 設置窗口大小
screen = pygame.display.set_mode(size)  # 顯示窗口
pygame.display.set_caption("舒爾特方格")    #  給窗口取個名
#clock = pygame.time.Clock()                         #  遊戲刷新速度
#圖片準備
Xpts=[0, 200, 400]
Ypts=[0, 200, 400]
map = np.array(list(itertools.product(Xpts, Ypts)))   #9幅圖片座標
zero = 0   #此處添加了一個變量用來確保從最小的數字開始變。
pic_zreo = 1

list1 = [[i] for i in range(9)]
random.shuffle(list1)     #將動物圖片打亂順序
wavFileName = 'sound/sound1.wav'  # 載入音效
sndTrack = pygame.mixer.music.load(wavFileName)


# 開始界面
start_page = True
while start_page:
    for event in pygame.event.get():  # 遍歷所有事件
        if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
            sys.exit()
        screen.blit(pygame.image.load("pic/start0.jpg"), (200, 200))
        t_x, t_y = pygame.mouse.get_pos()
        if 200 <= t_x <= 500 and 200 <= t_y <= 290:
                screen.blit(pygame.image.load("pic/start1.jpg"), (200, 200))
        if event.type == pygame.MOUSEBUTTONDOWN and 200 <= t_x <= 500 and 200 <= t_y <= 290:
            start_page = False
            game_page = True
        pygame.display.flip()

#遊戲界面
while game_page:
    while pic_zreo:
        for i in range(9):  # 這裏必須 9
            screen.blit(pygame.image.load("pic/pic" + str(*list1[i - 1]) + ".jpg"), map[i])
            print("hahaha")
        pic_zreo = 0
    for event in pygame.event.get():  # 遍歷所有事件
        if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
            sys.exit()
        for i in range(9):
            if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200: #判斷鼠標位置以及是否摁了下去。:
                print(i)
                if int(*list1[i-1]) <= zero:
                    screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])
                    zero = zero + 1
                else:
                    pygame.mixer.music.play()   #錯誤時播放音樂
        pygame.display.flip()  # 更新全部顯示
pygame.quit()  # 退出pygame

在遊戲界面開始的時候設置的pic_zero狀態位是爲了防止題目一直刷新,點擊後變色又變了回來。它怎麼會一直運行呢,奇怪。說明我對裏面的循環還不清楚。

添加了兩張圖片“開始遊戲”。
在這裏插入圖片描述
運行效果如圖:
在這裏插入圖片描述
鼠標放上去變色。
在這裏插入圖片描述
點擊後進入遊戲界面。
在這裏插入圖片描述
STEP6 添加計時器、重新開始的按鈕和主循環

import pygame
import sys
import random
import numpy as np
import itertools
import time

pygame.init()  # 初始化pygame
size = width, height = 600, 600  # 設置窗口大小
screen = pygame.display.set_mode(size)  # 顯示窗口
pygame.display.set_caption("舒爾特方格")    #  給窗口取個名
#圖片準備
Xpts=[0, 200, 400]
Ypts=[0, 200, 400]
map = np.array(list(itertools.product(Xpts, Ypts)))   #9幅圖片座標

# 載入音效
wavFileName = 'sound/sound1.wav'
sndTrack = pygame.mixer.music.load(wavFileName)
## 計時器文本準備
myfont=pygame.font.Font(None,60)
col=0,0,255
#定義全局變量

#準備題目
def zhunbei1():
    global list1
    list1 = [[i] for i in range(9)]
    random.shuffle(list1)


#開始界面
def kaishi(start_page):
    while start_page:
        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()
            screen.blit(pygame.image.load("pic/start0.jpg"), (200, 200))
            global t_x,t_y
            t_x, t_y = pygame.mouse.get_pos()
            if 200 <= t_x <= 500 and 200 <= t_y <= 290:
                    screen.blit(pygame.image.load("pic/start1.jpg"), (200, 200))   #獲取鼠標位置,移動到某位置時變色
            if event.type == pygame.MOUSEBUTTONDOWN and 200 <= t_x <= 500 and 200 <= t_y <= 290:
                start_page = False
                game_page = True
                global time_start
                time_start = time.time()
            pygame.display.flip()


#遊戲界面
def youxijiemian(game_page):
    zero = 0  # 此處添加了一個變量用來確保從最小的數字開始變。
    pic_zreo = 1  # 出題界面狀態,保證只刷出一次題目。
    while game_page:
        while pic_zreo:
            for i in range(9):  # 這裏必須 9
                screen.blit(pygame.image.load("pic/pic" + str(*list1[i - 1]) + ".jpg"), map[i])
            pic_zreo = 0
        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()
            for i in range(9):
                if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200: #判斷鼠標位置以及是否摁了下去。:
                    #print(i)
                    if int(*list1[i-1]) <= zero:
                        screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])
                        zero = zero + 1
                        print(zero)
                        if zero == 9:
                            time_end = time.time()  # 結束計時
                            time_c = time_end - time_start  # 運行所花時間
                            print('time cost', time_c, 's')
                            textImage = myfont.render(str(time_c), True, col)
                            screen.blit(textImage, (100, 100))
                            screen.blit(pygame.image.load("pic/start0.jpg"), (200, 200))
                            if event.type == pygame.MOUSEBUTTONDOWN and 200 <= t_x <= 500 and 200 <= t_y <= 290:
                                start_page = True
                                game_page = False
                            pygame.display.flip()  # 更新全部顯示
                    else:
                        pygame.mixer.music.play()   #錯誤時播放音樂
            pygame.display.flip()  # 更新全部顯示

#主循環
start_page = True
game_page = True
while True:
    zhunbei1()
    kaishi(start_page)
    youxijiemian(game_page)

#pygame.quit()  # 退出pygame

程序改動較大,主要有:

  • 添加了結束時顯示時間。在按下開始按鈕時開始計時器,在完成題目後結束計時。
  • 設置了全局變量,如 global time_startglobal list1
  • 設置了程序循環,將程序分爲3大塊,分別是準備題目、開始界面、遊戲界面。通過while設置死循環。

STEP7 導出生成exe件。
參看pygame設計一個刮刮樂加分小遊戲小程序,教師加分獎,翻牌遊戲

1.win+r打開運行,輸入cmd,進入命令提示符。
2. 進入到py文件目錄下。

 cd D:\pylearn\shuertefangge
d:

3.輸入:pyinstaller -F shuerte3.py
在這裏插入圖片描述
4. 將圖片和音效放入exe文件夾下。
在這裏插入圖片描述

5.運行exe文件
程序錯誤。呃呃。
在這裏插入圖片描述
看樣子是字體的原因。估計是分數的字體,修改一下。

myfont=pygame.font.SysFont('Comic Sans MS', 60)

命令提示符下重新打包

pyinstaller -w -F shuerte3.py

在這裏插入圖片描述
成功
成功。
完結撒花。最後再附上完整代碼:

import pygame
import sys
import random
import numpy as np
import itertools
import time

pygame.init()  # 初始化pygame
size = width, height = 600, 600  # 設置窗口大小
screen = pygame.display.set_mode(size)  # 顯示窗口
pygame.display.set_caption("舒爾特方格")    #  給窗口取個名
#圖片準備
Xpts=[0, 200, 400]
Ypts=[0, 200, 400]
map = np.array(list(itertools.product(Xpts, Ypts)))   #9幅圖片座標

# 載入音效
wavFileName = 'sound/sound1.wav'
sndTrack = pygame.mixer.music.load(wavFileName)
## 計時器文本準備
myfont=pygame.font.SysFont('Comic Sans MS', 60)
GREEN = (0,255,0)
BLUE = (0,0,128)
#定義全局變量

#準備題目
def zhunbei1():
    global list1
    list1 = [[i] for i in range(9)]
    random.shuffle(list1)


#開始界面
def kaishi(start_page):
    while start_page:
        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()
            screen.blit(pygame.image.load("pic/start0.jpg"), (200, 200))
            global t_x,t_y
            t_x, t_y = pygame.mouse.get_pos()
            if 200 <= t_x <= 500 and 200 <= t_y <= 290:
                    screen.blit(pygame.image.load("pic/start1.jpg"), (200, 200))   #獲取鼠標位置,移動到某位置時變色
            if event.type == pygame.MOUSEBUTTONDOWN and 200 <= t_x <= 500 and 200 <= t_y <= 290:
                start_page = False
                game_page = True
                global time_start

                time_start = time.time()
            pygame.display.flip()


#遊戲界面
def youxijiemian(game_page):
    zero = 0  # 此處添加了一個變量用來確保從最小的數字開始變。
    pic_zreo = 1  # 出題界面狀態,保證只刷出一次題目。
    while game_page:
        while pic_zreo:
            for i in range(9):  # 這裏必須 9
                screen.blit(pygame.image.load("pic/pic" + str(*list1[i - 1]) + ".jpg"), map[i])
            pic_zreo = 0
        for event in pygame.event.get():  # 遍歷所有事件
            if event.type == pygame.QUIT:  # 如果單擊關閉窗口,則退出
                sys.exit()
            for i in range(9):
                if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 200 and map[i][1]<=event.pos[1]<=map[i][1] + 200: #判斷鼠標位置以及是否摁了下去。:
                    #print(i)
                    if int(*list1[i-1]) <= zero:
                        screen.blit(pygame.image.load("pic/qic" + str(*list1[i-1])+ ".jpg"), map[i])
                        zero = zero + 1
                        print(zero)
                        if zero == 9:
                            time_end = time.time()  # 結束計時
                            time_c = time_end - time_start  # 運行所花時間
                            print('time cost', time_c, 's')
                            textImage = myfont.render(str(time_c), True, GREEN,BLUE)
                            screen.blit(textImage, (100, 100))
                            screen.blit(pygame.image.load("pic/start0.jpg"), (200, 200))
                            if event.type == pygame.MOUSEBUTTONDOWN and 200 <= t_x <= 500 and 200 <= t_y <= 290:
                                start_page = True
                                game_page = False
                            pygame.display.flip()  # 更新全部顯示
                    else:
                        pygame.mixer.music.play()   #錯誤時播放音樂
            pygame.display.flip()  # 更新全部顯示


#主循環
start_page = True
game_page = True
while True:
    zhunbei1()
    kaishi(start_page)
    youxijiemian(game_page)
#pygame.quit()  # 退出pygame

程序越寫越長,程序員不易~加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章