Игры на 20x4

i14a
Offline
Зарегистрирован: 13.03.2016

Вот решил для начала запилить простенькую игру. Используется текстовый дисплей 20x4 с I2C и китайский IR приемник с пультом. При желании скетч нетрудно переделать под прямое подключение дисплея и физические кнопки, но это лишние провода

Если интересно то есть идеи еще нескольких игр.

Вот скетч, за код сильно не пинайте, программирование только начинаю

#include "IRremote.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif
LiquidCrystal_I2C lcd(0x27,20,4); 
IRrecv irrecv(3); 
decode_results results;

byte customS[8][8] = {                          //Кстомные символы человека, ключа и окружения
  {0x1f,0x1f,0x1f,0x1f,0x7,0x3,0x3,0x1},
  {0x1f,0x1f,0x1e,0x1c,0x18,0x18,0x10,0x10},
  {0x1,0x3,0x7,0x1f,0x1f,0x1f,0x1f,0x1f},
  {0x10,0x10,0x18,0x18,0x1c,0x1f,0x1f,0x1f},
  {0x1f,0x1f,0x7,0x3,0x1,0x1,0x0,0x0},
  {0x0,0xc,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f},
  {0x1f,0x1f,0xf,0xf,0x7,0x7,0x7,0x7},
  {0x6,0x6,0x14,0x1f,0x4,0xa,0xa,0x1b}
  };

int pos = 2; //начальная позиция экрана
int x = 1;    //Начальное положение человека
int y = 9;
bool key = 0;  //Изначально ключ не найден
unsigned long a = 0;


