2016-02-14 5 views
0

Я пытаюсь написать шахматные часы на 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 
    } 
} 

ответ

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(); 
+0

Ах, я думал, что этот вопрос в этой строке. Благодарю. Еще один вопрос - как переключить «menuPlayer», если это указатель? Мои кнопки 'btnUP' и' btnDOWN' дают мне следующее: 'error: невозможно преобразовать 'Player' в 'Player *' при назначении menuPlayer = p1;' –

+0

Nevermind, я понял это. Мне нужно было изменить 'menuPlayer = p1;' на 'menuPlayer = &p1;' в функции 'btnUP' и то же самое для' p2' и 'btnDOWN'. –

Смежные вопросы