2015-11-27 56 views
0

我设计了一款使用我的Arduino和ETS-7000设备的反应游戏,并且我遇到了一些问题。更改7段计数器显示屏

游戏的想法是,将有两个玩家在玩互相反对,我用三个LED的,他们都在ETS-7000了。

两个7段将开始9,9和当所述第三LED闪烁两个玩家应该按swithces。

较慢的球员将减少1点和他的7段将在8,游戏将继续下去,直到一些达到0和损失。

我proble是,我所做的每一件事情正确的,但不是较慢的玩家减少了7段1点,更快的球员一样。

我需要帮助,所以我调整了代码是在oppisite方式

附:我使用的BCD编码为7段

int SW2 = 3; //try 
    int SW1 = 4; 
    int LED0 = A0; 
    int LED1 = 12; 
    int LED2 = 13; 
// int fault = 0; 
    //long wait = 0; 
    //long now = 0; 
    void setup(){ 
    pinMode(A5, OUTPUT); 
    pinMode(A4, OUTPUT); 
    pinMode(A3, OUTPUT); 
    pinMode(A2, OUTPUT); 
    pinMode(8, OUTPUT); 
    pinMode(9, OUTPUT); 
    pinMode(10, OUTPUT); 
    pinMode(11, OUTPUT); 
    pinMode(LED0, OUTPUT); 
    pinMode(LED1, OUTPUT); 
    pinMode(LED2, OUTPUT); 
    pinMode(SW1, INPUT); 
    pinMode(SW2, INPUT); 
    //Initializing components 
    randomSeed(analogRead(1)); 
} 
void loop(){ 
reset: 
    int n=9, x=9; 
          digitalWrite(A5, HIGH); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, HIGH); 
          digitalWrite(8, HIGH); 
       digitalWrite(9, LOW); 
       digitalWrite(10, LOW); 
       digitalWrite(11, HIGH); 
    do{ 
     digitalWrite(LED0, HIGH); 
    delay(2000); 
    digitalWrite(LED1, HIGH); 
    //Wait for a random period of time, between 3 seconds 
//And 6 seconds. Get ready! 
delay(random(500,8000)); 
    digitalWrite(LED2, HIGH); 
    //Swing your swords as fast as you can, the faster one 
//will be returned by getWinner() 
int winner=getWinner(); 
    //The yellow led by side of the winner will light up 
if(winner==1){ 
    if (n==1) 
      { 
      digitalWrite(A5, LOW); 
      digitalWrite(A4, LOW); 
      digitalWrite(A3, LOW); 
      digitalWrite(A2, LOW); 
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, LOW); 
      digitalWrite(LED0, HIGH); 
      delay(100); 
      digitalWrite(LED0, LOW); 
      delay(100); 
      digitalWrite(LED0, HIGH); 
      delay(100); 
      digitalWrite(LED0, LOW); 
      delay(100); 
      digitalWrite(LED0, HIGH); 
      delay(100); 
      digitalWrite(LED0, LOW); 
      delay(100); 
      digitalWrite(LED0, HIGH); 
      delay(100); 
      digitalWrite(LED0, LOW); 
      delay(100); 
      digitalWrite(LED0, HIGH); 
      delay(100); 
      digitalWrite(LED0, LOW); 
      delay(5000); 
      break; 
      } 
    else 
    {n=n-1;} 
    }else{ if (x==1) 
      { 
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW); 
      digitalWrite(LED0, LOW); 
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, HIGH); 
      delay(100); 
      digitalWrite(LED2, LOW); 
      delay(100); 
      digitalWrite(LED2, HIGH); 
      delay(100); 
      digitalWrite(LED2, LOW); 
      delay(100); 
      digitalWrite(LED2, HIGH); 
      delay(100); 
      digitalWrite(LED2, LOW); 
      delay(100); 
      digitalWrite(LED2, HIGH); 
      delay(100); 
      digitalWrite(LED2, LOW); 
      delay(100); 
      digitalWrite(LED2, HIGH); 
      delay(100); 
      digitalWrite(LED2, LOW); 
      delay(5000); 
      break; 
      } 
    else { x=x-1;} 
} 
      if (n==0){ 
       digitalWrite(A5, LOW); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, LOW); 
      } else if (n==1){ 
       digitalWrite(A5, HIGH); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, LOW); 
      } else if (n==2){ 
       digitalWrite(A5, LOW); 
       digitalWrite(A4, HIGH); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, LOW); 
      } else if (n==3){ 
       digitalWrite(A5, HIGH); 
       digitalWrite(A4, HIGH); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, LOW); 
      } else if (n==4){ 
       digitalWrite(A5, LOW); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, HIGH); 
       digitalWrite(A2, LOW); 
      } else if (n==5){ 
       digitalWrite(A5, HIGH); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, HIGH); 
       digitalWrite(A2, LOW); 
      } else if (n==6) { 
       digitalWrite(A5, LOW); 
       digitalWrite(A4, HIGH); 
       digitalWrite(A3, HIGH); 
       digitalWrite(A2, LOW); 
      } else if (n==7){ 
       digitalWrite(A5, HIGH); 
       digitalWrite(A4, HIGH); 
       digitalWrite(A3, HIGH); 
       digitalWrite(A2, LOW); 
      } else if (n==8){ 
       digitalWrite(A5, LOW); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, HIGH); 
      } else if (n==9){ 
       digitalWrite(A5, HIGH); 
       digitalWrite(A4, LOW); 
       digitalWrite(A3, LOW); 
       digitalWrite(A2, HIGH); 
      } 
        if (x==0){ 
       digitalWrite(8, LOW); 
       digitalWrite(9, LOW); 
       digitalWrite(10, LOW); 
       digitalWrite(11, LOW); 
      } else if (x==1){ 
       digitalWrite(8, HIGH); 
       digitalWrite(9, LOW); 
       digitalWrite(10, LOW); 
       digitalWrite(11, LOW); 
      } else if (x==2){ 
       digitalWrite(8, LOW); 
       digitalWrite(9, HIGH); 
       digitalWrite(10, LOW); 
       digitalWrite(11, LOW); 
      } else if (x==3){ 
       digitalWrite(8, HIGH); 
       digitalWrite(9, HIGH); 
       digitalWrite(10, LOW); 
       digitalWrite(11, LOW); 
      } else if (x==4){ 
       digitalWrite(8, LOW); 
       digitalWrite(9, LOW); 
       digitalWrite(10, HIGH); 
       digitalWrite(11, LOW); 
      } else if (x==5){ 
       digitalWrite(8, HIGH); 
       digitalWrite(9, LOW); 
       digitalWrite(10, HIGH); 
       digitalWrite(11, LOW); 
      } else if (x==6) { 
       digitalWrite(8, LOW); 
       digitalWrite(9, HIGH); 
       digitalWrite(10, HIGH); 
       digitalWrite(11, LOW); 
      } else if (x==7){ 
       digitalWrite(8, HIGH); 
       digitalWrite(9, HIGH); 
       digitalWrite(10, HIGH); 
       digitalWrite(11, LOW); 
       } else if (x==8){ 
       digitalWrite(8, LOW); 
       digitalWrite(9, LOW); 
       digitalWrite(10, LOW); 
       digitalWrite(11, HIGH); 
       } else if (x==9) { 
       digitalWrite(8, HIGH); 
       digitalWrite(9, LOW); 
       digitalWrite(10, LOW); 
       digitalWrite(11, HIGH); 
       } 
      digitalWrite(LED0, LOW); 
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, LOW); 
delay(2000); 
    } while(true); 
     goto reset; 
    } 
