LED 轮盘游戏
组件和用品
| × | 9 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
视频:
概览
很长一段时间以来,我一直想创建一个简单而有趣的游戏,只需要一个人来玩。它非常简单,只需要一个 Arduino Nano 就可以运行它。它是 LED 轮盘赌。游戏的目标是停在绿色 LED 上,避开红色和黄色 LED。看起来很容易玩和制作,确实如此。
第一步
首先,我开始在 Fusion 360 中设计设备。我设计的前面板包含 9 个 LED、6 个红色、2 个黄色和 1 个绿色。我还在底部留出了一个轻触开关的空间。然后我使用我的 Millright CNC 路由器切割我设计的零件。
图> 图>
步骤 2
游戏机制是这样的:一盏灯会在两个边缘之间来回“移动”,只要按下按钮就会停止。为了让它立即做出反应,我使用了中断。每个 LED 对应于循环通过的数组中的一个索引。当前的 LED 索引也有自己的变量。每一步之间也有延迟,对应难度。在启动时,用户通过按下按钮来选择难度,以减少每次 LED 变化之间的延迟。正确的 LED 点亮后,用户可以双击锁定。
第 3 步
我用一些砂纸为胶合板增添了漂亮的光洁度和圆角。之后,我用热胶将这些碎片固定在一起。
结论
现在,每当我有心情玩一个简单的游戏时,无论是在路上还是只是为了远离屏幕,这款设备都能给我一个美妙的缓刑。我也可以通过让每个 LED 远离绿色一定数量的点数来实现多人游戏,让最后得到最少点数的人获胜。
代码
- 代码
代码C/C++
/*使用管脚2-10你可以在这里得到TTBOUNCE库:https://github.com/TOLDOTECHNIK/TTBOUNCE*/#includeint delay_time =0;const uint8_t led_array[9] ={ 4,3,5,6,7,8,9,10,11};const uint8_t 按钮 =2;uint8_t 难度 =0;uint8_t current_led =0;bool dir_flag =true; //true 向右,false 向左bool game_ended =false;bool is_win =false;bool is_finished_selecting =false;TTBOUNCE b =TTBOUNCE(button);void doubleClick(){ Serial.println("双击"); is_finished_selecting =true; delay_time =floor(500/(难度+1)); //公式:延迟(以毫秒为单位)=500 /(难度+ 1)Serial.println("难度:" + String(delay_time));扫描();}无效点击(){ Serial.print(“点击|”);数字写入(led_array [难度],低);难度++;如果(难度> 8){ 难度=0;数字写入(led_array [难度],高); Serial.println("难度为:"+String(难度));延迟(100);}无效设置(){ Serial.begin(9600); b.attachDoubleClick(doubleClick); b.attachClick(点击); b.setActiveLow(); b.enablePullup(); for(int i=0;i<9;i++){ pinMode(led_array[i], OUTPUT); } 扫();脉冲();难度 =0;数字写入(led_array [难度],高); while(!is_finished_selecting){ b.update();更新(); pinMode(按钮,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(button), button_pressed, FALLING); delay(1000);}void loop(){ if(game_ended==false){ move_led();延迟(延迟时间); } else if(game_ended){ Serial.println(game_ended); Serial.println("游戏结束"); if(is_win){ Serial.println("你赢了"); for(int i=0; i<5;i++){ 脉冲();延迟(100);扫();游戏结束 =假; is_win =假;延迟(2000); }}void move_led(){ digitalWrite(led_array[current_led], LOW);如果(current_led ==8){ dir_flag =false; current_led -=1; } else if(current_led ==0){ dir_flag =true; current_led +=1; } else if(dir_flag){ current_led +=1; } else if(!dir_flag){ current_led -=1; } digitalWrite(led_array[current_led], HIGH);}void pulse(){ for(int i=0; i<9;i++){ digitalWrite(led_array[i], HIGH); } 延迟(100); for(int i=0; i<9;i++){ digitalWrite(led_array[i], LOW); }}无效扫描(){ for(int i=0; i<9;i++){ digitalWrite(led_array[i], HIGH);延迟(50);数字写入(led_array[i],低); } for(int i=8; i>=0;i--){ digitalWrite(led_array[i], HIGH);延迟(50);数字写入(led_array[i],低); }}void button_pressed(){ Serial.println("按钮按下LED:"+String(current_led));游戏结束 =真; if(current_led==4){ is_win =true; } else if(current_led !=4){ is_win =false; } current_led =0;延迟(500);}
示意图
制造工艺