/JankenGUN

TechSeeker Hackathon 2024

Primary LanguageC

JankenGUN (ver 0.1 beta) by Yuri213212 at team "JankenGUN"
  Published at Techseeker Hackathon 2024

使用协议:对于所有文件遵循CC BY-NC-SA 4.0。
https://creativecommons.org/licenses/by-nc-sa/4.0/

此工程为本人在Techseeker Hackathon 2024参赛作品的担当部分,最终作品以队伍“JankenGUN”的名义提出,在大赛中获得了ProtoPedia奖。
工程分为两部分:LPC1114FN28单片机固件和在windows运行的客户端程序。

最终成果为一台有两个红外接收模块的专用游戏机(靶),通过有指向性的遥控器(队友担当的玩具枪)控制游玩,由上位机(执行客户端程序的电脑)与服务器(队友担当)通信控制游戏开始结束以及上传游戏结果,由服务器连接外部服务(kintone)统计分数并排名。
队友也用其他设备做了3个靶,但是未加入失败惩罚等功能导致规则相对简单,因此展示时本人负责的两个靶分数加倍。
由于展示时游戏规则是竞争50秒内的胜利次数(分数加倍的胜利视为胜利两次),平局与失败不扣分,于是产生以下最强攻略法:
 先瞄准本人负责的靶胜利两次,在等待第一个靶的胜利效果完成期间向队友负责的3个靶随机打石头剪子布,第一个靶恢复出拳时立即停止随机发射正常打本人负责的两个靶,如此循环。
  这样保证每个两分都能拿到手,该部分在手速无限快的情况下的理论最高分是100分;其余的随机打看运气,运气好也能得不少分。
本人在第二天展示开始前以此攻略法打出了68分的成绩,虽然失误有点多,但也超过第一天所有玩家的成绩。
 以此法游玩需要时刻移动胳膊、手指和上身,50秒游玩下来很消耗体力,或许可以通过连续游玩此游戏做运动减肥。

主要硬件(芯片):
·单片机LPC1114FN28/102
·基于FT234X的USB转UART通信模块
·使用I2C通信,基于SSD1306的OLED屏幕
·4半H桥电机驱动芯片SN754410
·基于PAM8403的功放模块

外设:
·两个OLED屏幕用来显示内部状态
·两个红外接收模块用来接收玩家的控制信号
·两个LED灯板用于实现闪光效果
·两个喇叭用于播放音效
·一个双联电位器用于控制音量
·三个按钮,其中两个用于手动控制开始与结束,另一个是(硬件)重启按钮

其他模块:
·作为游戏控制器的基于NEC格式遥控器的玩具枪(非本人负责)
·用于测试的NEC格式遥控器(理论上套个不透明且内部不反光的长筒也能当玩具枪用)
·用于执行网络通信的上位机(执行客户端程序的电脑)
·用于统计游戏分数结果以及利用外部api的服务器(非本人负责)

执行效果:
客户端连接单片机时会发送设置数据控制游戏的节奏(显示时间,黑屏时间与输了的罚时)。
客户端从服务器获得游戏的开始与结束状态,然后将对应的开始结束命令发送给单片机。
游戏进行时默认会在两个屏幕上随机显示“石头”“剪子”“布”的猜拳状态,持续出招一段时间后会黑屏一段时间然后随机变招再显示,两个屏幕的状态独立互不影响。
玩家需要瞄准屏幕对应的红外接收模块并打出猜拳状态,打中时判断猜拳结果,根据结果有不同音效,赢了得分且有闪光效果,平局和输有不同惩罚。
·如果赢了本轮立即结束,屏幕将变成圆圈持续黑屏时间,然后不黑屏立即出下一个招
·如果平局屏幕将变成三角,该行为仅仅拒绝本轮的变招重打,并不改变内在出招节奏,等到本轮结束时正常黑屏然后变招
·如果输了屏幕将变成叉,行为与平局类似但是叉的显示时间要加入额外的罚时
·其他情况(屏幕并非猜拳状态而是黑屏或判定结果)视为未打中,不影响默认行为
每当猜拳结果确定时会改变内部状态计数器,客户端会读取计数器并根据其变化将对应的结果发送给服务器,服务器会连接外部服务统计分数并排名。
 系统支持双倍得分,需要在客户端连接服务器前选择是否分数加倍,上传赢状态时会改变数据以达到分数加倍或不加倍的效果。

彩蛋:
·客户端拥有服务器和单片机部分的模拟功能,就算没有服务器和单片机也可以体验游戏的过程,只是缺少排名功能与音效(客户端的目的是实时收发数据,不该被模拟时才工作的音效影响其执行效率)
·单片机部分的执行不依赖上位机,不接电脑也可以直接接电源,按绿色按钮开始按红色按钮结束,这样只能以默认节奏游玩,且失去分数统计功能
 ·在展示过程中用了手动开始功能给玩家练习
·按住绿色按钮时重启单片机会进入测试模式用来调试硬件,测试模式中按红色按钮改变状态,按绿色按钮复位,其中显示猜拳时正常接收红外信号并判定
·如果没有特制玩具枪也可以用遥控器,两个红外模块将同时接收信号,游戏性质中的瞄准准确性将变为策略性,即如何出招能更高效地得分

链接:
·作品宣传页:https://protopedia.net/prototype/5304
·最终发表的演讲稿:https://docs.google.com/presentation/d/16ZVuTQFTg0eQA4KwGTpmx9URZNwMNwRzFgQZZT6nO9k/edit#slide=id.g2e96e1b2631_0_0
·队友的工程:https://github.com/ufoo68/jankenGUN

参考文献:
·Programming Windows Fifth Edition:https://www.cl72.org/100winProg/Charles%20Petzold%20-%20Programming%20Windows%20-%205th%20Ed.pdf