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

自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏

组件和用品

Arduino Nano R3
× 1
SparkFun 按钮开关 12mm
× 4
Texas Instruments 移位寄存器-串行到并行
× 2
滑动开关
× 1
5 毫米 LED:黄色
× 128

必要的工具和机器

烙铁(通用)

应用和在线服务

Arduino IDE

关于这个项目

我用自制的 16x8 LED 矩阵、Arduino Nano 和两个 74hc595 移位寄存器构建了这个俄罗斯方块游戏。当您按下任何按钮时,我还添加了提示音。

代码

  • 代码
代码Arduino
/*作者:Jae Yeong Bae UBC ECE jocker.tistory.com 日期:2013 年 1 月 18 日文件:俄罗斯方块 v2Changelog:v2:在游戏结束时显示分数 目的:消磨时间..+ 为了好玩电路+引脚:Led 矩阵:2 74HC575 移位寄存器按顺序排列:绿色、蓝色、红色引脚:锁存器 =3 时钟 =2 数据 =4 行阳极 =5 到 13(8 引脚)在两个矩阵按钮之间共享(作为数字):A4 =左 A5 =下 A6 =右A7 =up(旋转)评论:这是我的第二个 Arduino 项目。代码可能混乱且效率低下。来自 Arduino 库和数据表的参考。*/unsigned char latchPin =3;unsigned char clockPin =2;unsigned char dataPin =4;unsigned char rowPin =5;long delays =0;short delay_ =500;long bdelay =0;short buttondelay =150;short btdowndelay =30;short btsidedelay =80;unsigned char blocktype;unsigned char blockrotation;int lines =0;boolean block[8][18]; // 2个额外的旋转布尔堆[8][16];boolean disp[8][16];boolean lib[10][5][7];void setup() {lib[0][1][0] =1;lib[0][2][0] =1;lib[0][3][0] =1;lib[0][0][1] =1;lib[0][4][ 1] =1;lib[0][3][2] =1;lib[0][0][2] =1;lib[0][4][2] =1;lib[0][2] ][3] =1;lib[0][0][3] =1;lib[0][4][3] =1;lib[0][1][4] =1;lib[0] [0][4] =1;lib[0][4][4] =1;lib[0][0][5] =1;lib[0][4][5] =1;lib[ 0][1][6] =1;lib[0][2][6] =1;lib[0][3][6] =1;lib[1][2][0] =1; lib[1][1][1] =1;lib[1][2][1] =1;lib[1][2][2] =1;lib[1][2][3] =1;lib[1][2][4] =1;lib[1][2][5] =1;lib[1][1][6] =1;lib[1][2][6] ] =1;lib[1][3][6] =1;lib[2][1][0] =1;lib[2][2][0] =1;lib[2][3] [0] =1;lib[2][0][1] =1;lib[2][4][1] =1;lib[2][4][2] =1;lib[2][ 3][3] =1;lib[2][2][4] =1;lib[2][1][5] =1;lib[2][0][6] =1;lib[2] ][1][6] =1;lib[2][2][6] =1;lib[2][3][6] =1;lib[2][4][6] =1;lib [3][0][0] =1;lib[3][1][0] =1;lib[3][2][0] =1;lib[3][3][0] =1;lib[3][4][0] =1;lib[3][3][1] =1;lib[3][2][2] =1;lib[3][3][3] =1;lib[3][4][4] =1;lib[3][0][5] =1;l ib[3][4][5] =1;lib[3][1][6] =1;lib[3][2][6] =1;lib[3][3][6] =1;lib[4][3][0] =1;lib[4][2][1] =1;lib[4][3][1] =1;lib[4][1][2] ] =1;lib[4][3][2] =1;lib[4][0][3] =1;lib[4][3][3] =1;lib[4][0] [4] =1;lib[4][1][4] =1;lib[4][2][4] =1;lib[4][3][4] =1;lib[4][ 4][4] =1;lib[4][3][5] =1;lib[4][3][6] =1;lib[5][0][0] =1;lib[5] ][1][0] =1;lib[5][2][0] =1;lib[5][3][0] =1;lib[5][4][0] =1;lib [5][0][1] =1;lib[5][0][2] =1;lib[5][1][2] =1;lib[5][2][2] =1;lib[5][3][2] =1;lib[5][4][3] =1;lib[5][4][4] =1;lib[5][0][5] =1;lib[5][4][5] =1;lib[5][1][6] =1;lib[5][2][6] =1;lib[5][3][ 6] =1;lib[6][2][0] =1;lib[6][3][0] =1;lib[6][1][1] =1;lib[6][0] ][2] =1;lib[6][0][3] =1;lib[6][1][3] =1;lib[6][2][3] =1;lib[6] [3][3] =1;lib[6][0][4] =1;lib[6][4][4] =1;lib[6][0][5] =1;lib[ 6][4][5] =1;lib[6][1][6] =1;lib[6][2][6] =1;lib[6][3][6] =1; lib[7][0][0] =1;lib[7][1][0] =1;lib[7][2][0] =1;lib[7][3][0] =1;lib[7][4][0] =1;lib[7][4][1] =1;lib[7][3][2] =1;lib[7][2][3] ] =1;lib[7][1][4] =1;lib[7][1][5] =1;lib[7][1][6] =1;lib[8][1][0] =1;lib[8][2][0] ] =1;lib[8][3][0] =1;lib[8][0][1] =1;lib[8][4][1] =1;lib[8][0] [2] =1;lib[8][4][2] =1;lib[8][1][3] =1;lib[8][2][3] =1;lib[8][ 3][3] =1;lib[8][0][4] =1;lib[8][4][4] =1;lib[8][0][5] =1;lib[8] ][4][5] =1;lib[8][1][6] =1;lib[8][2][6] =1;lib[8][3][6] =1;lib [9][1][0] =1;lib[9][2][0] =1;lib[9][3][0] =1;lib[9][0][1] =1;lib[9][4][1] =1;lib[9][0][2] =1;lib[9][4][2] =1;lib[9][1][3] =1;lib[9][2][3] =1;lib[9][3][3] =1;lib[9][4][3] =1;lib[9][4][ 4] =1;lib[9][3][5] =1;lib[9][1][6] =1;lib[9][2][6] =1; int 种子 =(analogRead(0)+1)* (analogRead(1)+1)* (analogRead(2)+1)* (analogRead(3)+1);随机种子(种子);随机(10,9610806);种子 =种子 *random(3336,15679912)+analogRead(random(4));随机种子(种子);随机(10,98046); cli();//停止中断//将timer0中断设置为2kHz TCCR1A =0;//将整个TCCR0A寄存器设置为0 TCCR1B =0;// TCCR0B相同 TCNT1 =0;//将计数器值初始化为0 //设置比较匹配寄存器的 2khz 增量 OCR1A =259;// =(16*10^6) / (2000*64) - 1 (must be <256) // 打开 CTC 模式 TCCR1A |=(1 <0;i--) { for (j=0;j<16;j++) { block[i][j]=block[i-1][j]; } } for (j=0;j<16;j++) { block[0][j]=0;更新LED();返回 1; } return 0;}int readBut(){ if (bdelay> millis()) { return 0; } if (analogRead(A4)> 500) { //left bdelay =millis() + btsidedelay;返回3; } if (analogRead(A5)> 500) { //down bdelay =millis() + btdowndelay;返回 4; } if (analogRead(A6)> 500) { //right bdelay =millis() + btsidedelay;返回2; } if (analogRead(A7)> 500) { //up bdelay =millis() + buttondelay;返回 1; } return 0;}void updateLED(){ int i;国际 j; for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =block[i][j] |桩[i][j]; } }}void rotate(){ //skip for square block(3) if (blocktype ==3) return;国际十一; int yi;国际我;国际 j; //检测左 for (i=7;i>=0;i--) { for (j=0;j<16;j++) { if (block[i][j]) { xi =i; } } } //检测 for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { yi =i; } } } if (blocktype ==0) { if (blockrotation ==0) { if (!space_left()) { if (space_right3()) { if (!moveright()) return; } xi++; }否则返回; } else if (!space_right()) { if (space_left3()) { if (!moveleft()) return; }如果 (!moveleft()) 返回; xi--; xi--; }否则返回; } else if (!space_right2()) { if (space_left2()) { if (!moveleft()) return; } xi--; }否则返回; } 块[xi][yi]=0;区块[xi][yi+2]=0;区块[xi][yi+3]=0;区块[xi-1][yi+1]=1;区块[xi+1][yi+1]=1;区块[xi+2][yi+1]=1;块旋转 =1; } else { 块[xi][yi]=0;区块[xi+2][yi]=0;区块[xi+3][yi]=0;区块[xi+1][yi-1]=1;区块[xi+1][yi+1]=1;区块[xi+1][yi+2]=1;块旋转 =0; } } //偏移到mid xi ++;一++; if (blocktype ==1) { if (blockrotation ==0) { block[xi-1][yi-1] =0;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi][yi-1] =1;块[xi+1][yi-1] =1;块[xi][yi+1] =1;块旋转 =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; } xi++; } xi--;块[xi][yi-1] =0;块[xi+1][yi-1] =0;块[xi][yi+1] =0;块[xi-1][yi] =1;块[xi+1][yi] =1;块[xi+1][yi+1] =1;块旋转 =2; } else if (blockrotation ==2) { yi --;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi+1][yi+1] =0;块[xi][yi-1] =1;块[xi][yi+1] =1;块[xi-1][yi+1] =1;块旋转 =3; } else { if (!space_right()) { if (!moveleft()) return; } xi--; } 块[xi][yi-1] =0;块[xi][yi+1] =0;块[xi-1][yi+1] =0;块[xi-1][yi-1] =1;块[xi-1][yi] =1;块[xi+1][yi] =1;块旋转 =0; } } if (blocktype ==2) { if (blockrotation ==0) { block[xi+1][yi-1] =0;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi][yi-1] =1;块[xi+1][yi+1] =1;块[xi][yi+1] =1;块旋转 =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; } xi++; } xi--;块[xi][yi-1] =0;块[xi+1][yi+1] =0;块[xi][yi+1] =0;块[xi-1][yi] =1;块[xi+1][yi] =1;块[xi-1][yi+1] =1;块旋转 =2; } else if (blockrotation ==2) { yi --;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi-1][yi+1] =0;块[xi][yi-1] =1;块[xi][yi+1] =1;块[xi-1][yi-1] =1;块旋转 =3; } else { if (!space_right()) { if (!moveleft()) return; } xi--; } 块[xi][yi-1] =0;块[xi][yi+1] =0;块[xi-1][yi-1] =0;块[xi+1][yi-1] =1;块[xi-1][yi] =1;块[xi+1][yi] =1;块旋转 =0; } } if (blocktype ==4) { if (blockrotation ==0) { block[xi+1][yi-1] =0;块[xi-1][yi] =0;块[xi+1][yi] =1;块[xi+1][yi+1] =1;块旋转 =1; } else { if (!space_left()) { if (!moveright()) 返回; xi++; } xi--;块[xi+1][yi] =0;块[xi+1][yi+1] =0;块[xi-1][yi] =1;块[xi+1][yi-1] =1;块旋转 =0; } } if (blocktype ==5) { if (blockrotation ==0) { block[xi][yi-1] =0;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi][yi-1] =1;块[xi+1][yi] =1;块[xi][yi+1] =1;块旋转 =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; } xi++; } xi--;块[xi][yi-1] =0;块[xi+1][yi] =0;块[xi][yi+1] =0;块[xi-1][yi] =1;块[xi+1][yi] =1;块[xi][yi+1] =1;块旋转 =2; } else if (blockrotation ==2) { yi --;块[xi-1][yi] =0;块[xi+1][yi] =0;块[xi][yi+1] =0;块[xi][yi-1] =1;块[xi-1][yi] =1;块[xi][yi+1] =1;块旋转 =3; } else { if (!space_right()) { if (!moveleft()) return; } xi--; } 块[xi][yi-1] =0;块[xi-1][yi] =0;块[xi][yi+1] =0;块[xi][yi-1] =1;块[xi-1][yi] =1;块[xi+1][yi] =1;块旋转 =0; } } if (blocktype ==6) { if (blockrotation ==0) { block[xi-1][yi-1] =0;块[xi][yi-1] =0;块[xi+1][yi-1] =1;块[xi][yi+1] =1;块旋转 =1; } else { if (!space_left()) { if (!moveright()) 返回; xi++; } xi--;块[xi+1][yi-1] =0;块[xi][yi+1] =0;块[xi-1][yi-1] =1;块[xi][yi-1] =1;块旋转 =0; } } //如果旋转使块和堆重叠,则向上推行 while (!check_overlap()) { for (i=0;i<18;i++) { for (j=0;j<8;j++) { block [j][i] =块[j][i+1];延迟 =毫秒()+ 延迟_;更新LED(); }void movedown(){ if (space_below()) { //向下移动 int i; for (i=15;i>=0;i--) { int j; for (j=0;j<8;j++) { block[j][i] =block[j][i-1]; } } for (i=0;i<7;i++) { block[i][0] =0; } } else { //合并和新块int i;国际 j; for (i=0;i<8;i++) { for(j=0;j<16;j++) { if (block[i][j]) { 堆[i][j]=1;块[i][j]=0; } } } newBlock();更新LED(); }boolean check_overlap(){ int i;国际 j; for (i=0;i<16;i++) { for (j=0;j<7;j++) { if (block[j][i]) { if (pile[j][i]) return false; } } } for (i=16;i<18;i++) { for (j=0;j<7;j++) { if (block[j][i]) { return false; } } } return true;}void check_gameover(){ int i;国际 j; int cnt=0;; for(i=15;i>=0;i--) { cnt=0; for (j=0;j<8;j++) { if (pile[j][i]) { cnt ++; } } if (cnt ==8) { 行++; for (j=0;j<8;j++) { 桩[j][i]=0;更新LED();延迟(50);国际 k; for(k=i;k>0;k--) { for (j=0;j<8;j++) { 桩[j][k] =桩[j][k-1]; } } for (j=0;j<8;j++) { 桩[j][0] =0;更新LED();延迟(50);我++; } } for(i=0;i<8;i++) { if (pile[i][0]) gameover(); } return;}void gameover(){ int i;国际 j; //关闭盲法 for (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=1; } else { disp[7-i][j]=1; } } 延迟(60); } //计算记分板 int num_lines; num_lines =2;布尔分数[8][17]; for (i=0;i<8;i++) { for (j=0;j<16;j++) { score[i][j] =0; } } int digit1 =(lines/10) % 10; int digit2 =(lines) % 10; for (i=0;i<5;i++) for (j=0;j<8;j++) { score[7-j][i+3] =lib[digit1][i][j]; } for (i=0;i<5;i++) for (j=0;j<8;j++) { score[7-j][i+9] =lib[digit2][i][j]; } for (i=0;i<16;i++) { score[0][i]=0; } //以分数开盲 for (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=score[我][j]; } else { disp[7-i][j]=score[7-i][j]; } } 延迟(60); } 延迟(100); while(true) { for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =score[i][j]; } } 布尔tmpline[8]; for (i=0;i<8;i++) { score[i][16]=score[i][0]; } for (i=0;i<8;i++) { for (j=0;j<16;j++) { score[i][j] =score[i][j+1]; } } 延迟(100); } }void newBlock(){ check_gameover();块类型 =随机(7); if (blocktype ==0) // 0 // 0 // 0 // 0 { block[3][0]=1;块[3][1]=1;块[3][2]=1;块[3][3]=1; } if (blocktype ==1) // 0 // 0 0 0 { block[2][0]=1;块[2][1]=1;块[3][1]=1;块[4][1]=1; } if (blocktype ==2) // 0 // 0 0 0 { block[4][0]=1;块[2][1]=1;块[3][1]=1;块[4][1]=1; } if (blocktype ==3) // 0 0 // 0 0 { block[3][0]=1;块[3][1]=1;块[4][0]=1;块[4][1]=1; } if (blocktype ==4) // 0 0 // 0 0 { block[4][0]=1;块[5][0]=1;块[3][1]=1;块[4][1]=1; } if (blocktype ==5) // 0 // 0 0 0 { block[4][0]=1;块[3][1]=1;块[4][1]=1;块[5][1]=1; } if (blocktype ==6) // 0 0 // 0 0 { block[3][0]=1;块[4][0]=1;块[4][1]=1;块[5][1]=1; } blockrotation =0;}boolean space_below(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (i ==15) return false; if (pile[j][i+1]) { return false; } } } } return true;}boolean space_left2(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1) 返回假;如果(桩 [j-1][i] | 桩 [j-2][i]){ 返回假; } } } } return true;}boolean space_left3(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1 ||j ==2 ) 返回假;如果(桩[j-1][i] | 桩[j-2][i]|桩[j-3][i]){返回假; } } } } return true;}boolean space_left(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0) return false;如果(桩 [j-1][i]){ 返回假; } } } } return true;}boolean space_right(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7) return false;如果(桩 [j+1][i]){ 返回假; } } } } return true;}boolean space_right3(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7||j ==6||j ==5) 返回假; if (pile[j+1][i] |pile[j+2][i] |pile[j+3][i]) { return false; } } } } return true;}boolean space_right2(){ int i;国际 j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7 || j ==6) 返回假; if (pile[j+1][i] |pile[j+2][i]) { return false; } } } } return true;}ISR(TIMER1_COMPA_vect){ //将timer1的0改为1,timer2改为2 LEDRefresh();}void LEDRefresh(){ int i;国际 k; //////////////////////////////////////////////////我焊错了引脚。 (12345670 而不是 01234567)。 // 所以这部分代码是为了软件更正这个问题。布尔 tmpdisp[8][16]; for (k=0;k<16;k++) { for(i=1;i<8;i++) { tmpdisp[i][k]=disp[i-1][k]; } tmpdisp[0][k]=disp[7][k]; } ////////////////////////////////////////////// 为我=0;i<8;i++) { int j; if (i ==0) j =rowPin+7;否则 j =rowPin+i-1;字节高 =0;国际b; for(b =0;b<8;b++) { 上<<=1;如果 (!tmpdisp[b][i]) 上 |=1; } 低字节 =0; for(b =0;b<8;b++) { 下<<=1;如果 (!tmpdisp[b][i+8]) 更低 |=1;数字写入(j,低);数字写入(闩锁销,低); shiftOut(dataPin,clockPin,LSBFIRST,下); shiftOut(dataPin, clockPin, LSBFIRST, upper);数字写入(闩锁销,高);数字写入(rowPin+i,HIGH);延迟(1); } digitalWrite(rowPin+7,LOW); }

示意图


制造工艺

  1. Arduino Gyroscope Game with MPU-6050
  2. Arduino 数字骰子
  3. 自制电视 B-Gone
  4. Arduino 游戏控制器
  5. Arduino Pong Game on 24x16 Matrix with MAX7219
  6. 像素追逐游戏
  7. 单 LED 矩阵 Arduino 翻转时钟
  8. NeoMatrix Arduino Pong
  9. 带有 Arduino Nano 的手持盖革计数器
  10. 带 WS2812 LED 灯条的 DIY Arduino 1D 乒乓球游戏
  11. LED 轮盘游戏
  12. 切勿独自骑行