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でゲーム開発のページへ移動