pygame設計一個刮刮樂加分小遊戲小程序,教師加分獎,翻牌遊戲

預期成果:
一個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

  1. 使用pip命令安裝:pip install PyInstaller
  2. 把路徑切換到文件所在路徑: cd D:\pylearn\choujiang
  3. pyinstaller -F myfile.py
    在這裏插入圖片描述
  4. 將pygame需要的圖片音效等文件與exe放在同一目錄下
    在這裏插入圖片描述
  5. 打開exe文件。
    在這裏插入圖片描述
    完結撒花。

一些思考:舒爾特方格、一些翻牌遊戲應該都能這樣做出來。

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