2016-07-10 12 views
0

私はアーティストであり、プログラマーではありません。しかし、私はArduinoとピンボールゲームを作っています。私はプログラマーがいないので、私はこの仕事をするために何ができるかを学んでいます。ピンボールターゲット - リセットしないでください

私はこれを行うコードを書こうとしています: - ヒットしたときにポイントを与え、LEDを点灯させる3つのターゲット(ボタン)。 - 同じボタンをもう一度押すと、ポイントが表示され、LEDは点灯したままです。 - 同時に3つのライトがすべて点灯している場合、ボーナススコアが与えられ、3つのライトすべてが消灯します。

私はArduinoフォーラムを使用しようとしましたが、私がそこから得ることができる最高のアドバイスは、「コードを学ぶ」ことでした。

私は「配列」について学ぶように言われていますが、私は試しましたが、私はそれの周りに私の頭を包んでいる重大な問題を抱えています。 'IF'と 'ELSE'ステートメントだけでこれを行うことができるのであれば、長くて非効率的なやり方をするのが本当に好きです。

ここは私の現在のコードです。現在、ブレッドボードには4つのライトがあります。ライト#4(D)は、デバッグのためすぐに点灯します。ボタンを押すと、他の3つのライト(ABC)のそれぞれが点灯します。 3つのライトがすべて点灯すると、(D)ライトは消灯しますが、(ABC)は点灯したままです。私は(D)がそうするときに出かける必要がある。なぜ彼らが習わなかったのか分かりません。私はコードが3つすべてがHIGHであると認識していることを知っています。 (D)が低くなるためです。私はなぜ(ABC)も低くならないのか分からない。

// 3 TARGET SCORE FUNCTION. 
// WHEN A TARGET IS HIT IT LIGHTS UP AND PROVIDES POINTS. 
// IF A TARGET IS HIT AGAIN WHILE IT IS ALREADY LIT, IT STILL SCORES POINTS AND STAYS LIT. 
// WHEN ALL 3 TARGETS ARE LIT THEY FLASH AND PROVIDE A JACKPOT 
// WHEN JACKPOT IS PROVIDED ALL LIGHTS TURN OFF. READY TO BE ACTIVATED AGAIN. 

int dropButtonA = 2;   // the number of the input pin 
int dropButtonB = 3;   
int dropButtonC = 4; 

int dropLightA = 11;  // the number of the output pin 
int dropLightB = 12;  
int dropLightC = 13; 
int dropLightD = 10;  

int stateA = LOW;  // the current state of the output pin 
int stateB = LOW;  
int stateC = LOW; 
int stateD = LOW; 

int readingA; // the current reading from the input pin 
int readingB; 
int readingC; 

int previousA = LOW; // the previous reading from the input pin 
int previousB = LOW; 
int previousC = LOW;  

long time = 0;   // the last time the output pin was toggled 
long debounce = 200; // the debounce time, increase if the output flickers 

void setup() 
{ 
    pinMode(dropButtonA, INPUT); 
    pinMode(dropButtonB, INPUT); 
    pinMode(dropButtonC, INPUT); 

    pinMode(dropLightA, OUTPUT); 
    pinMode(dropLightB, OUTPUT); 
    pinMode(dropLightC, OUTPUT); 
    pinMode(dropLightD, OUTPUT); 
    } 

void loop() 
{ 

    //droptarget_01// 

    readingA = digitalRead(dropButtonA); 

     if (readingA == HIGH && previousA == LOW && millis() - time > debounce) { 

     stateA = HIGH; 

     time = millis();  
    } 

    digitalWrite(dropLightA, stateA); 

    previousA = readingA; 

    //droptarget_02// 

    readingB = digitalRead(dropButtonB); 

     if (readingB == HIGH && previousB == LOW && millis() - time > debounce) { 

      stateB = HIGH; 

      time = millis();  
     } 

     digitalWrite(dropLightB, stateB); 

     previousB = readingB; 

    //droptarget_03// 

    readingC = digitalRead(dropButtonC); 

     if (readingC == HIGH && previousC == LOW && millis() - time > debounce) { 

      stateC = HIGH; 

      time = millis();  
     } 

     digitalWrite(dropLightC, stateC); 

     previousC = readingC; 


    //RESET TARGETS - BONUS SCORE 
if (digitalRead(dropLightA)==HIGH && digitalRead(dropLightB)==HIGH && digitalRead(dropLightC)==HIGH) 
{ 
    digitalWrite(dropLightA, LOW); 
    digitalWrite(dropLightB, LOW); 
    digitalWrite(dropLightC, LOW); 
    digitalWrite(dropLightD, LOW); 
} 
else 
{ 
    digitalWrite(dropLightD, HIGH); 
} 

    } 

答えて

0

問題は、ABCがLOWを行くとき「stateX」という名前の変数が変化しないということです。あなたは「// RESET目標 - BONUS SCORE」にこれらのステートメントを追加する必要があり、条件が真であるときループ:

stateA = LOW; 
stateB = LOW; 
stateC = LOW; 
stateD = LOW; 

コードの唯一の4項目 - 明快さがある場合、あなたは、配列を使用する必要はありませんIMHO(特に著者に)価値がある。しかし、変数 "stateX"と "previousX"は重複していると思います。両方とも持っていなかったら、このバグはありません。

また、私は「// RESET目標 - ボーナスSCORE」でループテストのためのピンの前に読み込まれた値を使用することをお勧めします:

if (readingA == HIGH && readingB == HIGH && readingC == HIGH) 

あなたの現在のコードを使用すると、ピンの値を読み取りますループ中に2回。この場合、ループ中にピンの値が変わる可能性があり、は実際にはという結果を招く可能性があります。

関連する問題