//The function below waits for either of the tilter 
//switch to be swang. The first one to swing 
//will be returned by its number 
int getWinner(){ 
    do{ 
    if(digitalRead(SW1)==HIGH){ 
     return 1; 
    }else if(digitalRead(SW2)==HIGH){ 
     return 2; 
    } 
    }while(true); 
} 

回答

1

它有点难以阅读究竟是怎么回事,但它听起来就像你从逻辑反转的痛苦。

基本上,你的程序应该这样做:

  1. 检查赢家,回报冠军数(大概是0或1)
  2. 如果获奖者的用户== 1,检查并减少用户0号
  3. 否则,检查并减少用户1
  4. 数写出新的数字

你的程序是什么实际上做的是两种:

  1. 返回了错误的号码为胜利者
  2. 修改错误的用户的数量 - 这就是说,如果获奖者 数== 1,应该递减X而不是n

有一个简单的方法,使您的工作方案 - 如果这是唯一的问题 - 这是的

if(winner == 1) 

逻辑改变

if(winner != 1) 

这将反转的逻辑和解决问题。然而。请注意,这可能只是“两错都对”的情况。如果你的代码错误地计算了胜利者,这将是完全的,你会更好地修复,而不是稍后逆转错误。同样值得注意的是,如果你想把它扩展到3个或更多的玩家,现在使用!=逻辑意味着你将不得不在稍后重写它。

