• 082226375801
  • alfianmaarif@ee.uad.ac.id
  • Yogyakarta
Materi
Game LEGEND ini bisa dibikin pake Arduino (Tetris) Oled Display + Joystick di WOKWI #game #tetris

Game LEGEND ini bisa dibikin pake Arduino (Tetris) Oled Display + Joystick di WOKWI #game #tetris



Tutorial ESP32: Game LEGEND ini bisa dibikin pake Arduino (Tetris) Oled Display + Joystick di WOKWI #game #tetris

Pada bagian ini akan dibahas pembuatan proyek game legendaris Tetris berbasis mikrokontroler Arduino UNO, layar OLED Display SSD1306 0.96 inci (I2C), dan analog joystick sebagai pengontrol pergerakan blok, serta software simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino pada Kode 1, dan video pembuatan pada tautan Video 1. Pergerakan blok Tetris (rotasi, geser kiri/kanan, dan drop) diproses menggunakan pembacaan sinyal analog joystick. Layar OLED akan merender grafis blok secara real-time, menghitung skor per baris yang berhasil dihancurkan, serta menampilkan kondisi game over saat susunan blok telah mencapai batas atas.

Gambar 1. Skematik rangkaian sistem

Pemetaan PIN:
* OLED DISPLAY 0.96 INCH I2C
GND => GND
VCC => 5V
SDA => SDA / 20
SCL => SCL / 21
* JOYSTICK
VCC => 5V
JOY_X => A0
JOY_Y => A1
BTN => 2
GND => GND
* BUZZER dan LED
GND – GND
OUT – 6

Kode Arduino 1. Kode Program

//ALFIAN CENTER
//SUBSCRIBE

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// ================= DISPLAY ==================
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

// ================= PIN ==================
#define JOY_X   A0
#define JOY_Y   A1
#define BTN_ROT 2
#define BUZZER  6


//ALFIAN CENTER
//SUBSCRIBE
// ================= BOARD ==================
#define COLS 10
#define ROWS 16
int board[ROWS][COLS];

// ================= PIECES ==================
const byte tetrominoes[7][4][4] = {
  { {0,1,0,0}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0} }, // I
  { {1,1,0,0}, {0,1,1,0}, {0,0,0,0}, {0,0,0,0} }, // Z
  { {0,1,1,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0} }, // S
  { {1,0,0,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0} }, // J
  { {0,0,1,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0} }, // L
  { {1,1,1,0}, {0,1,0,0}, {0,0,0,0}, {0,0,0,0} }, // T
  { {1,1,0,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0} }  // O
};

// ================= GAME STATE ==================
enum GameState { MENU, PLAYING, GAME_OVER };
GameState state = MENU;

enum Difficulty { EASY, MEDIUM, HARD };
Difficulty diffSel = MEDIUM;

int score=0, level=1;
unsigned long dropInterval=600;
unsigned long lastDrop=0;


//ALFIAN CENTER
//SUBSCRIBE
// ================= PIECE CONTROL ==================
int curPiece[4][4];
int curX, curY;
int nextPieceIdx;
int lastPieceIdx=-1, repeatCount=0;

// ================= UTILS ==================
void beep(int f, int d){ tone(BUZZER,f,d); }

void playDrop(){ beep(1000,50); }
void playRotate(){ beep(1500,50); }
void playGameOver(){ beep(300,500); }

void copyPieceByte(const byte src[4][4], int dest[4][4]){
  for(int y=0;y<4;y++) for(int x=0;x<4;x++) dest[y][x]=src[y][x];
}
void copyPieceInt(int src[4][4], int dest[4][4]){
  for(int y=0;y<4;y++) for(int x=0;x<4;x++) dest[y][x]=src[y][x];
}

void rotatePiece(int m[4][4]){
  int tmp[4][4];
  for(int y=0;y<4;y++) for(int x=0;x<4;x++) tmp[y][x]=m[y][x];
  for(int y=0;y<4;y++) for(int x=0;x<4;x++) m[x][3-y]=tmp[y][x];
}


//ALFIAN CENTER
//SUBSCRIBE
bool collision(int x,int y,int shape[4][4]){
  for(int py=0;py<4;py++)
    for(int px=0;px<4;px++)
      if(shape[py][px]){
        int nx=x+px, ny=y+py;
        if(nx<0||nx>=COLS||ny<0||ny>=ROWS) return true;
        if(board[ny][nx]) return true;
      }
  return false;
}

