foto
foto

Chrome dino game




#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Defines
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     4
#define SCREEN_ADDRESS 0x3C

#define DINO_WIDTH 25
#define DINO_HEIGHT 26
#define DINO_INIT_X 10
#define DINO_INIT_Y 29

#define BASE_LINE_X 0
#define BASE_LINE_Y 54
#define BASE_LINE_X1 127
#define BASE_LINE_Y1 54

#define TREE1_WIDTH 11
#define TREE1_HEIGHT 23
#define TREE2_WIDTH 22
#define TREE2_HEIGHT 23
#define TREE_Y 35

#define JUMP_PIXEL 22 // Number of pixel dino will jump

#define BUTTON_PIN 2 // external button

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ==== Sprites ====
static const unsigned char PROGMEM dino1[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x06, 0xff, 0x00, 
  0x00, 0x0e, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 
  0x00, 0x0f, 0xff, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x0f, 0xfc, 0x00, 
  0x40, 0x0f, 0xc0, 0x00, 0x40, 0x1f, 0x80, 0x00, 0x40, 0x7f, 0x80, 0x00, 
  0x60, 0xff, 0xe0, 0x00, 0x71, 0xff, 0xa0, 0x00, 0x7f, 0xff, 0x80, 0x00, 
  0x7f, 0xff, 0x80, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 
  0x1f, 0xff, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 
  0x01, 0xdc, 0x00, 0x00, 0x01, 0x8c, 0x00, 0x00, 0x01, 0x8c, 0x00, 0x00, 
  0x01, 0x0c, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00
};

static const unsigned char PROGMEM tree1[] = {
  0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x40, 0x1f, 0xe0, 0x1f, 0xe0, 0xdf, 0xe0,
  0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xc0,
  0xff, 0x00, 0xff, 0x00, 0x7f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00,
  0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00
};

static const unsigned char PROGMEM tree2[] = {
  0x1e, 0x01, 0xe0, 0x1f, 0x03, 0xe0, 0x1f, 0x4f, 0xe8, 0x1f, 0xff, 0xfc,
  0x1f, 0xff, 0xfc, 0xdf, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc,
  0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xef, 0xfc, 0xff, 0x83, 0xfc,
  0xff, 0x03, 0xfc, 0xff, 0x03, 0xf8, 0x7f, 0x03, 0xe0, 0x1f, 0x03, 0xe0,
  0x1f, 0x03, 0xe0, 0x1f, 0x03, 0xe0, 0x1f, 0x03, 0xe0, 0x1f, 0x03, 0xe0,
  0x1f, 0x03, 0xe0, 0x1f, 0x03, 0xe0
};

// ==========================

void setup() {  
  pinMode(BUTTON_PIN, INPUT_PULLUP);  
  Serial.begin(9600);  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {    
    Serial.println(F("SSD1306 allocation failed"));    
    for(;;);  
  }  

  display.clearDisplay();  
  introMessage();  

  // wait for button press to start
  while(digitalRead(BUTTON_PIN) == HIGH) { }  

  play();  
}

void loop() { } // not used

void introMessage(){  
  display.setTextSize(2);  
  display.setTextColor(SSD1306_WHITE);  
  display.setCursor(10,5);  
  display.println("Dino Game");    
  display.setTextSize(1);    
  display.setCursor(5,45);  
  display.println("Press Btn To Play ");  
  display.display();  
}

void moveDino(int16_t *y){  
  display.drawBitmap(DINO_INIT_X, *y, dino1, DINO_WIDTH, DINO_HEIGHT, SSD1306_WHITE);  
}

void moveTree(int16_t *x, int type=0){  
  if(type==0){    
    display.drawBitmap(*x, TREE_Y, tree1, TREE1_WIDTH, TREE1_HEIGHT, SSD1306_WHITE);  
  }  
  else {    
    display.drawBitmap(*x, TREE_Y, tree2, TREE2_WIDTH, TREE2_HEIGHT, SSD1306_WHITE);  
  }  
}

void gameOver(int score=0){  
  display.clearDisplay();  
  display.setTextSize(2);  
  display.setTextColor(SSD1306_WHITE);  
  display.setCursor(10,5);  
  display.println("Game Over");    
  display.setTextSize(1);  
  display.setCursor(10,30);  
  display.print("Score: ");  
  display.print(score);    
  display.setCursor(1,45);  
  display.println("Press Btn Again");  
  display.display();  

  // wait for button to restart
  while(digitalRead(BUTTON_PIN) == HIGH) { }  
  play();  
}

void displayScore(int score){  
  display.setTextSize(1);  
  display.setCursor(64,10);  
  display.print("Score: ");  
  display.print(score);  
}

void play(){  
  int16_t tree_x=127;  
  int16_t tree1_x=195;  
  int tree_type = random(0,2);  
  int tree_type1 = random(0,2);  
  int16_t dino_y = DINO_INIT_Y;  
  int jump=0;  
  int score=0;


for(;;){    
    display.clearDisplay();    

    // jump if button pressed
    if(digitalRead(BUTTON_PIN) == LOW){      
      if(jump==0) jump=1;    
    }    

    if(jump==1){      
      dino_y--;      
      if(dino_y== (DINO_INIT_Y-JUMP_PIXEL)){        
        jump=2;        
        score++;      
      }    
    }    
    else if(jump==2){      
      dino_y++;      
      if(dino_y== DINO_INIT_Y){        
        jump=0;       
      }    
    }    

    // collision detection
    if(tree_x<= (DINO_INIT_X+DINO_WIDTH) && tree_x>= (DINO_INIT_X+(DINO_WIDTH/2))){      
      if(dino_y>=(DINO_INIT_Y-3)){        
        break;      
      }    
    }    

    if(tree1_x<= (DINO_INIT_X+DINO_WIDTH) && tree1_x>= (DINO_INIT_X+(DINO_WIDTH/2))){      
      if(dino_y>=(DINO_INIT_Y-3)){        
        break;      
      }    
    }    

    displayScore(score);    
    moveTree(&tree_x,tree_type);    
    moveTree(&tree1_x,tree_type1);    
    moveDino(&dino_y);    
    display.drawLine(0, 54, 127, 54, SSD1306_WHITE);    

    tree_x--;    
    tree1_x--;    

    if(tree_x==0) {      
      tree_x = 127;      
      tree_type = random(0,2);    
    }    

    if(tree1_x==0) {      
      tree1_x = 195;      
      tree_type1 = random(0,2);    
    }    

    display.display();  
  }  

  gameOver(score);  
}