我正在尝试在具有LCD键盘护罩的Arduino上编写国际象棋时钟。我几乎对C ++完全陌生,我认为它在处理类对象方面遇到麻烦。

在我的代码中,我有一个菜单,该菜单应允许玩家通过按小键盘上的左右按钮来更改他们可用的时间。这似乎起初是可行的,但是当我切换到其他播放器并使用向上和向下按钮再次返回时,minutes变量将重置为5分钟的默认值。

我的Player对象的处理方式我缺少什么?

boolean menuActive = true;

class Player {
  // Represents a player.
  public:
    int minutes;              // number of minutes allowed
    void IncrementMinutes();
    void DecrementMinutes();
};

void Player::IncrementMinutes() {
  this->minutes += 1;
}

void Player::DecrementMinutes() {
  if (this->minutes > 1) {
    this->minutes -= 1;
  }
}

Player p1 = {5, false, 1, "P1 mins: ", 0};
Player p2 = {5, false, 2, "P2 mins: ", 0};

Player menuPlayer = p1;

void setup()
{
 lcd.begin(16, 2);
 lcd.setCursor(0,0);
 lcd.print("ChessClock");
}

// Main loop
void loop()
{
 lcd_key = read_LCD_buttons();
 if (menuActive) {
   switch (lcd_key)
   {
     case btnRIGHT:
       {
        // increase minutes
        menuPlayer.IncrementMinutes();
        delay(250);
        break;
       }
     case btnLEFT:
       {
        // decrease minutes
        menuPlayer.DecrementMinutes();
        delay(250);
        break;
       }
     case btnUP:
       {
        // select player 1
        menuPlayer = p1;
        break;
       }
     case btnDOWN:
       {
        // select player 2
        menuPlayer = p2;
        break;
       }
     case btnNONE:
       {
       // display the current value for minutes
       lcd.print(menuPlayer.minutes);
       break;
       }
     }
 } else {
   // Main timer code
   }
}

最佳答案

您正在复制播放器:

// The actual players
Player p1 = {5, false, 1, "P1 mins: ", 0};
Player p2 = {5, false, 2, "P2 mins: ", 0};

// A COPY of player 1
Player menuPlayer = p1;


当您拨打类似

menuPlayer.IncrementMinutes();


您只是在更改menuPlayer,而不是p1p2。因此,当您执行以下操作时

menuPlayer = p2;


menuPlayer所做的所有更改都将丢失,您将创建一个新副本。

您可以通过在交换之前将menuPlayer复制到p1来解决此问题:

p1 = menuPlayer;
menuPlayer = p2;


或将menuPlayer设为Player*

// Point to p1:
Player* menuPlayer = &p1;

// Changes p1
menuPlayer->IncrementMinutes();

10-06 12:02