マイコンArduinoを使って電光掲示板を作る。
続き
今回は地面に着弾した時や砲台に被弾した時のアクションを作って行きます。
砲台に被弾するとゲーム終了
再スタートボタンの追加
砲台の移動をゆっくりスタートに変更
太字が変更したところ
int count = 0;
int x_pos = 0;
int old_x_pos = 0;
int y_pos = 0;
int fort_pos = 7; // 砲台の位置
boolean shot = false; // ビーム発射
int velocity = 0; // 落下速度
boolean hit = false; // 命中
boolean destruction = false;// 破壊
int repeat_count_left = 0; // 砲台の移動 ゆっくりスタート
int repeat_count_right = 0; // 砲台の移動 ゆっくりスタート
boolean my_hit = false; // 砲台に命中
boolean start = true; // 再スタート
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,INPUT_PULLUP);
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,OUTPUT);
old_x_pos = x_pos = random(1, 15);
}
void loop() {
// put your main code here, to run repeatedly:
for (int i = 0;i < 16;i++) {
for (int j = 0;j < 16;j++) {
digitalWrite(2,LOW);
// 破壊シーン
if (destruction) {
if (y_pos <= i + 1 && i < y_pos + 2)
if (fort_pos <= j && j < fort_pos + 3) {
digitalWrite(2,HIGH);
hit = false;
}
}
// ビームを描く
else {
if (shot) {
if (x_pos == j) {
if (j == fort_pos + 1 && i > y_pos) {
digitalWrite(2,HIGH);
hit = true;
}
}
else {
if (j == fort_pos + 1) {
digitalWrite(2,HIGH);
hit = false;
}
}
}
}
// 地面に落ちたシーン
if (!my_hit)
if (i == 14 || i == 15) {
if (x_pos <= j + 1 && j < x_pos + 2 && y_pos == 15) {
digitalWrite(2,HIGH);
}
}
// 砲台に被弾したシーン
if (i == 12 || i == 13 || i == 14 || i == 15) {
if (fort_pos == x_pos || fort_pos + 1 == x_pos || fort_pos + 2 == x_pos)
if (fort_pos + 1 <= j + 2 && j < fort_pos + 1 + 3 && y_pos == 14) {
digitalWrite(2,HIGH);
my_hit = true;
start = false;
}
}
// 爆弾を描く
if (!my_hit && start) { // 再スタート
if (j == x_pos && i == y_pos)
digitalWrite(2,HIGH);
// 砲身
if (i == 14) { // 15段目
if (fort_pos + 1 == j)
digitalWrite(2,HIGH);
}
// 砲台
if (i == 15) { // 1番下の16段目
if (fort_pos <= j && j < fort_pos + 3)
digitalWrite(2,HIGH);
}
}
digitalWrite(4,HIGH);
digitalWrite(4,LOW);
}
digitalWrite(5,HIGH);
digitalWrite(5,LOW);
}
digitalWrite(6,HIGH);
digitalWrite(6,LOW);
digitalWrite(11,LOW);
shot = false;
count++;
if (count > 10) {
count = 0;
if (destruction) {
destruction = false;
y_pos = 0;
do {
x_pos = random(1, 15);
} while (x_pos == old_x_pos);
old_x_pos = x_pos;
}
else
if (hit)
destruction = true;
// 爆弾の位置 y軸
velocity++;
if (velocity > 1) { // 落下速度
velocity = 0;
y_pos++;
if (y_pos > 15 && !my_hit) { // 再スタート
y_pos = 0;
do {
x_pos = random(1, 15);
} while (x_pos == old_x_pos);
old_x_pos = x_pos;
}
}
if (digitalRead(7) == 0 && start) { // 発射
shot = true;
digitalWrite(11,HIGH);
}
if (digitalRead(8) == 0 && !start) { // 再スタート
my_hit = false;
y_pos = 0;
do {
x_pos = random(1, 15);
} while (x_pos == old_x_pos);
old_x_pos = x_pos;
start = true;
}
// 砲台の位置
if (digitalRead(9) == 0) {
if (fort_pos > 0) {
if (repeat_count_left > 2 || repeat_count_left == 0)// 砲台の移動 ゆっくりスタート
fort_pos--; // 左へ移動
repeat_count_left++;
}
}
else {
repeat_count_left = 0;
}
if (digitalRead(10) == 0) {
if (fort_pos < 13) {
if (repeat_count_right > 2 || repeat_count_right == 0)// 砲台の移動 ゆっくりスタート
fort_pos++; // 右へ移動
repeat_count_right++;
}
}
else {
repeat_count_right = 0;
}
}
}
これで完成しました。
遊んでいる様子。
今回はこれで終了です。
見事なまでのスパゲッティプログラムですが一応ゲームとして成り立っています。
こんな簡単なゲームだからこのようなプログラムでも書けますが複雑な物になってくるととても無理です。
一度テトリスに挑戦してみようかな
勉強しながらになるのでゆっくりです。
では、また。