Skip to content

Instantly share code, notes, and snippets.

@sgk
Last active December 25, 2015 21:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgk/7045323 to your computer and use it in GitHub Desktop.
Save sgk/7045323 to your computer and use it in GitHub Desktop.
Arduino "baseball" game
#define BUTTON 2
#define SPEAKER 3
#define BALL5 9
#define BALL4 10
#define BALL3 11
#define BALL2 12
#define BALL1 13
#define DURATION 500000
unsigned long duration = DURATION;
int level = 0;
int strike = 0;
int last = 0;
void setup() {
pinMode(BALL1, INPUT);
pinMode(BALL2, INPUT);
pinMode(BALL3, INPUT);
pinMode(BALL4, INPUT);
pinMode(BALL5, INPUT);
pinMode(SPEAKER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
Serial.begin(9600);
}
boolean ball(int pin) {
tone(SPEAKER, 880, 20);
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
last = pin;
unsigned long start = micros();
while (micros() - start < duration) {
if (digitalRead(BUTTON) == LOW) {
return true;
}
}
digitalWrite(pin, LOW);
pinMode(pin, INPUT);
return false;
}
void loop() {
Serial.print("Level: ");
Serial.println(level);
Serial.print("Strike: ");
Serial.println(strike);
Serial.println("Hit the button to start");
// ボタンが押されてから離されるのを待つ。
while (digitalRead(BUTTON) == HIGH) {
}
while (digitalRead(BUTTON) == LOW) {
}
delay(50);
// ボールを投げる。
if (ball(BALL1) || ball(BALL2) || ball(BALL3) || ball(BALL4)) {
// ボタンを押したのが早すぎる。
++strike;
tone(SPEAKER, 50, 500);
delay(700);
} else
if (ball(BALL5)) {
// ヒット!
strike = 0; // ストライクの数を0に戻す。
++level; // レベルを上げる。
duration *= 0.8; // ボールを速くする。
tone(SPEAKER, 554, 300);
delay(300);
tone(SPEAKER, 440, 300);
delay(300);
} else {
// 遅すぎる。
++strike;
tone(SPEAKER, 50, 500);
delay(700);
}
// ボタンがオフになるまで待つ。
while (digitalRead(BUTTON) == LOW) {
}
Serial.println();
digitalWrite(last, LOW); // 最後に光らせたLEDを消す。
pinMode(last, INPUT);
if (strike == 3) {
// 3ストライク、バッターアウト。
Serial.print("Last Level: ");
Serial.println(level);
Serial.println("Hit the button to start over.");
tone(SPEAKER, 50, 500);
delay(700);
tone(SPEAKER, 50, 500);
// ボタンが押されてから離されるのを待つ。
while (digitalRead(BUTTON) == HIGH) {
}
while (digitalRead(BUTTON) == LOW) {
}
duration = DURATION;
level = strike = last = 0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment