Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Смотрел видео, в котором демонстрировалось устройство с одной кнопкой. С её помощью можно было запускать несколько программ. Среди них была программа "Flappy Bird". Я решил повторить на своём экране с другими размерами, который лежал у меня под рукой.
Подключал на макетной плате. Подключение экрана есть в статье. Также добавил обычную кнопку на вывод 7. Код немного поправил, но ещё требует доработки.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// software SPI:
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 12
#define OLED_RESET 8
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const unsigned char PROGMEM ptica[] = {
0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x7A, 0x84, 0x7A, 0x84, 0x84, 0xA4, 0x84, 0x84, 0x82, 0x7C,
0x7E, 0x1F, 0x20, 0x1F, 0x18, 0x20, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM star[] = {
0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0xF0, 0x3C, 0x00, 0x3C, 0x00, 0xFF, 0x00, 0x7F, 0xFF,
0x7F, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00
};
int pushButton = 7;
int razmak = 32;
float zidx[3];
int prazan[3];
int score = 0;
int pres = 0;
float birdY = 20;
int smjer = 0;
int game = 0;
int fx = 12;
unsigned long trenutno = 0;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT_PULLUP);
for (int i = 0; i < 2; i++)
{
zidx[i] = 128 + ((i + 1) * razmak);
{
prazan[i] = random(4, 20);
}
}
display.begin(SSD1306_SWITCHCAPVCC);
display.display();
display.clearDisplay();
display.setFont();
display.setTextSize(0);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("bird");
display.display();
delay(500);
}
void loop()
{
display.clearDisplay();
if (game == 0)
{
display.setCursor(2, 2);
display.print("flappy");
display.setCursor(2, 12);
display.print("bird");
display.drawBitmap(20, 30, ptica, 16, 16, 1);
if (digitalRead(pushButton) == 0)
{
if (pres == 0)
{
game = 1;
pres = 1;
}
} else {
pres = 0;
}
}
if (game == 1)
{
display.setCursor(2, 2);
display.print(score);
if (digitalRead(pushButton) == 0)
{
if (pres == 0)
{
trenutno = millis();
smjer = 1;
pres = 1;
}
} else {
pres = 0;
}
if (smjer == 0)
birdY = birdY + 0.5;
else
birdY = birdY - 1;
if ((trenutno + 185) < millis())
smjer = 0;
for (int j = 0; j < 2; j++) {
display.fillRect(zidx[j], 0, 6, 127, 1);
display.fillRect(zidx[j], prazan[j], 6, 28, 0); //razmak predzadnji
}
for (int j = 0; j < 2; j++)
{
zidx[j] = zidx[j] - 0.5;
if (zidx[j] < -7) {
score = score + 1;
prazan[j] = random(4, 20);
zidx[j] = 64;
}
}
display.drawBitmap(12, birdY, ptica, 16, 16, 1);
display.drawRect(0, 0, 128, 64, 1);
if (birdY > 38 || birdY < -4 ) {
game = 0;
birdY = 20;
score = 0;
delay(1000);
for (int i = 0; i < 2; i++)
{
zidx[i] = 64 + ((i + 1) * razmak);
{
prazan[i] = random(4, 20);
}
}
}
for (int m = 0; m < 4; m++)
if (zidx[m] <= fx + 7 && fx + 7 <= zidx[m] + 6)
{
if (birdY < prazan[m] || birdY + 8 > prazan[m] + 28) {
game = 0;
birdY = 20;
score = 0;
delay(1000);
for (int i = 0; i < 2; i++)
{
zidx[i] = 64 + ((i + 1) * razmak);
{
prazan[i] = random(4, 20);
}
}
}
}
}
display.display();
}