Professional Documents
Culture Documents
Проект-тетрис Во Ардуино (Стефан Станоевски IV-6)
Проект-тетрис Во Ардуино (Стефан Станоевски IV-6)
МИКРОКОНТРОЛЕРИ
ТЕМА:
ТЕТРИС ВО АРДУИНО
Ментор: Изработил:
Андреја Митески Стефан Станоевски IV-6
Вовед
Тетрис играта на Arduino Uno со 128x64 i2c OLED екран и копчиња е едноставен, но и
интересен проект за почетници. Дијаграмот за склопување на играта Tetris на Arduino Uno
со екран е максимално поедноставен, така што секој почетник може да го повтори. Овде
вклучивме дијаграм за поврзување на екранот со микроконтролерот Arduino, како и
програма за креирање на играта Тетрис на SSD1306 128x64 OLED дисплејот.
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#define right 5
#define change 3
#define down 4
};
};
};
};
const char pieces_T[4][2][4] = {{ {0, 0, 1, 0}, {0, 1, 1, 2} },
};
};
short piece[2][4];
boolean grid[10][18];
void checkLines() {
boolean full;
for (short y = 17; y >= 0; y--) {
full = true;
delay(100);
noTone(BUZZER);
grid[x][0] = 0;
display.invertDisplay(true);
delay(50);
display.invertDisplay(false);
score += 10;
void refresh() {
display.clearDisplay();
drawLayout();
drawGrid();
display.display();
}
void drawGrid() {
if (grid[x][y])
return true;
return false;
boolean nextCollision() {
if (y > 17 || grid[x][y])
return true;
return false;
void generate() {
currentType = nextType;
nextType = random(TYPES);
if (currentType != 5)
pieceX = random(9);
else
pieceX = random(7);
pieceY = 0;
rotation = 0;
void drawNextPiece() {
short nPiece[2][4];
switch (type) {
case 0: //L_l
piece[0][i] = pieces_L_l[rotation][0][i];
piece[1][i] = pieces_L_l[rotation][1][i];
break;
case 1: //S_l
piece[0][i] = pieces_S_l[rotation][0][i];
piece[1][i] = pieces_S_l[rotation][1][i];
break;
case 2: //S_r
piece[1][i] = pieces_S_r[rotation][1][i];
break;
case 3: //Sq
piece[0][i] = pieces_Sq[0][0][i];
piece[1][i] = pieces_Sq[0][1][i];
break;
case 4: //T
piece[0][i] = pieces_T[rotation][0][i];
piece[1][i] = pieces_T[rotation][1][i];
break;
case 5: //l
piece[0][i] = pieces_l[rotation][0][i];
piece[1][i] = pieces_l[rotation][1][i];
break;
return 2;
return 4;
else if (type == 3)
return 1;
else
return 0;
short piece[2][4];
void drawLayout() {
drawNextPiece();
char text[6];
short getNumberLength(int n) {
short counter = 1;
n /= 10;
counter++;
return counter;
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(x, y);
display.cp437(true);
display.write(text[i]);
}
void setup() {
pinMode(left, INPUT_PULLUP);
pinMode(right, INPUT_PULLUP);
pinMode(change, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setRotation(1);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setCursor(18, 40);
display.println("TETRIS");
display.setCursor(15, 60);
display.println("ARDUINO");
display.display();
while (true) {
b3 = false;
} else { b3 = true; }
display.clearDisplay();
drawLayout();
display.display();
randomSeed(analogRead(0));
nextType = random(TYPES);
generate();
timer = millis();
}
void loop() {
checkLines();
refresh();
if (nextCollision()) {
generate();
} else
pieceY++;
timer = millis();
if (!digitalRead(left)) {
delay(100);
noTone(BUZZER);
if (b1) {
if (!nextHorizontalCollision(piece, -1)) {
pieceX--;
refresh();
b1 = false;
} else {
b1 = true;
if (!digitalRead(right)) {
tone(BUZZER, click[0], 1000 / click_duration[0]);
delay(100);
noTone(BUZZER);
if (b2) {
if (!nextHorizontalCollision(piece, 1)) {
pieceX++;
refresh();
b2 = false;
} else {
b2 = true;
if (!digitalRead(down)) {
interval = 20;
} else {
interval = 400;
if (!digitalRead(change)) {
delay(100);
noTone(BUZZER);
if (b3) {
rotation = 0;
rotation++;
b3 = false;
delayer = millis();
b3 = true;
Кодот ја врши целата функција на овој проект, со него функционираат тастерите, дисплејот
и пиезо звучникот, кодот се внесува во микроконтролерот „Ардуино уно“, и откако ке се
внесе кодот, микроконтролерот ја контролира целовкупната работа на проектот, инаку
кодот почнува со тоа што најпрвин се впишани бројот на пиксели на дисплејот и пинови на
кои ни се поврзани копчињата и пиезото, потоа имаме и делови во кој се впишуваат
праметрите на коцките и за колку нивоа ке се поместат кога ке се притисне некое копче и
кога да се вклучи пиезото.
Заклучок
Целта на играта е да се постават блокови кои паѓаат со различни форми на таков начин
што после секој потег ќе добиете полна линија. Кога линијата е целосно пополнета, таа
исчезнува и играчот добива поени. Целта на играта е да се освојат што е можно повеќе
поени пред да се пополни целата линија.