Lillian 发表于 2022-12-6 17:44:11

行空板UNIHIKER实现打地鼠游戏

本帖最后由 Lillian 于 2022-12-14 10:23 编辑

项目背景:


打地鼠游戏是小朋友都非常喜欢的一个游戏,今天分享一个利用行空板实现打地鼠游戏。至逝去的童年。
游戏主要目标是在最短时间内得到指定的分数,打到一个地鼠得到1分,完成时间越短,成绩越好。地鼠数量和地鼠停留时间随着难度升级减少。小游戏难度分为多级,达到一定分数之后,游戏难度升级。

硬件设备:


[*]UNIHIKER 行空板
[*]digital led model



软件清单:


[*]mind+ python模式


代码下载:



代码描述:

导入行空板依赖库,主要使用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.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灯亮起,地鼠变化位置后灯灭。

















页: [1]
查看完整版本: 行空板UNIHIKER实现打地鼠游戏