Arduboy ゲームプログラム 「ケイブ」

Arduboyでゲーム開発へ戻る

●操作方法とルール
・上下キーで自機(小さな円)を上下に移動
・洞窟の天井と床にぶつからないように飛び続ける
・プログラムの行数 100行

●ゲームサンプルコード03「ケイブ」
#include <Arduboy2.h>
Arduboy2 arduboy;
BeepPin1 beep;

const int WALLMAX = 32;
int y[WALLMAX];
int h[WALLMAX];
int scene = 0;
int cntr = 0;
int score = 0;
int pl_x = 30;
int pl_y = 32;

void scroll() { // 洞窟をスクロールする
  int last = WALLMAX-1;
  for(int i=0; i<last; i++) {
    y[i] = y[i+1];
    h[i] = h[i+1];
  }
  h[last] = 48-score/20;
  if(h[last]<10) h[last] = 10;
  int r = rand()%3;
  if(r==0 && y[last]-h[last]/2> 1) y[last]--;
  if(r==1 && y[last]+h[last]/2<62) y[last]++;
}

void cave() { // 洞窟を描く
  for(int i=0; i<WALLMAX; i++) arduboy.fillRect(i*4, y[i]-h[i]/2, 4, h[i], WHITE);
  arduboy.drawCircle(pl_x, pl_y, 1, BLACK);
  arduboy.setTextColor(WHITE);
  arduboy.setCursor(74, 0);
  arduboy.setTextSize(1);
  arduboy.print("SC ");
  arduboy.print(score);
}

void setup() {
  arduboy.begin();
  arduboy.setFrameRate(30);
  beep.begin();
}
void loop() {
  if (!(arduboy.nextFrame())) return; // 次のフレームまで処理をスキップ
  int x;
  cntr++;
  beep.timer();
  arduboy.clear();
  switch(scene) {
    case 0:
    for(int i=0; i<WALLMAX; i++) {
      y[i]=32;
      h[i]=62-i/2;
    }
    pl_x = 30;
    pl_y = 32;
    scene = 1;
    break;

    case 1: // タイトル
    cave();
    arduboy.setTextColor(BLACK);
    arduboy.setCursor(22, 12);
    arduboy.setTextSize(2);
    arduboy.print("C A V E");
    arduboy.setCursor(25, 48);
    arduboy.setTextSize(1);
    arduboy.print("Press[A]or[B]");
    if(arduboy.pressed(A_BUTTON) || arduboy.pressed(B_BUTTON)) {
      scene = 2;
      score = 0;
    }
    break;

    case 2: // ゲーム
    score++;
    scroll();
    if(arduboy.pressed(UP_BUTTON) && pl_y>2) pl_y -= 2;
    if(arduboy.pressed(DOWN_BUTTON) && pl_y<60) pl_y += 2;
    x = pl_x/4;
    if(pl_y<y[x]-h[x]/2 || y[x]+h[x]/2<pl_y) {
      scene = 3;
      cntr = 0;
    }
    cave();
    break;

    case 3: // ゲームオーバー
    cave();
    arduboy.setCursor(37, 24);
    arduboy.setTextColor(BLACK);
    if(cntr%24<12) arduboy.setTextColor(WHITE);
    arduboy.print("GAME OVER");
    arduboy.drawCircle(pl_x, pl_y, 1+cntr%4, WHITE);
    arduboy.drawCircle(pl_x, pl_y, 2+cntr%4, BLACK);
    if(cntr%4==1) beep.tone(beep.freq(30+rand()%200), 3);
    if(cntr==30*4) scene = 0;
    break;
  }
  arduboy.display();
}

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