#include <MD_MAX72xx.h>
#include <LiquidCrystal_I2C.h>
#define MAX_DEVICES 2
const int maxX = MAX_DEVICES * 8 - 1;
const int maxY = 7;
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define VERT_PIN A0
#define HORZ_PIN A1
#define SEL_PIN 2
MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS_PIN, MAX_DEVICES);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int People[1][2]={
// x y
{3,4},
};
int arrayBlocks[8][2][4] = {
// x y
{{15,16,17,18},{0,0,0,0}},
{{15,16,17,18},{1,1,1,1}},
{{15,16,17,18},{2,2,2,2}},
{{15,16,17,18},{3,3,3,3}},
{{15,16,17,18},{4,4,4,4}},
{{15,16,17,18},{5,5,5,5}},
{{15,16,17,18},{6,6,6,6}},
{{15,16,17,18},{7,7,7,7}}
};
int line[2][8] = {
{2,2,2,2,2,2,2,2},
{0,1,2,3,4,5,6,7}
};
int Blocks[10][2][4];
int dy=0;
int scope = 0;
int speed = 1;
int step = 0; //Количество шагов до отрисовки след блока
int fix_step = 10; //Кол-во фиксированных шагов для сравнения, потом будет уменьшаться для
//усложнения игры
int bl = 0; //Номер отрисовываемого блока
int fsp = 1; //Чтоб fix_step нормально работал
void setup() {
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 1);
mx.clear();
pinMode(VERT_PIN, INPUT);
pinMode(HORZ_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
Serial.begin(9600);
randomSeed(analogRead(5));
}
void loop() {
mx.clear();
int rand = random(8);
int horz = analogRead(HORZ_PIN);
int vert = analogRead(VERT_PIN);
if (vert < 300) {
//R1(-1);
if(People[0][1] == 0){
People[0][1] = People[0][1];
}
else{
People[0][1] = People[0][1] - 1;
}
}
if (vert > 700) {
//R1(+1);
if(People[0][1] == 7){
People[0][1] = People[0][1];
}
else{
People[0][1] = People[0][1] + 1;
}
}
for(int i=0;i<1;i++){
int x=People[i][0];
int y=People[i][1];
mx.setPoint(y, x, true);
}
if(step >= fix_step){ //Если кол-во шагов равно фиксу, то отрисовывает следующий блок
for(int i = 0; i < 2; i++){
for(int j = 0; j < 4; j++){
Blocks[bl][i][j] = arrayBlocks[rand][i][j]; //Запись в отдельный массив рандомно выбранного блока
}
}
step = 0;
bl++;
if(bl == 10){
bl = 0;
}
}
for(int i = 0; i < 4; i++){ //Для перебора и перемещения блоков
for(int j = 0; j < 10; j++){
Blocks[j][0][i] = Blocks[j][0][i] - speed;
mx.setPoint(Blocks[j][1][i], Blocks[j][0][i], true);
}
}
for(int i = 0; i < 10; i++){ //+1 очко если коснется линии
for(int j = 0; j < 8; j++){
if(Blocks[i][0][3] == line[0][j] && Blocks[i][1][3] == line[1][j]){
scope++;
fsp = 1;
}
for(int k = 0; k < 4; k++){ //Столкновение
if(People[0][0] == Blocks[i][0][k] && People[0][1] == Blocks[i][1][k]){
Serial.println("Game over!");
lcd.setCursor(3,1);
lcd.print("Game over!");
delay(-1);
}
}
}
}
if ((scope == 5 || scope == 10 || scope == 20 || scope == 30 || scope == 50 //Уменьшение шагов до
|| scope == 70 || scope == 90 || scope == 100) && fsp == 1) { //появления новых блоков
/*
if ((scope == 50 || scope == 100) && fsp == 1){ //Увеличение шагов самих блоков
speed++;
} //Cильно усложняет процесс игры, и требует
*/ //Калибровки, поэтому тут только на усмотрение "играющего"
fix_step--;
fsp = 0; //Нужна, иначе оно просто fix_step уведет в ноль
}
Serial.println(fix_step);
Serial.println(step);
lcd.setCursor(0,0);
lcd.print("Scope:");
lcd.setCursor(6,0);
lcd.print(scope);
step++;
if(scope == 200){
lcd.setCursor(6,1);
lcd.print("WIN!");
delay(-1);
}
mx.update();
delay(170);
}