如果获胜者的计算是正确的,那么你的其他选项就是改变被改变的数字,所以在冠军== 1的第一个if/else部分中,将每个x的实例与n,反之亦然。根据设置的方式,您可能还需要交换LED 9-11和A2-A5的实例。这很难说,因为缺乏任何意见重新:这些LED实际上代表:)

2

我会给你一个连续片段更正的版本。

首先,应该在顶部定义针脚编号并给出有意义的名称。如果一切都按玩家编号进行索引,它也使代码变得非常简单。

#define PLAYER1 0 
#define PLAYER2 1 

const int ALERT_LED = 12; 

// Pins of the BCD display for both players, most significant bit first 
const int PLAYER_DISPLAY[2][4] = { 
    { A2, A3, A4, A5 }, 
    { 11, 10, 9, 8 } 
}; 

const int PLAYER_LED[2] = { A0, 13 }; 
const int PLAYER_SWITCH[2] = {4, 3 }; 

功能是你的朋友。我们将在这里重新组合输出功能。

void set_display (int player, int value) 
{ 
    for (int i = 0; i < 4; i++) { 
     digitalWrite (PLAYER_DISPLAY[player][3 - i], value & (1 << i)); 
    } 
} 

void blink_led (int pin) 
{ 
    for (int i = 0; i < 5; i++) { 
     digitalWrite (pin, HIGH); 
     delay(100); 
     digitalWrite (pin, LOW); 
     delay(100); 
    } 
} 

我们对输入功能也是这样做的。

// return the number of the first player to press its switch 
int get_winner() 
{ 
    while (true) { 
     for (int i = 0; i < 2; i++) { 
      if (digitalRead(PLAYER_SWITCH[i]) == HIGH) { 
       return i; 
      } 
     } 
    } 
} 

我们设置了引脚方向。

void setup() 
{ 
    // set pins direction and ensure the leds are off 
    pinMode (ALERT_LED, OUTPUT); 
    digitalWrite (ALERT_LED, LOW); 

    for (int i = 0; i < 2; i++) { 
     for (int j = 0; j < 4; j++) { 
      pinMode (PLAYER_DISPLAY[i][j], OUTPUT); 
     } 
     pinMode (PLAYER_LED[i], OUTPUT); 
     digitalWrite (PLAYER_LED[i], LOW); 
     pinMode (PLAYER_SWITCH[i], INPUT); 
    } 

    // initialize random number generator  
    randomSeed(analogRead(1)); 
} 

现在,由于我们的准备工作,主循环更简单,它的逻辑显而易见,使其更容易改变,更容易错误被发现。

void loop() 
{ 
    int score[2] = { 9, 9 }; 

    for (int i = 0; i < 2; i++) { 
     set_display (i, score[i]); 
    } 

    while (true) { 
     // turn on the leds in sequence 
     digitalWrite(PLAYER_LED[PLAYER1], HIGH); 
     delay(2000); 
     digitalWrite(PLAYER_LED[PLAYER2], HIGH); 
     delay(random(500,8000)); 
     digitalWrite(ALERT_LED, HIGH); 

     // get winner 
     int winner = get_winner(); 
     int loser = (winner == PLAYER1) ? PLAYER2 : PLAYER1; 

     // update score 
     score[loser]--; 
     set_display (loser, score[loser]); 

     // turn the leds off 
     digitalWrite(PLAYER_LED[PLAYER1], LOW); 
     digitalWrite(PLAYER_LED[PLAYER2], LOW); 
     digitalWrite(ALERT_LED, LOW); 

     // if the game is over, blink the winner's led and restart 
     if (score[loser] == 0) { 
      blink_led (PLAYER_LED[winner]); 
      delay(5000); 
      break; 
     } 

     delay(2000); 
    } 
} 

我希望你能从这些原理中学习。如果你不了解所有东西(特别是set_display()的工作),那就没关系。