之前用pygame完成了刮刮樂的遊戲,也就是一個:4×4的方格,16只動物圖片隨機排序,點擊後顯示隨機數字。如下圖。
具體內容見:pygame設計一個刮刮樂加分小遊戲小程序,教師加分獎,翻牌遊戲
完成後想到可以利用這種方法,設計一個舒爾特方格的遊戲,也可以設計一個記憶力訓練翻牌遊戲。先來嘗試舒爾特方格遊戲。
初步設想思路如下:
- 3*3方格,9個數字。
- 數字位置隨機。
- 點擊正確的數字時,該數字變色。點擊錯誤的數字時,發出錯誤的提示音,該數字不變色。
- 開始按鈕和重新開始按鈕的設計~~
- 顯示計時時間,且玩家全部完成後要結束計時,並顯示總用時。~
- 封裝成exe文件。
ok,邊做邊琢磨。
STEP1前期準備。
- 安裝python。
- win+R,輸入cmd,進入命令提示符。。
安裝pygame:pip install pygame
安裝python轉exe的工具PyInstaller:pip install PyInstaller
安裝numpy:pip install numpy
- 準備圖片,我是用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_start
、global 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
程序越寫越長,程序員不易~加油!