亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

MAX72XX LED 矩阵显示小行星游戏

组件和用品

Arduino Mega 2560
× 1
Maxim Integrated MAXREFDES99# MAX7219 显示驱动屏蔽
× 1
SparkFun 按钮开关 12mm
× 2
蜂鸣器
× 1
面包板(通用)
× 1

关于这个项目

这是一个简单的游戏,使用 MAX72XX LED 矩阵作为显示器,两个微动开关作为按钮和一个用于音效的有源蜂鸣器。

你是一艘星际飞船,你必须避免与坠落的小行星接触。随着时间的推移,游戏变得越来越快。最后,会显示一个分数,显示您存活了多长时间。

代码

  • 小行星游戏代码
小行星游戏代码Arduino
/**************************************************** ********** * 这是一个使用 MAX72XX LED 矩阵的简单游戏。 * 你是一艘星际飞船,你必须避免接触 * 坠落的小行星。 * * (c) 约书亚·韦斯纳 (Joshua Weßner) 于 2018 年 * * * **************************************** *****************////Eberhard Fahle 的 LedControl// 见:http://wayoda.github.io/LedControl/#include "LedControl.h"/* 现在我们需要一个 LedControl 来使用。 ***** 这些引脚编号可能不适用于您的硬件 ***** 引脚 12 连接到 DataIn 引脚 11 连接到 CLK 引脚 10 连接到 LOAD 我们只有一个 MAX72XX。 */LedControl lc=LedControl(12,11,10,1);/************************************* ***************************** * 全局变量 */ /* 显示更新之间的延迟 */unsigned long delaytime=1000; /* 显示分数 */String scoreString;int score;int百位;String scoreStr;String scoreArr[] ={"" ,"" ,"" };/* 控制微动开关 */int pinLeft =2;int pinRight =3;易失性无符号长 buttonPressed;int buttonDelay =150; //处理接触bouncevolatile bool gameOver =false;/* 游戏的“节奏”,im 毫秒 */int tick;int tickCounter =1;/* 时间戳 */unsigned long now;/* display */int ship; /* 初始船舶位置 */int columns[] ={0,0,0,0,0,0,0,0}; // 8 列,每个 int 是第 1-8 行。int randomInt;/********************************* ***************************** * setup */void setup() { /* 初始化 */ gameOver =false;数百 =0; scoreArr[0] =""; scoreArr[1] =""; scoreArr[2] ="";分数 =0;滴答 =300;滴答计数器 =1;船 =3;现在 =毫秒();按钮按下 =毫秒();随机种子(模拟读取(15)); // 更好的随机数 for(int i =0; i<8; i++) columns[i] =0; // 调试 // Serial.begin(9600); // Serial.print(columns[0]); /* MAX72XX 启动时处于省电模式,我们必须进行唤醒呼叫 */ lc.shutdown(0,false); /* 将亮度设置为中等值 */ lc.setIntensity(0,1); /* 并清除显示 */ lc.clearDisplay(0); pinMode(pinLeft,INPUT_PULLUP); pinMode(pinRight,INPUT_PULLUP); /* 附加按钮按下以中断 */ attachInterrupt(digitalPinToInterrupt(pinLeft), left, FALLING); attachInterrupt(digitalPinToInterrupt(pinRight),对,下降); }/**************************************************** ************** * 手柄左键按下 */void left(){ if(millis() - buttonPressed> buttonDelay) // 手柄开关触点弹跳 { if(ship !=0)船 -;否则船 =7; lc.clearDisplay(0);按钮按下 =毫秒(); } // 游戏结束后,按下按钮将重新开始游戏 if(gameOver ==true){ gameOver =false;设置(); }}/**************************************************** *************** * 手柄右键按下 */void right(){ if(millis() - buttonPressed> buttonDelay) // 手柄开关触点弹跳 { if(ship !=7 ) 船++;否则船 =0; lc.clearDisplay(0);按钮按下 =毫秒(); } // 游戏结束后,按下按钮将重新开始游戏 if(gameOver ==true){ gameOver =false;设置(); } /*************************************************** *************** * loop */void loop() { if(millis() - now> tick){ // 做每一个滴答 // 分数是:你存活了多少滴答得分++;现在 =毫秒(); if(tickCounter ==1){ //每4个tick //让游戏随着时间的推移变得更快tick =tick/1.02; // 随机选择列 randomInt =random(0, 8); // 如果列中不存在小行星,则在第 1 行创建一个。 if(columns[randomInt] ==0){ columns[randomInt] =1; } } if(tickCounter !=4) tickCounter++;否则滴答计数器 =1; // 对每一列都执行 for(int i =0; i<8; i++){ if(columns[i] ==10) // 当小行星不在显示列时删除列 [i] =0; if(columns[i] !=0) // 使小行星坠落 column[i]++; lc.clearDisplay(0); } /* 写入显示 */ // ship lc.setLed(0, 7, ship, true); // 小行星 for(int i =0; i<8; i++){ if(columns[i]> 0) lc.setLed(0, columns[i]-2, i, true); lc.setLed(0, columns[i]-3, i, true); } // 检测飞船与小行星的碰撞 if(columns[ship] ==10 or columns[ship] ==9){ lc.clearDisplay(0); // 动画爆炸 for(int i =0; i<4; i++){ lc.setLed(0,7,ship+i,true); lc.setLed(0,7,ship-i,true); lc.setLed(0,7-i,ship+i,true); lc.setLed(0,7-i,ship-i,true); lc.setLed(0,7-1.5*i,ship,true); // 爆炸声 unsigned long time =millis(); int randomSound=1000; while(millis() - time <=250) { randomSound--;音调(9,随机(随机声音,1000)); // 为不同的声音改变random()的参数 } lc.clearDisplay(0);无音(9); } 延迟(500); /* 显示分数 */ scoreStr =String(score); // 从 score 中获取个位数 int scoreArr[0] =scoreStr.charAt(0); scoreArr[1] =scoreStr.charAt(1); scoreArr[2] =scoreStr.charAt(2); // 矩阵最多只能显示 2 位(最多 99) if(score <100){ for(int i =0; i<2; i++){ if(scoreArr[i] =="0") draw0( 1+i*4); if(scoreArr[i] =="1") draw1(1+i*4); if(scoreArr[i] =="2") draw2(1+i*4); if(scoreArr[i] =="3") draw3(1+i*4); if(scoreArr[i] =="4") draw4(1+i*4); if(scoreArr[i] =="5") draw5(1+i*4); if(scoreArr[i] =="6") draw6(1+i*4); if(scoreArr[i] =="7") draw7(1+i*4); if(scoreArr[i] =="8") draw8(1+i*4); if(scoreArr[i] =="9") draw9(1+i*4); } } // 如果分数> 100,只显示分数的最后两位 else{ for(int i =1; i<3; i++){ if(scoreArr[i] =="0") draw0(1+( i-1)*4); if(scoreArr[i] =="1") draw1(1+(i-1)*4); if(scoreArr[i] =="2") draw2(1+(i-1)*4); if(scoreArr[i] =="3") draw3(1+(i-1)*4); if(scoreArr[i] =="4") draw4(1+(i-1)*4); if(scoreArr[i] =="5") draw5(1+(i-1)*4); if(scoreArr[i] =="6") draw6(1+(i-1)*4); if(scoreArr[i] =="7") draw7(1+(i-1)*4); if(scoreArr[i] =="8") draw8(1+(i-1)*4); if(scoreArr[i] =="9") draw9(1+(i-1)*4); } // 分数的第一个数字(“百”)显示为点:每百一个点。 for(int i =1; i<10; i++){ if(scoreArr[0] ==String(i)) 数百 =i; } for(int i =1; i <=数百; i++){ lc.setLed(0,0,i-1,true); lc.setLed(0,1,i-1,true);延迟(200); } } gameOver =true; while(gameOver ==true){ // 除了等待按钮按下之外什么都不做 } }////////////////////////// 绘制分数位数////////////////////////////////////////void draw1(int position){ lc.setColumn(0,0+position,B00001000); lc.setColumn(0,1+position,B00011111); }void draw2(int position){ lc.setColumn(0,0+position,B00010111); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00011101); }void draw3(int position){ lc.setColumn(0,0+position,B00010001); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00011111); }void draw4(int position){ lc.setColumn(0,0+position,B00011100); lc.setColumn(0,1+position,B00000100); lc.setColumn(0,2+position,B00011111); }void draw5(int position){ lc.setColumn(0,0+position,B00011101); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00010111); }void draw6(int position){ lc.setColumn(0,0+position,B00011111); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00010111); }void draw7(int position){ lc.setColumn(0,0+position,B00010000); lc.setColumn(0,1+position,B00010011); lc.setColumn(0,2+position,B00011100); }void draw8(int position){ lc.setColumn(0,0+position,B00011111); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00011111); }void draw9(int position){ lc.setColumn(0,0+position,B00011101); lc.setColumn(0,1+position,B00010101); lc.setColumn(0,2+position,B00011111); }void draw0(int position){ lc.setColumn(0,0+position,B00011111); lc.setColumn(0,1+position,B00010001); lc.setColumn(0,2+position,B00011111); }

示意图


制造工艺

  1. 国际象棋
  2. 弹球
  3. 足球
  4. Arduino Pong Game - OLED 显示器
  5. DIY 37 LED 轮盘游戏
  6. Arduino Pong Game on 24x16 Matrix with MAX7219
  7. 自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏
  8. 摇杆游戏
  9. LED Matrix + Motion Sensor Door Display [Arduino Holiday]
  10. 8x LED 声音照明
  11. Arduino Quadruped
  12. 热胶 LED 矩阵灯