预期成果:
一个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文件。
完结撒花。
一些思考:舒尔特方格、一些翻牌游戏应该都能这样做出来。