//#include "HardwareSerial.h"
// HardwareSerial SlaveSerial(1);
#include "ansi.h"
ANSI ansi(&Serial);
const int Row = 10; //初始化行数
const int Col = 15; //初始化列数
int Pane[Row][Col][4]; //初始化数组Pane[Row][Row][0] = 灯ID;Pane[Row][Row][1] = 灯砖新颜色;Pane[Row][Row][2]灯砖当前颜色;Pane[Row][Row][3] = 蓝色砖块记录
int Pane_Row_Color[Row][2][4]; //记录行颜色 Pane_Row_Color[Row][2][4]; [Row] = 行数 ;[2] = 记录当前颜色和新颜色0=新颜色 1=当前颜色; [4] = 4个颜色0=黑1=红2=绿3=蓝
byte PaneTime = 1000; //设置运行时间1000m/s
unsigned long PaneTimeBefor; //记录上次运行的时间
int blueDelay(2300); //蓝色方块出现时间
unsigned long blueKeyTime; //蓝色方块时间记录
byte Black = 0; //定义颜色
byte Red = 1;
byte Green = 2;
byte Blue = 3;
byte RowRunId; //轮转行标记
byte ColRunId; //轮转列标记
// byte Bias; //轮转斜线标记
// byte RunKey = 1;
char RowMare[] =
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T'
}; // A=第一行;B=第二行;以此类推.
String GetSlaveVal = ""; //收到的字符串
int IntSlaveVal; //字符串转换后的整型数据
int Number = 0; //得分
void setup()
{
Serial.begin(115200); //初始化硬串口 TX = 43 RX= 44
// SlaveSerial.begin(115200, SERIAL_8N1, 38, 39); // SlaveSerial 接收RX=38 发送TX=39
PaneTimeBefor = millis(); //读取灯砖当前时间
blueKeyTime = millis(); //读取蓝色灯砖当前时间
WriteArray1(); //赋值灯砖ID数组
PrintArray(); //打印数组排列方式'N你''''''''''''''''''''''''''''''''''''''你
ColorKey(); //写入颜色编码
delay(1000); //等待
}
void loop()
{
GetSlave(); //从机回传的传感器数据
if ((millis() - blueKeyTime) > blueDelay) // blueDelay,执行随机蓝色方格程序
{
RandomBluePane(); //调用随机蓝色方格程序
blueKeyTime = millis(); //保存这次运行的时间
};
if ((millis() - PaneTimeBefor) > PaneTime) //指定时间运行
{
// level_1(); //第1关
// level_2(); //第2关
// level_3(); //第3关
// level_4(); //第4关
// level_5(); //第5关
// level_6(); //第7关
level_7(); //第6关
// BitWrite_Color(); //写入颜色
// Compare_Send(); //判断颜色是否改变发送改变颜色的行
// Print_BIN(); //调试打印颜色二进制码
Print_Pane_Color(); //调试打印方块颜色
PaneTimeBefor = millis(); //记录这次运行的时间
};
}
//
void RandomBluePane() //随机蓝色方块
{
for (int i = 0; i < Row; i++) //清空蓝色灯砖
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][3] = Black;
}
}
for (int i = 0; i < 3; i++) //随机出现4个蓝色方块
{
Pane[random(0, Row)][random(0, Col)][3] = Blue;
};
};
/***********第一关程序***********/
void level_1()
{
static byte RunKey; //静态变量轮转斜线标记[X+]
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
for (int j = 0; j < Col; j++) //红色轮转
{
Pane[RowRunId][j][1] = Red;
}
RowRunId += RunKey;
if (RowRunId == Row - 1) //达到最远返回第一行
{
RunKey = -1;
}
if (RowRunId == 0) //达到最远返回第一行
{
RunKey = 1;
}
for (int i = 0; i < Row; i++) //随机蓝色方块
{
for (int j = 0; j < Col; j++)
{
if (Pane[i][j][3] == Blue)
{
Pane[i][j][1] = Blue;
};
}
};
for (int i = 3; i < 7; i++) //绿色固定区域Y轴大小位置
{
for (int j = 3; j < 7; j++) //绿色固定区域X轴大小位置
{
Pane[i][j][1] = Green;
}
}
}
/***********第二关程序***********/
void level_2()
{
static byte Bias; //轮转斜线标记[X+]
static byte RunKey = 1;
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
{
for (int i = 0; i <= Bias; i++)
{
if (i < Row && (Bias - i) < Col)
{
Pane[i][Bias - i][1] = Red;
}
}
}
Bias += RunKey;
if (Bias == (Col + Row) - 2) //达到最远返回第一行
{
RunKey = -1;
}
if (Bias == 0) //达到最远返回第一行
{
RunKey = 1;
}
}
/***********第三关程序***********/
void level_3()
{
static byte SpaceVal = 4; //第三关的网格大小
static byte RunKey = 1;
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
for (int j = 0; j < Col; j++) //红色X轴轮转
{
int i = 0;
for (int i = 0; RowRunId + i < Row; i += SpaceVal)
{ //判断i是否小于等于零
Pane[RowRunId + i][j][1] = Red;
}
}
RowRunId += RunKey;
if (RowRunId == SpaceVal) //达到最远返回第一行
{
RowRunId = 0;
}
for (int i = 0; i < Row; i++) //红色Y轴轮转
{
for (int j = 0; ColRunId + j < Col; j += SpaceVal)
{ //判断i是否小于等于零
Pane[i][ColRunId + j][1] = Red;
}
}
ColRunId += RunKey;
if (ColRunId == SpaceVal) //达到最远返回第一行
{
ColRunId = 0;
}
}
/***********第四关程序***********/
void level_4()
{
static byte RunKey = 1;
for (int i = 0; i < Row; i++) //全部红色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Red;
}
}
for (int j = 0; j < Col; j += 2)
{
Pane[2][j][1] = Blue;
Pane[Row - 3][j][1] = Blue;
}
for (int i = (Row / 2); i > (Row / 2 - 2); i--) //绿色区域
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Green;
}
}
}
/***********第五关程序***********/
void level_5()
{
static byte RunKey = 1;
static byte RedSpace_Long = 6;
static byte RedSpace_Wide = 2;
static byte RunId = 0;
static int Upper_left[] = {0 + RedSpace_Wide - 1, 1}; //左上往下Row[0]>Row[Row-1]
static int Lower_left[] = {0 + RedSpace_Wide - 1, 0}; //左下往右Col[0]>Col[Col-1]
static int Lower_right[] = {Row - RedSpace_Wide, 0}; //右下往上
static int Upper_right[] = {Col - RedSpace_Wide, 0}; //右上往左
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
//左上开始//左上开始//左上开始//左上开始
if (Upper_left[1] == 1) //左上开始
{
for (int i = 0; i < RedSpace_Long; i++)
{
for (int j = 0; j < RedSpace_Wide; j++) //红色轮转
{
if ((Upper_left[0] - i) >= 0 && (Upper_left[0] - i) < Row)
{
Pane[Upper_left[0] - i][j][1] = Red;
}
}
}
if (Upper_left[0] <= Row + RedSpace_Long) //达到最远返回第一行
{
Serial.print(Upper_left[0]);
Upper_left[0] += RunKey;
}
if (Upper_left[0] >= Row) //达到最远返回第一行
{
Serial.print("RUN-1");
Lower_left[1] = 1; //左下开始
}
if (Upper_left[0] >= (Row + RedSpace_Long - RedSpace_Wide))
{
Upper_left[1] = 0;
Upper_left[0] = RedSpace_Wide - 1;
}
}
//左下开始//左下开始//左下开始//左下开始
if (Lower_left[1] == 1) //左下开始
{
for (int i = Row - 1; i >= (Row - RedSpace_Wide); i--)
{
for (int j = 0; j < RedSpace_Long; j++)
{
if ((Lower_left[0] - j) >= 0 && (Lower_left[0] - j) < Col)
{
Pane[i][Lower_left[0] - j][1] = Red;
}
}
}
if (Lower_left[0] <= (Col + RedSpace_Long)) //达到最远返回第一行
{
Lower_left[0] += RunKey;
Serial.print(Lower_left[0]);
}
if (Lower_left[0] >= Col) //达到最远返回第一行
{
Serial.print("RUN-2");
Lower_right[1] = 1; //右下开始
}
if (Lower_left[0] >= (Col + RedSpace_Long - RedSpace_Wide))
{
Lower_left[1] = 0;
Lower_left[0] = RedSpace_Wide - 1;
}
}
//右下开始//右下开始//右下开始//右下开始
if (Lower_right[1] == 1) //右下开始
{
for (int i = 0; i < RedSpace_Long; i++)
{
for (int j = Col - 1; j >= (Col - RedSpace_Wide); j--)
{
if ((Lower_right[0] + i) >= 0 && (Lower_right[0] + i) <= Row)
{
Serial.print(Lower_right[0]);
Pane[Lower_right[0] + i][j][1] = Red;
}
}
}
if (Lower_right[0] <= (Row + RedSpace_Long)) //达到最远返回第一行
{
Lower_right[0] -= RunKey;
}
if (Lower_right[0] < 0) //达到最远返回第一行
{
Serial.print("RUN-3");
Upper_right[1] = 1; //右上开始
}
if (Lower_right[0] <= (0 - RedSpace_Long + RedSpace_Wide - 1))
{
Lower_right[1] = 0;
Lower_right[0] = Row - RedSpace_Wide;
}
}
//右上开始//右上开始//右上开始//右上开始//右上开始//右上开始
if (Upper_right[1] == 1) //右上开始
{
for (int i = 0; i < RedSpace_Wide; i++)
{
for (int j = 0; j < RedSpace_Long; j++)
{
if ((Upper_right[0] + j) >= 0 && (Upper_right[0] + j) < Col)
{
Pane[i][Upper_right[0] + j][1] = Red;
}
}
}
if (Upper_right[0] <= (Col + RedSpace_Long)) //达到最远返回第一行
{
Upper_right[0] -= RunKey;
Serial.print(Upper_right[0]);
}
if (Upper_right[0] <= 0) //达到最远返回第一行
{
Serial.print("RUN-0");
Upper_left[1] = 1; //左上开始
}
if (Upper_right[0] <= (0 - RedSpace_Long + RedSpace_Wide))
{
Upper_right[1] = 0;
Upper_right[0] = Col - RedSpace_Wide;
}
}
}
/***********第六关程序***********/
void level_6()
{
static int Uppe = 0;
static int Lower = Row - 1;
static int Left = 0;
static int Right = Col - 1;
static int RunId = 1;
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
////////////////////////////////////////////
for (int j = 0; j < Col; j++) //上往下
{
Pane[Uppe][j][1] = Red;
}
Uppe += RunId;
if (Uppe >= Row - 1)
{
Uppe = 0;
}
////////////////////////////////////////////
for (int j = 0; j < Col; j++) //下往上
{
Pane[Lower][j][1] = Red;
}
Lower -= RunId;
if (Lower <= 0)
{
Lower = Row - 1;
}
////////////////////////////////////////////
for (int i = 0; i < Row; i++) //左往右
{
Pane[i][Left][1] = Red;
}
Left += RunId;
if (Left >= Col - 1)
{
Left = 0;
}
////////////////////////////////////////////
for (int i = 0; i < Row; i++) //右往左
{
Pane[i][Right][1] = Red;
}
Right -= RunId;
if (Right <= 0)
{
Right = Col - 1;
}
}
/***********第七关程序***********/
void level_7()
{
static int Uppe[] = {0, 0};
static int Lower[] = {Row - 1, 0};
static int Left[] = {0, 0};
static int Right[] = {Col - 1, 0};
static int RunId = 1;
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
////////////////////////////////////////////
for (int j = 0 + Uppe[1]; j < Col - Uppe[1]; j++) //上往下
{
Pane[Uppe[0]][j][1] = Red;
}
Uppe[1]++;
Uppe[0] += RunId;
if (Uppe[0] >= Row/2)
{
Uppe[0] = 0;
Uppe[1] = 0;
}
////////////////////////////////////////////
for (int j = 0 +Lower[1]; j < Col-Lower[1]; j++) //下往上
{
Pane[Lower[0]][j][1] = Red;
}
Lower[0] -= RunId;
Lower[1]++;
if (Lower[0] < Row/2)
{
Lower[0] = Row - 1;
Lower[1] = 0;
}
////////////////////////////////////////////
for (int i = 0+Left[1]; i < Row-Left[1]; i++) //左往右
{
Pane[i][Left[0]][1] = Red;
}
Left[0] += RunId;
Left[1]++;
if (Left[0] >= Col/2)
{
Left[1] = 0;
Left[0] = 0;
}
////////////////////////////////////////////
for (int i = 0+Right[1]; i < Row-Right[1]; i++) //右往左
{
Pane[i][Right[0]][1] = Red;
}
Right[1]++;
Right[0] -= RunId;
if (Right[0] <= Col/2)
{
Right[0] = Col - 1;
Right[1] = 0;
}
}
/*写入颜色数据*/
void BitWrite_Color()
{
for (int i = 0; i < Col; i++) //清空颜色
{
for (int j = 0; j < 4; j++)
{
Pane_Row_Color[i][0][j] = 0;
}
}
for (int i = 0; i < Col; i++)
{
for (int j = Row + 1; j >= 2; j--) //写入颜色亮灭状态,从22位Bit开始写入写到第2位停下.共写入20个数据
{
switch (Pane[i][j - 2][1])
{
case 1: //写入红色
bitWrite(Pane_Row_Color[i][0][0], j, 0);
bitWrite(Pane_Row_Color[i][0][1], j, 1);
bitWrite(Pane_Row_Color[i][0][2], j, 0);
bitWrite(Pane_Row_Color[i][0][3], j, 0);
break;
case 2: //写入绿色
bitWrite(Pane_Row_Color[i][0][0], j, 0);
bitWrite(Pane_Row_Color[i][0][1], j, 0);
bitWrite(Pane_Row_Color[i][0][2], j, 1);
bitWrite(Pane_Row_Color[i][0][3], j, 0);
break;
case 3: //写入蓝色
bitWrite(Pane_Row_Color[i][0][0], j, 0);
bitWrite(Pane_Row_Color[i][0][1], j, 0);
bitWrite(Pane_Row_Color[i][0][2], j, 0);
bitWrite(Pane_Row_Color[i][0][3], j, 1);
break;
default: //写入黑色
bitWrite(Pane_Row_Color[i][0][0], j, 1);
bitWrite(Pane_Row_Color[i][0][1], j, 0);
bitWrite(Pane_Row_Color[i][0][2], j, 0);
bitWrite(Pane_Row_Color[i][0][3], j, 0);
break;
};
};
};
for (int i = 0; i < Row; i++) //写入颜色编码
{
bitWrite(Pane_Row_Color[i][0][0], 0, 0); //黑色编码00
bitWrite(Pane_Row_Color[i][0][0], 1, 0);
bitWrite(Pane_Row_Color[i][0][1], 0, 1); //红色编码01
bitWrite(Pane_Row_Color[i][0][1], 1, 0);
bitWrite(Pane_Row_Color[i][0][2], 0, 0); //绿色编码10
bitWrite(Pane_Row_Color[i][0][2], 1, 1);
bitWrite(Pane_Row_Color[i][0][3], 0, 1); //蓝色编码11
bitWrite(Pane_Row_Color[i][0][3], 1, 1);
}
}
void Compare_Send() //比较有改变颜色的行的发送
{
for (int i = 0; i < Row; i++) //历遍每一行
{
for (int j = 0; j < 4; j++) //历遍颜色 跳过黑色0所以J从1开始
{
if (Pane_Row_Color[i][0][j] == Pane_Row_Color[i][1][j]) //比较新颜色和当前的是否一样
{
Pane_Row_Color[i][1][j] = Pane_Row_Color[i][0][j]; //把新颜色存在当前颜色变量里
}
else
{
Serial.print(RowMare[i]); //发送行标
Serial.print(Pane_Row_Color[i][0][j]); //发送颜色数据
Serial.print(","); // 发送终止符
Pane_Row_Color[i][1][j] = Pane_Row_Color[i][0][j]; //把新颜色存在当前颜色变量里
}
}
}
Serial.println();
// Serial.println("---------------------------");
}
void GetSlave() //从机回传的传感器数据
{
while (Serial.available())
{
GetSlaveVal = GetSlaveVal + char(Serial.read());
delay(2);
}
if (GetSlaveVal.length() > 0)
{
IntSlaveVal = GetSlaveVal.toInt();
Trigger(); //判断触发
// Serial.print(IntSlaveVal);
GetSlaveVal = ""; //数据清零
}
}
void Trigger() //触发灯砖反馈
{
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
if (Pane[i][j][0] == IntSlaveVal)
{
if (Pane[i][j][1] == Red)
{
// Serial.print("red");
TriggerRed();
break;
}
else if (Pane[i][j][1] == Blue)
{
// Serial.print("blue");
TriggerBlue(i, j);
break;
}
}
}
}
}
void TriggerRed() //触发红色灯灯砖
{
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Red;
}
}
// BitWrite_Color();//写入颜色数据
// Compare_Send();//比较有改变颜色的行的发送
Print_Pane_Color(); //调试打印方块颜色码
delay(500);
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][1] = Black;
}
}
// BitWrite_Color();//写入颜色数据
// Compare_Send();//比较有改变颜色的行的发送
Print_Pane_Color(); //调试打印方块颜色码
delay(500);
}
void TriggerBlue(int r, int c) //触发蓝色色灯灯砖
{
Pane[r][c][3] = Black;
// BitWrite_Color();//写入颜色数据
// Compare_Send();//比较有改变颜色的行的发送
Serial.print("Pane:");
Serial.print(Pane[r][c][0]);
Serial.println(" = Off");
Number = Number + 1;
Serial.print("Number = ");
Serial.print(Number);
}
void Print_BIN() //调试打印颜色二进制码
{
for (int i = 0; i < Row; i++)
{
Serial.println();
Serial.print("color ");
Serial.print(i);
Serial.print(" = ");
Serial.println(Pane_Row_Color[0][0][i], BIN);
}
Serial.println("------------------------------------------");
}
void Print_Pane_Color() //调试打印方块颜色码
{
ansi.cursorBack(10);
Serial.println();
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
if (Pane[i][j][1] == 1)
{
ansi.background(ANSI::red);
Serial.print(Pane[i][j][1]);
Serial.print(" ");
}
if (Pane[i][j][1] == 2)
{
ansi.background(ANSI::green);
Serial.print(Pane[i][j][1]);
Serial.print(" ");
}
if (Pane[i][j][1] == 3)
{
ansi.background(ANSI::blue);
Serial.print(Pane[i][j][1]);
Serial.print(" ");
}
if (Pane[i][j][1] == 0)
{
ansi.background(ANSI::black);
Serial.print(Pane[i][j][1]);
Serial.print(" ");
}
ansi.normal();
}
Serial.println();
// ansi.cursorBack(1);
}
// Serial.println("------------------------------------------");
}
void ColorKey() //初始化写入颜色编码
{
for (int i = 0; i < Row; i++) //清空颜色
{
for (int j = 0; j < 4; j++)
{
Pane_Row_Color[i][1][j] = 0;
}
}
for (int i = 0; i < Row; i++) //写入颜色编码
{
bitWrite(Pane_Row_Color[i][1][0], 0, 0); //黑色编码00
bitWrite(Pane_Row_Color[i][1][0], 1, 0);
bitWrite(Pane_Row_Color[i][1][1], 0, 1); //红色编码01
bitWrite(Pane_Row_Color[i][1][1], 1, 0);
bitWrite(Pane_Row_Color[i][1][2], 0, 0); //绿色编码10
bitWrite(Pane_Row_Color[i][1][2], 1, 1);
bitWrite(Pane_Row_Color[i][1][3], 0, 1); //蓝色编码11
bitWrite(Pane_Row_Color[i][1][3], 1, 1);
}
}
void WriteArray1() //初始化赋值灯砖ID数组 1,2,3
{
int k = 0;
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
Pane[i][j][0] = k;
k++;
};
};
}
void WriteArray2() //初始化赋值灯砖ID数组 0,3,6
{
int k = 0;
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
Pane[j][i][0] = k;
k++;
};
};
}
void WriteArray3() //初始化赋值灯砖ID数组 6,7,8
{
int k = 0;
for (int i = Col - 1; i >= 0; i--)
{
for (int j = 0; j < Row; j++)
{
Pane[i][j][0] = k;
k++;
};
};
}
void WriteArray4() //初始化赋值灯砖ID数组 8,7,6
{
int k = 0;
for (int i = Col - 1; i >= 0; i--)
{
for (int j = Col - 1; j >= 0; j--)
{
Pane[i][j][0] = k;
k++;
};
};
}
void WriteArray5() //初始化赋值灯砖ID数组 2,1,0
{
int k = 0;
for (int i = 0; i < Row; i++)
{
for (int j = Col - 1; j >= 0; j--)
{
Pane[i][j][0] = k;
k++;
};
};
}
void PrintArray()
{
Serial.println();
for (int i = 0; i < Row; i++)
{
for (int j = 0; j < Col; j++)
{
Serial.print(Pane[i][j][0]);
Serial.print(",");
};
Serial.println();
};
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15