通过创作游戏,了解游戏制作步骤,熟悉整个游戏的流程。
疯狂点点点非常休闲益智的指尖闯关游戏,非常解压的休闲游戏伴随着十分欢快的背景音乐完成每一关的挑战任务,完成关卡的挑战,精美炫酷的画风打造非常个性,随着游戏的进行难度也会逐渐提升。
开始界面
整体介绍
这个游戏中,添加了一个开始游戏的功能,在初始界面点击按钮,进入游戏运行状态;玩家通关,进入游戏结束状态。
绘制游戏开始按钮
在初始背景上绘制一个开始按钮角色。
start = Actor('开始')
start.x = WIDTH / 2
start.y = 500
def draw():
screen.blit('初始背景', (0,0))
start.draw()
鼠标点击角色
Pygame中判断鼠标是否点击到某个角色,需要两步:
1. 定义on_mouse_down()
函数
2. 使用collidointep()
检测鼠标指针是否在角色范围内。
on_mouse_down()函数
def on_mouse_down():
print('鼠标被按下了')
按下鼠标按键时,被自动调用一次,会执行下级代码。
collidepoint()函数
def on_mouse_down(pos):
if start.collidepoint(pos):
print('点击了开始按钮')
检测鼠标按下时,鼠标指针是否在某个角色范围内。
运行程序,每次鼠标指针在开始按钮上点击的时候,都会输出“点击了开始按钮”。
切换游戏状态
游戏中,点击开始按钮以后,切换游戏状态,显示新背景。
切换游戏状态
使用变量state记录游戏状态,初始值设为1。
点击按钮后,把state设为2。
state = 1
def on_mouse_down(pos):
global state
if start.collidepoint(pos):
state = 2
根据状态绘制背景
state为1绘制初始背景,state为2 绘制运行背景。
def draw():
global state
if state == 1:
screen.blit('初始背景', (0,0))
start.draw()
elif state == 2:
screen.blit('运行背景',(0,0))
运行程序,鼠标指针在开始按钮上点击,游戏窗口中的初始背景会切换为运行背景,这样玩家就可以决定在什么时候开始游戏。
生成数字阵
使用for循环嵌套,生成4行4列的数字阵,并绘制出来。
生成4×4数字阵
按顺序生成0 – 15的数字阵角色
index = 0
blocks = []
for r in range(4):
for c in range(4):
n =str(index)
b = Acotr(n)
b.x = 180 + c * 80
b.y = 180 + r * 80
blocks.append(b)
index += 1
x坐标:每行数字块从180往右逐渐增加一个宽度80
y坐标:每行数字块从180往下逐渐增加一个宽度80
打乱数字阵
为了提升游戏难度,每次生成的数字阵都是乱序的。
使用乱序列表打乱数字阵
1. 使用for循环,通过循环,创建一个存储着数字0 – 15的列表。
2. 使用random.shuffle(num)
,打乱列表中的元素顺序。
import random
num = []
for i in range(16):
num.append(i)
random.shuffle(num)
3. index作为num的索引,逐个取出列表的元素,作为数字块的图片名称。
for r in range(4):
for c in range(4):
n = str(num[index]) #str()命令把整数转换为字符串类型
b = Actor(n)
每次运行程序,数字阵都是乱序的。
数字阵点击功能
规则:只能按照0-15的顺序正确点击数字块,数字块才会消失。
可以先记录下“应该”点击的数字块编号,然后在玩家点击数字块时,判断被点击的数字块编号和记录的编号是否相同。
- 如果相同,被点击的数字块才会消失;
- 如果不相同,被点击的数字块不会消失。
target = 0
def on_mouse_down(pos):
global target #声明全局变量
for b in blocks:
if b.collidepoint(pos):
if b.image == str(target): #如果被点击数字块的编号等于“应该”点击的数字块编号
target += 1 #记录下次“应该”点击的数字块编号
blocks.remove(b) #从列表中移除该角色,draw()函数再次绘制数字阵时,被点击的数字块就不会被绘制
计时功能
记录玩家通关所用的时间。
定时调用函数
clock.schedule_interval(函数,时间间隔)
在python中,想要每隔一段时间执行一段代码。
- 将代码写在一个函数中;
- 用 clock.schedule_interval() 来定时调用这个函数
想要实现游戏的计时功能。
可以先创建一个变量t来记录玩家的通关时间;
然后每隔1秒,将t的值增大 1。
定义 tick()函数,将 t 的值增大 1
用 clock.schedule_interval() 来定时调用 tick()函数
t = 0 #创建变量t来记录时间
#定义 tick()函数,增大 t 的值
def tick():
global t, state
if state == 2: #当游戏处于运行状态下,才需要计时
t += 1
clock.schedule_interval(tick, 1) #每秒钟调用一次 tick()函数
计时功能
规则:当玩家点击错误的数字块时,应该罚时2秒——将通 关时间增加2秒。
判断数字块被点击的代码在 on_mouse_down()函数。
def on_mouse_down(pos):
global target, t
for b in blocks:
if b.collidepoint(pos): #如果点击了正确的数字块,数字块就会消失
blocks.remove(b)
target += 1
else: #否则,将通关时间增加2秒
t += 2
结束游戏功能
state 等于 1,表示游戏处于初始状态
state 等于 2,表示游戏处于运行状态
state 等于 0,表示游戏处于结束状态
当所有的数字块被正确点击,全部消失后,就需要将游戏切换为结束状态
def on_mouse_down(pos):
global state, target, t
for b in blocks:
if b.collidepoint(pos):
if b.image == str(target):
blocks.remove(b) #移除列表中的元素
target += 1
if len(blocks) == 0: #列表blocks中的元素全部被移除,游戏应该切换为结束状态
state = 0
else: #否则,将通关时间增加2秒
t += 2
游戏处于结束状态下,需要显示结束背景、重新开始按钮,和通关时间。
def draw():
global state, t
......
elif state == 0:
screen.blit('结束背景', pos=[0,0])
restart.draw()
scrren.draw.text(str(t), (WIDTH / 2, 50), fontsize=48, color='purple')
重新开始游戏功能
重新开始游戏功能:玩家点击重新开始按钮,游戏切换到运行状态——背景切换为运行背景、数字阵重新随机排列显示、游戏重新开始计时。
def on_mouse_down(pos):
if restart.collidepoint(pos): #玩家点击重新开始按钮
state = 2 #游戏切换为运行状态
t = 0 #游戏重新计时
target = 0
#重新生成数字阵
random.shuffle(num)
index = 0
blocks = []
for r in range(4):
for c in range(4):
n = str(num[index])
b = Actor(n)
b.x = 180 + c * 80
b.y = 180 + r * 80
blocks.append(b)
index += 1
创建角色后,即使没有使用draw()函数绘制出来,这个角色依旧在窗口中,且可以被鼠标点击。因此,在用鼠标点击角色时,只有特定的状态下,才可以实现对应的效果。
def on_mouse_down(pos):
global state, target, t, blocks
if start.collidepoint(pos) and state==1: #在初始状态下,点击开始按钮,才能启动游戏
state = 2
for b in blocks:
if b.collidepoint(pos) and state==2 #在初始状态下,点击开始按钮,才能启动游戏
if b.image == str(target):
blocks.remove(b)
target += 1
if len(blocks) == 0:
state = 0
else:
t += 2
if restart.collidepoint(pos) and state==0: #在结束状态下,点击重新开始按钮,才能重新开始游戏
state = 2
random.shuffle(num)
index = 0
blocks = []
target = 0
t = 0
for r in range(4):
for c in range(4):
n = str(num[index])
b = Actor(n)
b.x = 180 + c * 80
b.y = 180 + r * 80
blocks.append(b)
index += 1