我正在尝试使用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
}
}
答案 0 :(得分:1)
您正在为玩家制作副本:
// 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();