本帖最后由 Lillian 于 2022-12-14 10:23 编辑
项目背景:
打地鼠游戏是小朋友都非常喜欢的一个游戏,今天分享一个利用行空板实现打地鼠游戏。至逝去的童年。
游戏主要目标是在最短时间内得到指定的分数,打到一个地鼠得到1分,完成时间越短,成绩越好。地鼠数量和地鼠停留时间随着难度升级减少。小游戏难度分为多级,达到一定分数之后,游戏难度升级。
硬件设备:
- UNIHIKER 行空板
- digital led model
软件清单:
代码下载:
代码描述:
导入行空板依赖库,主要使用unihiker绘制gui界面,显示地鼠,led传感器使用pinpong库,导入python相关random,datatime等,siot库将用户名和用户成绩上传到物联网上。
- from unihiker import GUI
- from pinpong.board import Board,Pin
- from pinpong.extension.unihiker import *
- import random
- import time
- import datetime
- import siot
复制代码
初始化游戏,定义开始地鼠数量、等待时间,初始化分数、开始时间。
- def init_game():
- num = 5
- waite_time = 1
- score = 0
- last_score = 0
- dishu = creat_dishu(num) #创建地鼠
- start_time = datetime.datetime.now()
- return num,waite_time,score,last_score,dishu,start_time
复制代码
定义打中地鼠函数,如果打中地鼠,分数加一,led灯点亮一次,行空板发出声音提示一次
- def on_click():
- global score
- score = score + 1
- led.write_digital(1)
- buzzer.pitch(147, 4) #播放音符
复制代码
定义创建地鼠函数,根据传入的地鼠数量创建地鼠,返回值是地鼠列表。gui.draw_image()方法显示地鼠。
- def creat_dishu(num):
- dishu = []
- for i in range(num):
- dishu.append(gui.draw_image(image="dishu.jpg",x=0,y=100,w=50,h=50,onclick=on_click))
- return dishu
复制代码
初始化mqtt传输协议,连接网络,准备发送消息。输入siot_dishu ,server ,port ,user ,password
- def init_mqtt():
- siot.init(client_id="siot_dishu",server="10.1.2.3",port=1883,user="xxx",password="xxx")
- siot.connect()
- siot.loop()
- siot.getsubscribe(topic="topic")
复制代码
主循环部分,每次循环要随机定义地鼠的位置,在随机位置显示地鼠,每次循环将led灯设置低电平熄灭。判断分数是否变化且达到升级分数,如果达到升级条件,则减少地鼠数量和等待时间。判断时间是否达到游戏结束条件,如果达到结束条件,将结束游戏,初始化游戏,将游戏用户名和成绩上传到物联网上。
- while True:
- for i in range(num):
- x = random.randint(0,190)
- y = random.randint(6,270)
- dishu[i].config(x=x,y=y)
-
- text_value.config(text=score)
- led.write_digital(0)
- if score%10 == 0 and is_score_chage(score,last_score):
- clear_dishu(dishu)
-
-
- waite_time = waite_time - 0.2
- print(waite_time)
-
- num = num-1
- if waite_time>0.2:
- tips = gui.draw_text(x=120,y=160,font_size=15,color=(255,0,0),text="难度升级!",origin="center")
- time.sleep(2)
- tips.remove()
-
- last_score = score
- dishu = creat_dishu(num)
- else:
- clear_dishu(dishu)
- end_time = datetime.datetime.now()
- last_time = (end_time - start_time).seconds
- siot.publish(topic="dishu/control", data=str(user_name)+" "+str((end_time - start_time).seconds))
- tips = gui.draw_text(x=120,y=150,font_size=15,color=(255,0,0),text="游戏结束!",origin="center")
- tips1 = gui.draw_text(x=120,y=170,font_size=15,color=(255,0,0),text="你的成绩:"+str(last_time)+"秒",origin="center")
-
- time.sleep(2)
- tips.remove()
- tips1.remove()
- num,waite_time,score,last_score,dishu,start_time = init_game() #初始化游戏
复制代码
siot.publish()上传的主题可以是未创建的主题,则新建主题。
结果展示:
游戏开始展示用户名,展示当前时间。
游戏开始,展示分数进程,每次游戏难度升级界面进行提示难度升级。游戏结束后显示游戏结束没当前用户成绩。
。
当地鼠被击中时,led灯亮起,地鼠变化位置后灯灭。
|