Игры на 20x4
- Войдите на сайт для отправки комментариев
Вс, 13/03/2016 - 18:02
Вот решил для начала запилить простенькую игру. Используется текстовый дисплей 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
Классно, много труда по составлению карт!