//карта
byte list [48][20] = {
{1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 3, 6, 2, 3, 6, 1, 1, 1, 2, 1},
{1, 1, 3, 0, 0, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0},
{1, 0, 0, 0, 7, 4, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 4, 1},
{3, 0, 8, 1, 1, 1, 0, 4, 1, 5, 4, 1, 1, 1, 5, 7, 4, 1, 1, 1},
{3, 0, 6, 1, 1, 1, 0, 8, 1, 3, 6, 1, 1, 1, 1, 1, 3, 6, 2, 1},
{5, 0, 0, 8, 1, 3, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 0, 0, 0, 2},
{1, 0, 0, 4, 1, 5, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0},
{1, 5, 4, 1, 1, 1, 5, 4, 1, 1, 5, 4, 1, 5, 0, 0, 8, 1, 1, 1},
{3, 2, 1, 1, 1, 3, 6, 1, 3, 6, 2, 1, 1, 3, 0, 0, 6, 1, 1, 1},
{5, 0, 0, 6, 3, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 8, 1},
{1, 0, 0, 0, 0, 0, 0, 4, 7, 0, 0, 0, 8, 1, 7, 0, 0, 0, 0, 8},
{1, 5, 0, 4, 5, 7, 4, 1, 1, 5, 0, 0, 8, 1, 1, 1, 4, 5, 0, 4},
{1, 3, 0, 1, 1, 3, 2, 3, 6, 1, 0, 0, 6, 1, 3, 2, 1, 1, 0, 1},
{3, 0, 0, 8, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 3, 0, 8},
{5, 0, 0, 0, 0, 0, 4, 7, 0, 4, 7, 0, 0, 4, 5, 0, 0, 0, 0, 4},
{1, 7, 7, 4, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 5, 4, 1, 1},
{1, 1, 3, 6, 8, 1, 1, 3, 0, 6, 3, 6, 2, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 6, 2, 3, 2},
{3, 0, 7, 0, 0, 0, 0, 8, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{5, 0, 1, 1, 7, 4, 1, 1, 1, 1, 1, 1, 5, 0, 7, 4, 1, 5, 7, 4},
{3, 0, 8, 1, 1, 1, 3, 6, 2, 1, 1, 1, 3, 0, 8, 1, 3, 2, 1, 1},
{5, 0, 0, 2, 3, 0, 0, 0, 0, 0, 6, 3, 0, 0, 4, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0},
{1, 5, 7, 4, 1, 1, 1, 1, 1, 5, 4, 1, 7, 4, 1, 5, 4, 1, 1, 5},
{3, 2, 1, 3, 6, 2, 1, 1, 1, 3, 6, 3, 6, 2, 1, 3, 2, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 1},
{5, 7, 0, 0, 0, 0, 8, 1, 5, 0, 0, 4, 5, 7, 4, 5, 0, 0, 0, 2},
{1, 1, 7, 4, 5, 0, 4, 1, 1, 0, 0, 8, 1, 1, 1, 1, 5, 7, 0, 8},
{1, 3, 6, 1, 3, 0, 6, 2, 3, 0, 0, 6, 2, 1, 1, 1, 1, 1, 0, 2},
{3, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 1, 3, 0, 8},
{0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 1, 5, 0, 4},
{5, 7, 4, 1, 3, 0, 4, 5, 0, 7, 4, 5, 7, 0, 1, 1, 1, 1, 7, 1},
{1, 3, 6, 2, 1, 0, 1, 1, 0, 1, 1, 1, 3, 0, 8, 1, 3, 6, 2, 1},
{3, 0, 0, 0, 6, 0, 2, 3, 0, 6, 1, 1, 5, 0, 2, 3, 0, 0, 0, 8},
{5, 0, 7, 0, 0, 0, 4, 5, 0, 0, 2, 1, 1, 0, 0, 0, 0, 7, 0, 4},
{3, 0, 1, 5, 7, 4, 1, 1, 5, 0, 8, 1, 1, 5, 4, 5, 0, 6, 1, 1},
{1, 0, 1, 3, 6, 2, 1, 1, 3, 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1},
{3, 0, 2, 0, 0, 0, 0, 8, 3, 0, 2, 3, 6, 2, 3, 8, 0, 3, 0, 2},
{5, 0, 0, 0, 0, 7, 0, 2, 5, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 8},
{1, 5, 7, 4, 1, 1, 0, 4, 1, 5, 7, 7, 4, 5, 0, 3, 0, 2, 0, 4},
{1, 3, 6, 2, 1, 1, 0, 2, 1, 3, 6, 2, 1, 1, 0, 5, 0, 8, 0, 2},
{3, 0, 0, 0, 6, 1, 0, 8, 3, 0, 0, 0, 2, 3, 0, 8, 0, 4, 0, 4},
{0, 0, 7, 0, 0, 8, 0, 4, 5, 0, 0, 0, 4, 5, 0, 2, 0, 3, 0, 2},
{1, 1, 1, 5, 0, 4, 0, 1, 1, 0, 7, 4, 1, 1, 0, 4, 7, 5, 0, 4},
{1, 1, 1, 3, 0, 1, 0, 2, 3, 0, 6, 2, 1, 3, 0, 6, 2, 1, 0, 2},
{1, 3, 0, 0, 0, 3, 0, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8},
{0, 0, 0, 7, 4, 5, 0, 4, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 4},
{7, 7, 4, 1, 1, 1, 7, 1, 1, 5, 7, 7, 7, 4, 1, 1, 5, 7, 4, 1}
};
 
//Анимация при выигрыше
void youWin(){
    lcd.clear();
    lcd.home();
    lcd.setCursor(5, 1);
    lcd.print ("YOU WIN!!!");
 do  {
  lcd.setCursor(0,3);
  lcd.print("Press OK to restart!");
  delay(500);
  lcd.setCursor(0,3);
  lcd.print("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20");
  delay(500);
 }while (!irrecv.decode(&results) && (results.value != 16712445));
    
}


//Очистка символа
void clearSym(){
    lcd.setCursor(x%20, y%4);
    lcd.print("\x20");
}


//генерируем карту
void createMap(){
    pos = (abs(x/20)*6+abs(y/4));
    lcd.clear();
    int i = pos*4;
    while (i < pos*4+4) {
        int j = 0;
        while (j < 20){
          if (list[i][j] == 1){
           lcd.setCursor(j, i%4);
           lcd.print("\xFF");
          }
            else if (list[i][j] > 1){
                lcd.setCursor(j, i%4);
                lcd.printByte(list[i+24*abs(j/20)][j%20]-2);      
            }
            j = j + 1;
            
        }
        i = i + 1;
    }
    if (pos == 9 && key == 1){
        list[37][19] = 0;
        lcd.setCursor(19, 1);
        lcd.print("\x84");
        lcd.home();
    }
    if (pos == 5 && key == 0){
        lcd.setCursor(15,2);
        lcd.print("\x8D");
      }
}

void setup()
{
lcd.init();                     
lcd.backlight();
Serial.begin(9600); 
irrecv.enableIRIn(); 
for (int i = 0 ; i <8; i++)
{
  lcd.createChar(i, customS[i]); //генерируем кастомные символы
  
}

//Начальная заставка
lcd.home();
lcd.print("\xFF");
lcd.print("\xFF");
lcd.printByte(1);
lcd.printByte(4);
lcd.printByte(0);
lcd.print("\xFF");
lcd.printByte(1);
lcd.printByte(0);
lcd.print("\xFF");
lcd.print("\xFF");
lcd.print("\xFF");
lcd.printByte(1);
lcd.printByte(4);
lcd.print("\xFF");
lcd.printByte(1);
lcd.printByte(4);
lcd.printByte(0);
lcd.print("\xFF");
lcd.print("\xFF");
lcd.print("\xFF");
lcd.setCursor(0,1);
lcd.print("\xFF\xFF\x8D  LABIRINTH   \x8D\xFF\xFF");
lcd.setCursor(0,2);
lcd.print("\xFF");
lcd.print("\xFF");
lcd.print("\xFF");
lcd.print("\xFF");
lcd.printByte(5);
lcd.printByte(5);
lcd.print("\xFF");
lcd.print("\xFF");
lcd.printByte(3);
lcd.printByte(5);
lcd.printByte(2);
lcd.print("\xFF");
lcd.print("\xFF");
lcd.print("\xFF");
lcd.printByte(3);
lcd.printByte(5);
lcd.printByte(5);
lcd.printByte(2);
lcd.print("\xFF");
lcd.print("\xFF");

do {
  lcd.setCursor(1,3);
  lcd.print("Press OK to start!");
  delay(500);
  lcd.setCursor(1,3);
  lcd.print("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20");
  delay(500);
  } while (!irrecv.decode(&results) && results.value != 16712445);
createMap();
lcd.setCursor(x%20, y%4);
lcd.printByte(7);
}
 
void loop() {

delay(100);
if (irrecv.decode(&results)) 
{   clearSym();
    if (results.value == 16736925) //Кнопка вверх, на вашем пульте значение будет другим
    { 
     if (list[y+24*abs(x/20)-1][x%20] == 0)
     {
     y = y - 1; 
     }
     }
    if (results.value == 16754775) //Вниз
    {
      if (list[y+24*abs(x/20)+1][x%20] == 0)
     {
     y = y + 1;
     }
    }
    if (results.value == 16761405) //Вправо
    {
      if (list[y+24*abs((x+1)/20)][(x+1)%20] == 0)
      {
     x = x + 1;
     }
     }
     if (results.value == 16720605) //Влево
     {
      if (list[y+24*abs((x-1)/20)][(x-1)%20] == 0)
      {
     x = x - 1;
      }
     } 
     if ((abs(x/20)*6+abs(y/4)) != pos) //Если вышли за экран генерим заново карту
     {
      createMap();
      }
     lcd.setCursor(x%20, y%4);
     lcd.printByte(7);
    Serial.println(results.value, HEX);  //Показания пульта пишем в консоль
    irrecv.resume(); 
    
}
if (x==39 && y==13)
    {
      youWin();
     x = 1;
     y = 9;
     }
if (x==15 && y==22){
  key = 1;
  }
}

 

 

Вот что в итоге получилось (видео):  https://www.youtube.com/watch?v=IgUM1GdHf7s

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Классно, много труда по составлению карт!