我正在尝试在具有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
,而不是p1
或p2
。因此,当您执行以下操作时menuPlayer = p2;
对
menuPlayer
所做的所有更改都将丢失,您将创建一个新副本。您可以通过在交换之前将
menuPlayer
复制到p1
来解决此问题:p1 = menuPlayer;
menuPlayer = p2;
或将
menuPlayer
设为Player*
:// Point to p1:
Player* menuPlayer = &p1;
// Changes p1
menuPlayer->IncrementMinutes();