2015-08-28 2 views
0

Итак, у меня есть функция, которая контролирует поворот игрока, и я хочу, чтобы он возвращал FAILURE, когда игрок безуспешно совершает поворот. (Игра - это соединение 4). Я, очевидно, хочу, чтобы он возвращал успех, когда поворот действительно, однако ... Даже когда я возвращаю УСПЕХ, для этого требуется два возврата УСПЕХА, чтобы вернуть один успех. Вот код:Мое первое возвращаемое значение внутри функции ничего не возвращает

enum input_result take_turn(struct player * current, 
    enum cell_contents board[][BOARDWIDTH]) 
{ 
/***************** Logic for Human player ******************/ 
if(current->type == HUMAN) 
{ 
    printf("human"); 
    return SUCCESS; 
} 

/**************** Logic for Computer player ****************/ 
else if(current->type == COMPUTER) 
{ 
    printf("computer"); 
    return SUCCESS; 
} 
return SUCCESS; 
} 

И это называется этим:

struct player * play_game(struct player * human , 
    struct player* computer) 
{ 
while(counter < 30) 
{ 
    take_turn(current, board); 

    /* Only swap if take turn was success */ 
    if(take_turn(current, board) == SUCCESS) 
    { 
     swap_players(&current, &other); 
     display_board(board); 
    } 

    counter++; 
} 

return NULL; 
} 

Единственное, что я могу думать, что может быть губит это мое:

enum input_result 
{ 
/** 
* the input was valid 
**/ 
SUCCESS, 
/** 
* the input was not valld 
**/ 
FAILURE, 
/** 
* the user requested to return to the menu either by pressing enter on 
* an empty line or pressing ctrl-d on an empty line 
**/ 
RTM=-1 
}; 

Я не уверен почему take_turn (current, board) вызывается дважды, когда единственный возможный результат заключается в том, чтобы оператор if был введен как любое возможное возвращаемое значение SUCCESS. Кто-нибудь знает, почему это может случиться? Мой выход печати:

HumanHuman

ComputerComputer

HumanHuman

ComputerComputer

и так далее ... показывая, что он собирается через него в два раза, прежде чем успех зарегистрирован.

+0

Только для разъяснения: вам интересно, почему 'take_turn' все еще выполняется в if-условии, хотя он может только возвращать' SUCCESS', а код в if-clause ** должен быть выполнен? – Downvoter

+0

Да, мне интересно, почему он не входит в оператор if и вызывает обмен игроков, когда возвращается только возвращаемое возвращаемое значение. SUCCESS – Rrr

+0

Я проголосовал за закрытие этого вопроса как типографскую ошибку, которая не сможет быть (после того, как OP удалит дополнительный вызов 'take_turn()'. – mah

ответ

1

Ваша проблема здесь:

while(counter < 30) 
{ 
    take_turn(current, board); 

    /* Only swap if take turn was success */ 
    if(take_turn(current, board) == SUCCESS) 

Вы звоните take_turn() дважды.

+0

Я не понимал, что иметь его в выражении if, как это будет называть его снова ... Я не могу поверить, что я просто потратил, как 3 часа, пытаясь подумайте об этом ... duhhhhhh спасибо – Rrr

+0

Как вы пришли к такому выводу, когда даже вопрос Op не говорит, как он получает указанный результат? Или я просто случайно неправильно понял вопрос? –

+0

@rahultyagi это логическое объяснение того, что ОП сказал, что его выход содержит и почему он считает, что это неправильно. Он показывает код, который генерирует es, которые выводят, и он не ожидает выхода ... код оправдывает его. – mah

1

Вы заметили, что дважды вызываете take_turn в своем цикле? Один раз, не ища возвращаемого значения, а другой в вашем if-заявлении. избавиться от первого.

+0

Спасибо, rob, что на самом деле его решило! – Rrr

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