You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Play/play5/zmeya.ino

431 lines
30 KiB

void begin1()
{
myGLCD.setFont(Ubuntubold);
myFiles.load(0, 0, 800, 480, "play/21.raw" , 32, 0);
delay(5000);
//myGLCD.fillScr(67,200,81);
myFiles.load(0, 0, 800, 480, "play/20.raw" , 32, 0);
nTail = 3; // Назначаем количество элементов в змейке 3.
del = 600; // Присваиваем переменной значение задержки 200 мс.
yz = random(5, 11); // Начальное положение Y-координаты.
xz = random(5, 11); // Начальное положение X-координаты.
Choice = random(1, 4); // Начальное направление движения.
//
for (int i = 0; i <= nTail - 1; i++) // Формируем змейку из трех элементов в зависимости от направления движения. Присваиваем координаты каждому элементу змейке.
{ //
Tail[i] = yz; // Присваиваем Y-координату элементу массива.
Tail[i] = Tail[i] << 8; // Сдвигаем побитно на 8.
Tail[i] += xz; // Присваиваем X-координату элементу массива.
switch (Choice) // В зависимости от направления движения формируем хвост в противоположную сторону.
{ //
case 1: // Движение вверх.
xz++; // Формируем хвост змейки вниз.
break; //
case 2: // Движение вниз.
xz--; // Формируем хвост змейки вверх.
break; //
case 3: // Движение влево.
yz++; // Формируем хвост змейки вправо.
break; //
case 4: // Движение вправо.
yz--; // Формируем хвост змейки влево.
break; //
} //
} //
myGLCD.setColor(VGA_BLUE);
if (grad == 0) myGLCD.drawBitmap (highByte(Tail[nTail - 1])*Xk, lowByte(Tail[nTail - 1])*Xk, 30, 30, zmeygol); //
// myGLCD.fillRect(highByte(Tail[nTail-1])*Xk, lowByte(Tail[nTail-1])*Xk, highByte(Tail[nTail-1])*Xk+Xk, lowByte(Tail[nTail-1])*Xk+Xk);//
for (int i = 0; i <= nTail - 2; i++) {
myGLCD.setColor(VGA_RED);
if (grad == 0) myGLCD.drawBitmap (highByte(Tail[i])*Xk, lowByte(Tail[i])*Xk, 30, 30, zmeygol); //
// myGLCD.fillRect(highByte(Tail[i])*Xk, lowByte(Tail[i])*Xk, highByte(Tail[i])*Xk+Xk, lowByte(Tail[i])*Xk+Xk);
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.setColor(VGA_WHITE);
myGLCD.printNumI(nTail - 3, 580, 389);
}
//
CoreY = random(2, 14); // Задаем Y-координату положения квадратика.
CoreX = random(2, 14); // Задаем X-координату положения квадратика.
myGLCD.setColor(VGA_YELLOW);
// myGLCD.fillRect (CoreY*Xk, CoreX*Xk, CoreY*Xk + Xk, CoreX*Xk + Xk); // Выводим квадратик
myGLCD.drawBitmap (CoreY * Xk, CoreX * Xk, 30, 30, apple);
yz = highByte(Tail[0]); // Y-координату первого элемента массива присваиваем начальной Y-координате движения.
xz = lowByte(Tail[0]);
}
void zmeyka() {
begin1();
while (1)
{
Keys();
SpeedControl() ;
Keys();
myGLCD.setColor(VGA_WHITE); //
myGLCD.drawRect (0, 0, 480, 479); // Обновляем каждый шаг рамку игрового поля.
myGLCD.drawRect (1, 1, 479, 478); // Обновляем каждый шаг рамку игрового поля.
myGLCD.drawRect (2, 2, 478, 477); // Обновляем каждый шаг рамку игрового поля.
myGLCD.setColor(VGA_YELLOW);
// myGLCD.fillRect (CoreY*Xk, CoreX*Xk, CoreY*Xk + Xk, CoreX*Xk + Xk); // Обновляем каждый шаг квадратик.
myGLCD.drawBitmap (CoreY * Xk, CoreX * Xk, 30, 30, apple);
//
EndY = highByte(Tail[nTail - 1]); // Запоминаем Y-координаты последнего элемента массива.
EndX = lowByte(Tail[nTail - 1]); // Запоминаем Y-координаты последнего элемента массива.
Keys();
MoveControl();
//
int PrevSY = highByte(Tail[0]); // Дополнительная переменная для переноса Y-координаты массива.
int PrevSX = lowByte(Tail[0]); // Дополнительная переменная для переноса X-координаты массива.
int Prev2SX, Prev2SY; // Вторые дополнительные переменные для переноса координат массива.
Tail[0] = yz; // Присваиваем новую Y-координату первому элементу массива.
Tail[0] = Tail[0] << 8; // Сдвигаем побитно на 8.
Tail[0] += xz; // Присваиваем новую X-координату первому элементу массива.
for (int i = 1; i <= nTail - 1; i++) // Переносим каждый элемент массива по очереди с помощью цикла.
{ //
Prev2SY = highByte(Tail[i]); // Присваиваем второй дополнительное переменной Y-координату массива.
Prev2SX = lowByte(Tail[i]); // Присваиваем второй дополнительное переменной X-координату массива.
Tail[i] = PrevSY; // Присваиваем новому элементу массива старую Y-координату предыдущего элемента массива.
Tail[i] = Tail[i] << 8; // Сдвигаем побитно на 8.
Tail[i] += PrevSX; // Присваиваем новому элементу массива старую X-координату предыдущего элемента массива.
PrevSY = Prev2SY; // Присваиваем дополнительным переменным с Y-координатой вторые дополнительные переменные с Y-координатой.
PrevSX = Prev2SX; // Присваиваем дополнительным переменным с X-координатой вторые дополнительные переменные с X-координатой.
}
//31 на 14
if (xz > 15 || xz < 0 || yz > 15 || yz < 0) { // Проверка выхода змейки за пределы игрового поля. Если координат движения больше, чем игровое поле, то игра заканчивается.
GameOver(); // Функция завершения игры.
ShowSnake();
begin1();
}
myGLCD.setColor(VGA_BLUE);
// myGLCD.fillRect(highByte(Tail[0])*Xk, lowByte(Tail[0])*Xk, highByte(Tail[0])*Xk+Xk, lowByte(Tail[0])*Xk+Xk);
if (grad == 0) myGLCD.drawBitmap (highByte(Tail[0])*Xk, lowByte(Tail[0])*Xk, 30, 30, zmeygol); //
if (grad == 1) myGLCD.drawBitmap (highByte(Tail[0])*Xk, lowByte(Tail[0])*Xk, 30, 30, zmeygol1); //
if (grad == 2) myGLCD.drawBitmap (highByte(Tail[0])*Xk, lowByte(Tail[0])*Xk, 30, 30, zmeygol2); //
if (grad == 3) myGLCD.drawBitmap (highByte(Tail[0])*Xk, lowByte(Tail[0])*Xk, 30, 30, zmeygol3); //
for (int i = 1; i <= nTail - 1; i++) { // Выводим змейку на экран.
myGLCD.setColor(VGA_RED);
// myGLCD.fillRect(highByte(Tail[i])*Xk, lowByte(Tail[i])*Xk, highByte(Tail[i])*Xk + Xk, lowByte(Tail[i])*Xk + Xk);
myGLCD.drawBitmap (highByte(Tail[i])*Xk, lowByte(Tail[i])*Xk, 30, 30, zmeytelo);
}
//
myGLCD.setColor(67, 200, 81);
myGLCD.fillRect (EndY * Xk, EndX * Xk, EndY * Xk + Xk, EndX * Xk + Xk); // Очищаем последний элемент змейки.
// myOLED.update();
Keys();
if (xz == CoreX && yz == CoreY) // Сравниваем координаты змейки с координатами квадратика.
{
myGLCD.setColor(250, 250, 250);
// myGLCD.fillRect(CoreY*Xk, CoreX*Xk, CoreY*Xk + Xk, CoreX*Xk + Xk); // Если они совпадают, очищаем старый квадратик.
CoreY = random(2, 14); // Задаем новую Y-координату квадратика.
CoreX = random(2, 14); // Задаем новую X-координату квадратика.
nTail++; // Увеличиваем количество элементов в змейке на один.
myGLCD.setBackColor(67, 200, 81);
myGLCD.setColor(VGA_WHITE);
myGLCD.printNumI(nTail - 3, 580, 389);
} //
// Функция вывода всей змейки на экран после проигрыша.
//
for (int i = 1; i < nTail - 1; i++) { // Проверки столкновения головы змейки с хвостом.
if (yz == highByte(Tail[i]) && xz == lowByte(Tail[i])) { // С помощью цикла проверяем каждый элемент массива с координатами движения. Если они совпадают, то голова столкнулась с хвостом.
GameOver(); // Функция завершения игры.
ShowSnake();
begin1();
}
}
}
}
//***************************************************************************************************************************
// Функция регулировки скорости.
void SpeedControl() //
{ //
delay (del); // Регулируем скорость змейки. Первая скорость - задержка 200 мс.
if (nTail == 5) {
del = 400; // Вторая скорость. Задержка 100 мс. Количество элементов змейки = 5.
}
if (nTail == 10) {
del = 350; // Третья скорость. Задержка 50 мс. Количество элементов змейки = 10.
}
if (nTail == 15) {
del = 250; // Четвертая скорость. Задержки нет. Количество элементов змейки = 15.
}
if (nTail == 20) {
del = 100;
}
}
void MoveControl() //
{ //
// **КНОПКИ ЦВЕТ*****************************
myGLCD.setColor(100, 100, 250);
myGLCD.drawLine(503, 29, 503 + 60, 29);
myGLCD.drawLine(503, 30, 503 + 60, 30);
myGLCD.drawLine(503, 239, 503 + 60, 239);
myGLCD.drawLine(503, 240, 503 + 60, 240);
myGLCD.drawLine(610, 132, 610 + 60, 132);
myGLCD.drawLine(610, 133, 610 + 60, 133);
myGLCD.drawLine(610, 344, 610 + 60, 344);
myGLCD.drawLine(610, 345, 610 + 60, 345);
myGLCD.drawLine(713, 239, 713 + 60, 239);
myGLCD.drawLine(713, 240, 713 + 60, 240);
//***************************************************
switch (Choice) //
{
case 3: //влево // Движение влево.
grad = 0;
if (valBtnT == 1)
{ valBtnT = 0;
Choice = 2;
} //верх Проверяем данные по оси Y. Поворот вверх.
if (valBtnD == 1)
{ valBtnD = 0;
Choice = 1;
}
// if (sensor.axisX >= -2 && sensor.axisY <= MIN_VALUE){Choice = 2;} // Проверяем данные по оси Y. Поворот вниз.
yz++;
// Координаты формирования змейки при движении влево. Уменьшаем координату Y на количество пройденных квадратиков.
break; //
//
case 4: // право
grad = 2;
if (valBtnD == 1)
{ valBtnD = 0;
Choice = 1;
}//низ Движение вправо
if (valBtnT == 1)
{ valBtnT = 0;
Choice = 2;
}
// if (sensor.axisX <= 2 && sensor.axisY >= MAX_VALUE){Choice = 1;} // Проверяем данные по оси Y. Поворот вверх.
// if (sensor.axisX <= 2 && sensor.axisY <= MIN_VALUE){Choice = 2;} // Проверяем данные по оси Y. Поворот вниз.
yz--; // Координаты формирования змейки при движении влево. Увеличиваем координату Y на количество пройденных квадратиков.
break; //
//
case 2: //низ
grad = 3;
if (valBtnR == 1)
{ valBtnR = 0;
Choice = 3;
}
if (valBtnL == 1)
{ valBtnL = 0;
Choice = 4;
}// Движение вниз.
// if (sensor.axisY >= -2 && sensor.axisX >= MAX_VALUE){Choice = 4;} // Проверяем данные по оси X. Поворот вправо.
// if (sensor.axisY >= -2 && sensor.axisX <= MIN_VALUE){Choice = 3;} // Проверяем данные по оси X. Поворот влево.
xz--; // Координаты формирования змейки при движении влево. Увеличиваем координату X на количество пройденных квадратиков.
break; //
//
case 1: //верх
grad = 1;
if (valBtnL == 1)
{ valBtnL = 0;
Choice = 4;
}// Движение вверх.
if (valBtnR == 1)
{ valBtnR = 0;
Choice = 3;
}
//if (sensor.axisY <= 2 && sensor.axisX >= MAX_VALUE){Choice = 4;} // Проверяем данные по оси X. Поворот вправо.
// if (sensor.axisY <= 2 && sensor.axisX <= MIN_VALUE){Choice = 3;} // Проверяем данные по оси X. Поворот влево.
xz++; // Координаты формирования змейки при движении влево. Уменьшаем координату X на количество пройденных квадратиков.
break; //
} //
}
void ShowSnake() //завершающее шоу //
{ nTail = nTail - 3; //
ycor = 6; // Присваиваем дополнительное координате значение 6. С 6 Y-координаты строим змейку столбцами по 5 элементов.
for (int k = 1; k <= 100; k++) // Цикл вывода змейки на экран.
{ //
if (nTail > 5) // Сравниваем количество элементов с 5. Столбцы формируемые снизу вверх. Нечетные столбцы.
{ // Если больше 5.
aTail = 5; // Присваиваем дополнительной переменной значение 5.
for (int i = 56; i >= 56 - aTail * 4; i = i - 5) // Цикл формирования и вывода змейки по координатам, начиная с X = 56 до X = 36 с шагом 5.
{ myGLCD.setColor(VGA_RED);
myGLCD.drawBitmap (ycor * 7, i * 7, 30, 30, apple);
// myGLCD.drawRect (ycor*7, i*7, (ycor+3)*7, (i+3)*7); // Вывод змейки квадратами начиная с координат Y = 6, X = 56, Y = 9, X = 59 до координат Y = 6, X = 36 Y = 9, X = 39. Значения Y-координаты указаны для первого столбца.
delay(200); // Задержка 200 мс.
} //
nTail = nTail - 5; // Вычитаем из количества элементов в змейке 5. Для определения количества выводимых столбцов.
} //
else // Если меньше 5.
{ //
aTail = nTail; // Присваиваем оставшееся количество элементов дополнительной переменной.
for (int i = 56; i >= 56 - aTail * 4; i = i - 5) // Цикл формирования и вывода змейки по координатам с шагом 5, начиная с X = 56 до X-координаты соответствующая значению количества оставшихся элементов змейки.
{ myGLCD.setColor(VGA_YELLOW); //
myGLCD.drawBitmap (ycor * 7, i * 7, 30, 30, apple); //
// Вывод змейки квадратами начиная с координат Y = 6, X = 56, Y = 9, X = 59 до координат Y = 6, X = 36 Y = 9, X = 39. Значения Y-координаты указаны для первого столбца.
delay(200); // Задержка 200 мс.
} //
delay (1000);
for (int i = 0; i < 10; i++)
{ Keys();
delay (1000);
}
return zmeyka();
} //
if (nTail > 5) // Сравниваем количество элементов с 5. Столбцы формируемые сверху вниз. Четные столбцы.
{ // Если больше 5.
aTail = 5; // Присваиваем дополнительной переменной значение 5.
for (int i = 36; i <= 36 + aTail * 4; i = i + 5) // Цикл формирования и вывода змейки по координатам, начиная с X = 36 до X = 56 с шагом 5.
{ myGLCD.setColor(VGA_YELLOW); //
//
myGLCD.drawBitmap ((ycor + 5) * 7, i * 7, 30, 30, apple); // // Вывод змейки квадратами начиная с координат Y = 11, X = 36, Y = 14, X = 39 до координат Y = 11, X = 56 Y = 14, X = 59. Значения Y-координаты указаны для первого столбца.
delay(200); // Задержка 200 мс.
} //
nTail = nTail - 5; // Вычитаем из количества элементов в змейке 5. Для определения количества выводимых столбцов.
} //
else // Если меньше 5.
{ //
aTail = nTail; // Присваиваем оставшееся количество элементов дополнительной переменной.
for (int i = 36; i <= 36 + aTail * 4; i = i + 5) // Цикл формирования и вывода змейки по координатам с шагом 5, начиная с X = 36 до X-координаты соответствующая значению количества оставшихся элементов змейки.
{ myGLCD.setColor(VGA_RED);
myGLCD.drawBitmap ((ycor + 5) * 7, i * 7, 30, 30, apple); //
// myGLCD.drawRect (ycor+5, i, ycor+8, i+3); // Вывод змейки квадратами начиная с координат Y = 11, X = 36, Y = 14, X = 39 до координат Y = 11, X = 56 Y = 14, X = 59. Значения Y-координаты указаны для первого столбца.
delay(200); // Задержка 200 мс.
}
for (int i = 0; i < 10; i++)
{ Keys();
delay (1000);
}
return zmeyka(); // Возвращаемся в функцию Setup().
} //
ycor = ycor + 10; // Увеличиваем дополнительную Y-координату на значение 10. Строим новый ряд столбцов.
} //
}
// Функция завершения игры.
void GameOver() //
{ //
myGLCD.setColor(67, 200, 81);
myGLCD.fillRect (2, 2, 479, 479); // Чистим экран.
myGLCD.setBackColor(VGA_TRANSPARENT);
myGLCD.setColor(VGA_WHITE); // Указываем шрифт который требуется использовать для вывода цифр и текста.
myGLCD.print("GAME OVER", 200, 100); // Выводим текст по центру 25 строки.
// myGLCD.print("SCORE - ", CENTER, 150); // Выводим текст 25 столбца 20 строки.
myGLCD.printNumI(nTail - 3, 580, 389); // Выводим переменную 95 столбца 40 строки.
// Разрешаем автоматический вывод данных.
}
void Keys()
{
but();
//*********** T O U C H ********************
if (myTouch.dataAvailable())
{
myTouch.read();
xt = myTouch.getX();
yt = myTouch.getY();
// Serial.print("xt=");
// Serial.println(xt);
// Serial.print("yt=");
// Serial.println(yt);
if ((xt >= 490) && (xt <= 550)) // Upper row
{
if ((yt >= 5) && (yt <= 50)) // Button: 1
{
valBtnPause = 1;
myGLCD.setColor(VGA_WHITE);
myGLCD.drawLine(503, 29, 503 + 60, 29);
myGLCD.drawLine(503, 30, 503 + 60, 30);
//myGLCD.drawLine(480, 45,480+60, 45);
}
if ((yt >= 220) && (yt <= 255)) // Button: 1
{
valBtnL = 1; //LEFT
myGLCD.setColor(VGA_WHITE);
myGLCD.drawLine(503, 239, 503 + 60, 239);
myGLCD.drawLine(503, 240, 503 + 60, 240);
}
}
if ((xt >= 560) && (xt <= 640)) // Upper row
{
if ((yt >= 110) && (yt <= 140)) // Button: 1
{
valBtnT = 1; //UP
myGLCD.setColor(VGA_WHITE);
myGLCD.drawLine(610, 132, 610 + 60, 132);
myGLCD.drawLine(610, 133, 610 + 60, 133);
}
if ((yt >= 320) && (yt <= 358)) // Button: 1
{
valBtnD = 1; //DOWN
myGLCD.setColor(VGA_WHITE);
myGLCD.drawLine(610, 344, 610 + 60, 344);
myGLCD.drawLine(610, 345, 610 + 60, 345);
}
}
if ((xt >= 700) && (xt <= 780)) // Upper row
{
if ((yt >= 220) && (yt <= 255)) // Button: 1
{
valBtnR = 1; //RIGHT
myGLCD.setColor(VGA_WHITE);
myGLCD.drawLine(713, 239, 713 + 60, 239);
myGLCD.drawLine(713, 240, 713 + 60, 240);
}
}
if ((xt >= 750) && (xt <= 790)) // Upper row
{
if ((yt >= 10) && (yt <= 60)) // Button: 1
{
exit_menu = 1; //ВЫХОД
}
}
}
if (valBtnPause == 1)
{ valBtnPause = 0;
myGLCD.setColor(VGA_RED);
// myGLCD.setBackColor (98,65,32);
myGLCD.setBackColor(VGA_TRANSPARENT);
// myGLCD.setColor(98,65,32);
myGLCD.print("P A U S E", 140, 100);
delay(3000);
while (1)
{ //delay(500);
but();
if (myTouch.dataAvailable())
{
myTouch.read();
xt = myTouch.getX();
yt = myTouch.getY();
valBtnT = 1;
}
if (valBtnL || valBtnR || valBtnT || valBtnD)
{ valBtnPause = 0;
myGLCD.setColor(67, 200, 81);
// myGLCD.print(" ",(MaxX*razmer/2)+SmeX-110,158);
myGLCD.print("P A U S E", 140, 100);
// myGLCD.setColor(VGA_BLUE);
// myGLCD.drawLine(480,29,480+60, 29);
// myGLCD.drawLine(480,30,480+60, 30);
delay(100);
break;
}
}
}
if (exit_menu == 1)
{ exit_menu = 0;
loop();
}
}