預期成果:
一個4×4的表格,每個空有一隻動物,點擊動物,動物消失,下面出現隨機的數字,學生加相應的分數。
最終達到:隨機數字,隨機圖像,封裝成exe方便在不同電腦使用。
--------------------我是分割線-------------------
前期工作:安裝python,安裝pygame。
windows命令提示符安裝pygame
pip install pygame
安裝python轉exe的工具:PyInstaller
pip install PyInstaller
開工!
STEP1 實現一張圖片的顯示。
import pygame
import sys
pygame.init() # 初始化pygame
size = width, height = 600, 600 # 設置窗口大小
screen = pygame.display.set_mode(size) # 顯示窗口
jpgFileName = "pic/pic1 (1).png"
while True: # 死循環確保窗口一直顯示
for event in pygame.event.get(): # 遍歷所有事件
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
imgRect = pygame.image.load(jpgFileName)
screen.blit(imgRect,[0,0])
pygame.display.flip() # 更新全部顯示
pygame.quit() # 退出pygame
輸出爲:
STEP2 實現點擊後圖片消失。
(失敗,網上說圖片不能消失,可以重新繪製,可以做一個列表,再列表中刪除,再重新繪製,貌似我不會啊,先簡單實現點擊後出現另一張圖片)
STEP2.1 實現點擊圖片後顯示另一張圖片。
import pygame
import sys
pygame.init() # 初始化pygame
size = width, height = 600, 600 # 設置窗口大小
screen = pygame.display.set_mode(size) # 顯示窗口
jpgFileName = "pic/pic1 (1).png"
imgRect = pygame.image.load(jpgFileName)
jpgFileName2 = "pic/pic1 (2).png"
imgRect2 = pygame.image.load(jpgFileName2)
screen.blit(imgRect, [0, 0])
while True: # 死循環確保窗口一直顯示
for event in pygame.event.get(): # 遍歷所有事件
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN and 0<=event.pos[0]<=200 and 0<=event.pos[1]<=200: #判斷鼠標位置以及是否摁了下去。:裏面的200是我隨便寫的數,到時候需要根據圖片尺寸修改。
screen.blit(imgRect2, [0, 0])
pygame.display.flip() # 更新全部顯示
pygame.quit() # 退出pygame
STEP3 規範圖片尺寸和圖片名稱。
是不是需要設計一個統一的規則,比如圖片點擊後,不論點擊哪張?我這水平的…什麼類?什麼函數?呃呃呃
還要考慮隨機圖片名稱和函數,所以最好用上面說的,建一個列表,點擊後將列表更新,比如正常是000000,顯示,點擊了第三個圖片,列表更新爲001000,1表示分數數字。
要做這麼幾件事:
- 動物圖片準備好,統一大小尺寸。命名按pic0、pic1、pic2這樣排下來。
- 數字(分數)圖片準備好,統一大小尺寸,命名按num1、num2、num3
- 思考列表和隨機順序的事。
今天竟然完成啦,哈啊
我把所有圖片都修改爲150×150像素的,然後重命名。如下圖
STEP4 然後就一邊百度一邊寫啊,改啊,能用循環的儘量用了循環。
代碼如下:
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, 150, 300, 450]
Ypts=[0, 150, 300, 450]
map = np.array(list(itertools.product(Xpts, Ypts))) #16幅圖片座標
status = [0 for i in range(16)] #是否被翻開的狀態位
list1 = [[i] for i in range(16)]
random.shuffle(list1) #將動物圖片打亂順序,並載入圖片
for i in range(16): #這裏必須 16,15的話少右下角一張。
screen.blit(pygame.image.load("pic/pic" + str(*list1[i-1]) + ".jpg"), map[i])
# pygame.display.flip() # 更新全部顯示
while True: # 死循環確保窗口一直顯示
for event in pygame.event.get(): # 遍歷所有事件
if event.type == pygame.QUIT: # 如果單擊關閉窗口,則退出
sys.exit()
for i in range(16):
if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 150 and map[i][1]<=event.pos[1]<=map[i][1] + 150 and status[i] != 1: #判斷鼠標位置以及是否摁了下去。:
screen.blit(pygame.image.load("pic/num" + str(random.randint(0,3))+ ".jpg"), map[i])
status[i] = 1
pygame.display.flip() # 更新全部顯示
pygame.quit() # 退出pygame
做了這麼幾個工作:
- 將16幅動物圖片顯示在屏幕上。
- 準備了16幅圖片的左上角座標,用的是
Xpts=[0, 150, 300, 450]
Ypts=[0, 150, 300, 450]
map = np.array(list(itertools.product(Xpts, Ypts)))
上面排列組合了。我本想着用循環,發現太麻煩了。
- 驚喜的是幾個用法都可以運行。一是爲了將16幅動物圖片顯示在屏幕上,我沒有一幅圖一幅圖地賦值,而是儘可能的用了拼接變量名的形式,發現了很多小技巧,比如數組裏數字帶【】,前面加上星號*就可以了。還有驚喜的是
map[i][0]<=event.pos[0]<=map[i][0] + 150
上面這個竟然可以用。
- 同時,爲了避免分數出現後,再次點擊會導致分數刷新,我添加了狀態位,當 分數出現後,該位置賦值1,不再刷新分數。
輸出效果如圖。
最後,一個不明白的地方,那個顯示的時候
list1 = [[i] for i in range(16)]
random.shuffle(list1) #將動物圖片打亂順序,並載入圖片
for i in range(16): #這裏必須 16,15的話少右下角一張。
screen.blit(pygame.image.load("pic/pic" + str(*list1[i-1]) + ".jpg"), map[i])
哪個是哪個分不清了,反正是都顯示出來了,暈暈乎乎的。
STEP5 下面更新了一個音效:當分數圖片是3或4時,播放音效。
wavFileName = 'sound/sound1.wav' #載入音效
sndTrack = pygame.mixer.music.load(wavFileName)
pygame.mixer.music.play()
完整代碼更新如下:
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, 150, 300, 450]
Ypts=[0, 150, 300, 450]
map = np.array(list(itertools.product(Xpts, Ypts))) #16幅圖片座標
status = [0 for i in range(16)] #是否被翻開的狀態位
list1 = [[i] for i in range(16)]
random.shuffle(list1) #將動物圖片打亂順序,並載入圖片
for i in range(16): #這裏必須 16,15的話少右下角一張。
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(16):
if event.type == pygame.MOUSEBUTTONDOWN and map[i][0]<=event.pos[0]<=map[i][0] + 150 and map[i][1]<=event.pos[1]<=map[i][1] + 150 and status[i] != 1: #判斷鼠標位置以及是否摁了下去。:
tem_num = random.randint(0,3)
screen.blit(pygame.image.load("pic/num" + str(tem_num)+ ".jpg"), map[i])
status[i] = 1
if tem_num >= 2: #3分及以上播放音效
pygame.mixer.music.play()
pygame.display.flip() # 更新全部顯示
pygame.quit() # 退出pygame
STEP6 封裝成exe文件
win+R打開cmd
- 使用pip命令安裝:
pip install PyInstaller
- 把路徑切換到文件所在路徑:
cd D:\pylearn\choujiang
pyinstaller -F myfile.py
- 將pygame需要的圖片音效等文件與exe放在同一目錄下
- 打開exe文件。
完結撒花。
一些思考:舒爾特方格、一些翻牌遊戲應該都能這樣做出來。