void placePiece(){
  for(int y=0;y<4;y++)
    for(int x=0;x<4;x++)
      if(curPiece[y][x]) board[curY+y][curX+x]=1;
  playDrop();
}

void clearLines(){
  int lines=0;
  for(int y=ROWS-1;y>=0;y--){
    bool full=true;
    for(int x=0;x<COLS;x++) if(!board[y][x]){ full=false; break; }
    if(full){
      for(int ty=y;ty>0;ty--)
        for(int x=0;x<COLS;x++) board[ty][x]=board[ty-1][x];
      for(int x=0;x<COLS;x++) board[0][x]=0;
      lines++;
      y++;
    }
  }
  if(lines>0){
    if(lines==1) score+=100;
    else if(lines==2) score+=300;
    else if(lines==3) score+=500;
    else if(lines==4) score+=800;  // Tetris!
  }
}


//ALFIAN CENTER
//SUBSCRIBE
void spawnPiece(){
  int idx=random(7);
  if(idx==lastPieceIdx){
    repeatCount++;
    if(repeatCount>=3){ 
      while(idx==lastPieceIdx) idx=random(7);
      repeatCount=0;
    }
  } else repeatCount=0;
  lastPieceIdx=idx;

  copyPieceByte(tetrominoes[idx],curPiece);
  curX=COLS/2-2; curY=0;
  if(collision(curX,curY,curPiece)) state=GAME_OVER;

  nextPieceIdx=random(7);
}

void updateSpeed(){
  switch(diffSel){
    case EASY: dropInterval=700-(level-1)*50; break;
    case MEDIUM: dropInterval=500-(level-1)*40; break;
    case HARD: dropInterval=300-(level-1)*30; break;
  }
  if(dropInterval<100) dropInterval=100;
}

// ================= RENDER ==================
void drawBoard(){
  u8g2.clearBuffer();
  // draw grid
  for(int y=0;y<ROWS;y++)
    for(int x=0;x<COLS;x++)
      if(board[y][x]) u8g2.drawBox(x*4,y*4,4,4);

  // draw current piece
  for(int y=0;y<4;y++)
    for(int x=0;x<4;x++)
      if(curPiece[y][x]) u8g2.drawBox((curX+x)*4,(curY+y)*4,4,4);

  // draw next piece
  u8g2.setFont(u8g2_font_5x7_tr);
  u8g2.setCursor(65,7); u8g2.print("Next:");
  for(int y=0;y<4;y++)
    for(int x=0;x<4;x++)
      if(tetrominoes[nextPieceIdx][y][x])
        u8g2.drawBox(80+x*4,10+y*4,4,4);

  u8g2.setCursor(65,35); u8g2.print("Score:"); u8g2.print(score);
  u8g2.setCursor(65,45); u8g2.print("Lvl:"); u8g2.print(level);

  u8g2.sendBuffer();
}

void drawMenu(){
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_6x12_tr);
  u8g2.setCursor(20,15); u8g2.print("TETRIS MINI");
  u8g2.setCursor(10,35); u8g2.print("Diff: ");
  if(diffSel==EASY) u8g2.print("Easy");
  else if(diffSel==MEDIUM) u8g2.print("Medium");
  else u8g2.print("Hard");
  u8g2.setCursor(10,50); u8g2.print("Press Button=Start");
  u8g2.sendBuffer();
}

void drawGameOver(){
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_6x12_tr);
  u8g2.setCursor(20,20); u8g2.print("GAME OVER!");
  u8g2.setCursor(20,40); u8g2.print("Score:"); u8g2.print(score);
  u8g2.setCursor(5,55); u8g2.print("Btn=Menu  JoyDown=Retry");
  u8g2.sendBuffer();
}

// ================= GAME ==================
void startGame(){
  for(int y=0;y<ROWS;y++) for(int x=0;x<COLS;x++) board[y][x]=0;
  score=0; level=1;
  updateSpeed();
  spawnPiece();
  state=PLAYING;
  playDrop();
}

void setup(){
  pinMode(BTN_ROT,INPUT_PULLUP);
  pinMode(BUZZER,OUTPUT);
  u8g2.begin();
  randomSeed(analogRead(A2));
  drawMenu();
}

