3.28 16*16 点阵模块贪吃蛇游戏
实验现象
可通过 4 个按键用点阵屏玩贪食蛇游戏,其中向右按键可做为游戏开始按键。
理论学习
实验内容
这里我们只提供8*8点阵的贪吃蛇程序,16*16的程序有兴趣的读者可以自行编写
实验代码
#include <Wire.h> //I2C链接库 #include "Adafruit_LEDBackpack.h" //点阵驱动库 #include "Adafruit_GFX.h" //Arduino图形库 Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); //设置I2C点阵型号 static uint8_t __attribute__ ((progmem)) z[]={B01111110,B00000010,B00000100,B00001000,B00010000,B00100000,B01000000,B01111110}; //小Z的logo代码,其实就是一个一个点的量灭组成的,可以自己写~ int speedS=8; //贪吃蛇的初始速度 int socre=0; //游戏起始得分 int FX,FY; //事物的坐标 int SX,SY; //蛇头的坐标 int KEY,K; //串口取得按键码和比对后的按键码,这里后面有说明 char s[6]; //蛇身体坐标集合,一共3个点,6个元素 void setup() { Serial.begin(9600); RANDOM(); //获取一个随机食物坐标 s[1]=0;s[2]=2;s[3]=1;s[4]=2;s[5]=2;s[6]=2; //初始化蛇的身体坐标 KEY=4; //初始化按键码,实际上就是行进方向,用1、2、3、4来代替4个正交方向 matrix.begin(0x70); //设定IIC屏幕地址 matrix.clear(); //屏幕清屏 matrix.writeDisplay(); //屏幕显示 matrix.setRotation(3); //设置屏幕显示方向 matrix.clear(); Logo(); //绘制开机Logo,哈哈其实就是小Z的logo,视频里看不清,自己玩下就懂了~ matrix.writeDisplay(); delay(1000); matrix.setTextWrap(false); //设置字体平滑模式 matrix.setTextSize(1); //设置字体大小 matrix.setTextColor(2); //设定LED颜色,这里说明下,除了双色点阵,其他都用2表示点亮LED,0表示熄灭~ for (int8_t x=7; x>=-59; x--) { matrix.clear(); matrix.setCursor(x,0); matrix.print("READY!!! GO"); matrix.writeDisplay(); delay(70); } //循环绘制文字,获得滚动效果 matrix.clear(); for(int i=1;i<=6;i+=2) { matrix.drawPixel(s[i], s[i+1], 2); } matrix.writeDisplay(); delay(400); } //循环绘制蛇的身体,实际上就是3个点咯~ void RANDOM() { FX=random(0, 7); FY=random(0, 7); } //随机食物获取函数 void Delay(int timeF) { for(int t=1;t<=timeF;t++) { matrix.drawPixel(FX, FY, 2); matrix.writeDisplay(); delay(50); matrix.drawPixel(FX, FY, 0); matrix.writeDisplay(); delay(50); } } //重点说一下,这个是演示函数,实际上通过不断闪现食物来完成延迟,这样既可以做到精确延时,也可以让食物不断闪动,来让大家不断的看到~ void Logo() { for (int x=1;x<=6;x++) { matrix.drawPixel(x, 0, 2); matrix.writeDisplay(); delay(35); } for (int x=1;x<=6;x++) { matrix.drawPixel(7-x, x, 2); matrix.writeDisplay(); delay(35); } for (int x=1;x<=6;x++) { matrix.drawPixel(x, 7, 2); matrix.writeDisplay(); delay(35); } for (int x=1;x<=45;x++) { matrix.clear(); matrix.writeDisplay(); delay(x); matrix.drawBitmap(0,0,z,8,8,2); matrix.writeDisplay(); delay(x); } } //Z Logo绘制函数,看不懂可以跳过~~~不过还是蛮简单的,仔细看下就明白了~ void gameover() { for (int8_t x=7; x>=-125; x--) { matrix.clear(); matrix.setCursor(x,0); matrix.print("GAME OVER YOUR SOCRE:"); matrix.writeDisplay(); delay(70); } //GameOver函数,显示游戏结束和得分 for (int8_t x=7; x>=-39; x--) { matrix.clear(); matrix.setCursor(x,0); matrix.print(socre); matrix.writeDisplay(); delay(70); } s[1]=0;s[2]=2;s[3]=1;s[4]=2;s[5]=2;s[6]=2;//重置蛇的坐标 } void loop() { if (Serial.available()){ K=Serial.read()-48;//获得串口发送的按键信息 if (K==1&&KEY!=2 ){ KEY=K; } if (K==2&&KEY!=1 ){ KEY=K; } if (K==3&&KEY!=4 ){ KEY=K; } if (K==4&&KEY!=3 ){ KEY=K; } } //重点,这里是在比对是否方向和目前蛇的行进方向相反,相反就放弃按键 while(Serial.read()>=0); //清空串口缓冲区 matrix.clear(); if(KEY==1){ s[1]=s[3];s[2]=s[4];s[3]=s[5];s[4]=s[6];s[6]=s[6]-1; } if(KEY==2){ s[1]=s[3];s[2]=s[4];s[3]=s[5];s[4]=s[6];s[6]=s[6]+1; } if(KEY==3){ s[1]=s[3];s[2]=s[4];s[3]=s[5];s[4]=s[6];s[5]=s[5]-1; } if(KEY==4){ s[1]=s[3];s[2]=s[4];s[3]=s[5];s[4]=s[6];s[5]=s[5]+1; } //根据按键来移动蛇的身体 for(int i=1;i<=6;i+=2) { matrix.drawPixel(s[i], s[i+1], 2); } matrix.writeDisplay(); Delay(speedS); SX=s[5];SY=s[6]; //获取蛇头的坐标 if(SY<0 or SY>7 or SX<0 or SX>7){ gameover(); } //判断是否超出边框,超出就跳转到GameOver if(SY==FY&&SX==FX){ socre=socre+1; RANDOM(); } //判断是否吃到了食物~吃到了就会加分和重新随机生成食物~ speedS=speedS-int(socre/3); //根据得分加快蛇的速度 }