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,不再刷新分数。

输出效果如图。
在这里插入图片描述
在这里插入图片描述
最后,一个不明白的地方,那个显示的时候

扫描二维码关注公众号,回复: 11284864 查看本文章
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文件。
    在这里插入图片描述
    完结撒花。

一些思考:舒尔特方格、一些翻牌游戏应该都能这样做出来。

猜你喜欢

转载自blog.csdn.net/weixin_42944682/article/details/106353138