void loop(){
  if(state==MENU){
    if(digitalRead(BTN_ROT)==LOW){
      startGame();
      delay(200);
    }
    int joyX=analogRead(JOY_X);
    if(joyX<300){ diffSel=(Difficulty)((diffSel+2)%3); drawMenu(); delay(200);}
    if(joyX>700){ diffSel=(Difficulty)((diffSel+1)%3); drawMenu(); delay(200);}
    return;
  }

  if(state==PLAYING){
    int joyX=analogRead(JOY_X);
    int joyY=analogRead(JOY_Y);
    if(joyX<300 && !collision(curX-1,curY,curPiece)){ curX--; delay(150);}
    if(joyX>700 && !collision(curX+1,curY,curPiece)){ curX++; delay(150);}
    if(joyY>700 && !collision(curX,curY+1,curPiece)){ curY++; } // turun cepat

    if(digitalRead(BTN_ROT)==LOW){
      int tmp[4][4]; copyPieceInt(curPiece,tmp);
      rotatePiece(tmp);
      if(!collision(curX,curY,tmp)) copyPieceInt(tmp,curPiece);
      playRotate();
      delay(200);
    }

    unsigned long now=millis();
    if(now-lastDrop>=dropInterval){
      lastDrop=now;
      if(!collision(curX,curY+1,curPiece)){
        curY++;
      } else {
        placePiece();
        clearLines();
        if(score/500+1>level){ level++; updateSpeed(); }
        spawnPiece();
      }
    }
    drawBoard();
    return;
  }

  if(state==GAME_OVER){
    drawGameOver();
    if(digitalRead(BTN_ROT)==LOW){ state=MENU; drawMenu(); delay(200); }
    int joyY=analogRead(JOY_Y);
    if(joyY>700){ startGame(); delay(200); }
  }
}

Video 1. Video tutorial pembuatan simulasi di WOKWI

TAG:

game tetris arduino, arduino tetris game, tetris arduino wokwi, tutorial game arduino, arduino oled display, ssd1306 arduino, arduino joystick game, game legend arduino, simulator wokwi arduino, belajar arduino game, proyek game arduino, arduino uno tetris, cara membuat game di arduino, coding game tetris arduino, game retro arduino, game klasik arduino, tutorial wokwi indonesia, ide proyek arduino, simulasi arduino online, wokwi simulator tutorial, joystick module arduino, oled display ssd1306, pemrograman C++ arduino, arduino display i2c, game tetris oled, membuat game dengan oled display, arduino project for beginners, proyek mikrokontroler game, tutorial arduino uno lengkap, skematik game tetris arduino, game dev arduino, membuat game 8bit arduino, logika game tetris arduino, game tetris sederhana arduino, sinyal analog joystick arduino, fungsi millis arduino game, library ssd1306 arduino, library gfx adafruit, game console sederhana arduino, diy game console arduino, porting game tetris arduino, tutorial elektronika dasar, praktikum mikrokontroler arduino, tugas akhir arduino game, media pembelajaran arduino, kodingan game tetris, koding game arduino uno, game tetris oled 0.96, display oled i2c arduino, kontroler joystick arduino, membuat stik game arduino, simulasi wokwi game, arduino tutorial indonesia, tutorial iot dan elektro, proyek mekatronika sederhana, proyek teknik elektro, koding arduino wokwi, game tetris wokwi online, belajar mekatronika dasar, tutorial simulasi wokwi, game tetris tanpa hardware, simulasi komponen elektronik, game tetris arduino uno r3, display 128×64 oled arduino, adafruit ssd1306 tutorial, game tetris arduino code, source code game tetris arduino, program game tetris arduino, game tetris gratis arduino, proyek coding siswa arduino, game arcade arduino, retro gaming arduino, mini game console arduino, game tetris berbasis mikrokontroler, aplikasi game arduino, membuat game simulator wokwi, sensor joystick arduino, sumbu x y joystick arduino, pin analog arduino joystick, push button joystick arduino, render grafis oled arduino, animasi bitmap oled arduino, scoring system game arduino, game over logic arduino, matrix game tetris arduino, array 2d game tetris arduino, algoritma game tetris, tutorial arduino dasar sampai mahir, proyek kreatif arduino, karya siswa elektro arduino, portofolio mikrokontroler, latihan koding arduino, game dev mikrokontroler, proyek iot dan game, lab mikrokontroler arduino, proyek arduino seru, kreasi arduino uno, game tetris legenda arduino, game vintage arduino

Leave a Reply

Your email address will not be published. Required fields are marked *