Arduboy ゲームプログラム 「スネークゲーム」

Arduboyでゲーム開発へ戻る

●操作方法とルール
・方向キーでヘビの移動する向きを変更
・餌(小さい〇)を食べるとスコアが増え、体が1つ伸びる
・外周にぶつかったり、自分の体にぶつかるとゲームオーバー
 (進行方向の逆向きのボタンを押すとゲームオーバーです)
・プログラムの行数 142行

●ゲームサンプルコード01「スネークゲーム」
#include <Arduboy2.h>

Arduboy2 aboy;
BeepPin1 beep;

char proc = 0;
unsigned char tmr = 0;
char hx, hy, hd;
char tx, ty, td;
char spd, smax;
int sc;
int hs = 20;
char XP[5] = {0,  0, 0, -1, 1};
char YP[5] = {0, -1, 1,  0, 0};
char bg[16][24];

void initBG() {
  for(char y=0; y<16; y++) {
    for(char x=0; x<24; x++) bg[y][x] = 0;
  }
}

void drawBG() {
  for(char y=0; y<16; y++) {
    for(char x=0; x<24; x++) {
      char X = x*4;
      char Y = y*4;
      if(bg[y][x]==-1) aboy.drawCircle(X+1, Y+1, 1, WHITE);
      if(bg[y][x]>0) aboy.fillRect(X, Y, 3, 3, WHITE);
    }
  }
}

void snake() {
  if(aboy.pressed(UP_BUTTON)   ) hd = 1;
  if(aboy.pressed(DOWN_BUTTON) ) hd = 2;
  if(aboy.pressed(LEFT_BUTTON) ) hd = 3;
  if(aboy.pressed(RIGHT_BUTTON)) hd = 4;
  spd++;
  if(spd<smax) return;
  spd = 0;
  bg[hy][hx] = hd;
  char x = hx + XP[hd];
  char y = hy + YP[hd];
  if(x<0 || 23<x || y<0 || 15<y){
    proc = 2;
    tmr = 0;
    return;
  }
  hx = x;
  hy = y;
  char b = bg[hy][hx];
  bg[hy][hx] = hd;
  if(b>0){
    proc = 2;
    tmr = 0;
    return;
  }
  if(b==-1) {
    beep.tone(beep.freq(1318.510), 1);//E6
    sc++;
    if(sc>hs) hs = sc;
    return;
  }
  //tail
  td = bg[ty][tx];
  bg[ty][tx] = 0;
  tx += XP[td];
  ty += YP[td];
}

void setup() {
  aboy.begin();
  aboy.setFrameRate(15);
  beep.begin();
}

void loop() {
  if(!aboy.nextFrame()) return;
  beep.timer();
  aboy.clear();
  drawBG();
  aboy.fillRect(96, 0, 32, 64, WHITE);
  aboy.setTextColor(BLACK);
  aboy.setTextSize(1);
  aboy.setCursor(98, 2);
  aboy.print("SCORE");
  aboy.setCursor(98, 12);
  aboy.print(sc);
  aboy.setCursor(98, 32);
  aboy.print("HI-SC");
  aboy.setCursor(98, 42);
  aboy.print(hs);
  tmr++;
  switch(proc) {
    case 0:
    aboy.setTextColor(WHITE);
    aboy.setTextSize(2);
    aboy.setCursor(20, 5);
    aboy.print("Snake");
    aboy.setCursor(20, 25);
    aboy.print("Game");
    aboy.setTextSize(1);
    aboy.setCursor(2, 50);
    aboy.print("[A]Easy [B]Hard");
    if(aboy.pressed(A_BUTTON)||aboy.pressed(B_BUTTON)) {
      beep.tone(beep.freq(523.251), 1);//C5
      initBG();
      hx = 4;
      hy = 8;
      hd = 4;
      bg[hy][hx] = hd;
      tx = hx-1;
      ty = hy;
      td = hd;
      bg[ty][tx] = td;
      spd = 0;
      smax = 5;
      if(aboy.pressed(B_BUTTON))smax = 2;
      sc = 0;
      proc = 1;
      tmr = 0;
    }
    break;

    case 1:
    snake();
    if(tmr%30==0) {
      char x = rand()%24;
      char y = rand()%16;
      if(bg[y][x]==0) bg[y][x] = -1;
    }
    break;

    case 2:
    aboy.drawCircle(hx*4+rand()%4, hy*4+rand()%4, 4, WHITE);
    if(tmr%5==1) beep.tone(beep.freq(65.406), 2);//C2
    if(tmr>75) proc = 0;
    break;
  }
  aboy.display();
}

Arduboyでゲーム開発のページへ移動
プログラミング、ゲーム開発の書籍を執筆します
メールはこちらへ: