2016-06-13 4 views
2

Что-то не так с моей функцией playerWin. Он продолжает говорить мне, что выиграл. Я чувствую, что я не поставил ни одного х на доске, чтобы выиграть. Что случилось с моей логикой? Это не домашнее задание. Я не программировал навсегда, и мой первый язык был Java. Я пытаюсь изучить C++ и выбрать tic tac toe, чтобы дать мне что-то делать.C++ Selection Statement true true

#include <iostream> 
using namespace std; 

int boardSize = 3; 
char board[3][3] = {'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n', 'n' }; 


void printBoard() { 
    for (int i=0; i < boardSize; i++) { 
    for (int j=0; j < boardSize; j++) { 
     cout << board[i][j] << " "; 
    } 
    cout << endl; 
    } 
} 

// void playerMove() { }; 

bool playerWin() { 
    if ((board[0][0] == 'x') && (board[1][0] == 'x') && 
     (board[2][0] == 'x') || 

     (board[0][1] == 'x') && (board[1][1] == 'x') && 
     (board[2][1] == 'x') || 

     (board[0][2] == 'x') && (board[1][2] == 'x') && 
     (board[2][2] == 'x') || 

     (board[0][0] == 'x') && (board[0][1] == 'x') && 
     (board[0][2] == 'x') || 

     (board[1][0] == 'x') && (board[1][1] == 'x') && 
     (board[1][2] == 'x') || 

     (board[2][0] == 'x') && (board[2][1] == 'x') && 
     (board[2][2] == 'x') || 

     (board[0][0] == 'x') && (board[1][1] == 'x') && 
     (board[2][2] == 'x') || 

     (board[2][0] == 'x') && (board[1][1] == 'x') && 
     (board[0][2] == 'x')) { 

     return true; 
    } 
} 

int main() { 

    // game loop 

    char play = 'y'; 

    cout << "Welcome to Tic Tac Toe\n"; 

    do { 

    if (playerWin()) { 
     cout << "Looks like you won!" << endl; 
    } else { 
     cout << "You didn't win!"; 
    } 

    break; 

    // after game is over ask if want to play again here 
    // cout << "Would you like to play Tic Tac Toe? \n"; 
    // cin >> play; 

    } while (play = 'y'); 
} 
+0

Возможный дубликат [Возвращаемое по умолчанию возвращаемое значение типа boolean type в C++] (http://stackoverflow.com/questions/7529432/default-return-value-of-a-boolean-type-return-function- in-c) –

ответ

4

Вы упускаете явный return false;, когда if заявление терпит неудачу.

Запустите поиск stackoverflow для «неопределенного поведения», для остальной части истории.

Если ваш компилятор кричал на вас, когда вы пытались скомпилировать это, пусть это будет урок: не игнорируйте свой компилятор, когда он кричит на вас.

Если ваш компилятор не кричал на вас, когда вы пытались скомпилировать это, найдите параметр предупреждения или параметр, который заставит компилятор кричать на вас в подобных ситуациях в будущем. Это сэкономит много царапин на голове.

+0

Это была проблема. Компилятор меня не предупредил. Я использую g ++ с cygwin. Мне нужно выяснить, как включить эти предупреждения. Спасибо! –

+2

@NickBlack: 'g ++ -Wall' –

1

Когда я скомпилирую ваш пример, у меня есть 10 предупреждений. Эти:

test.cpp:20:52: warning: '&&' within '||' [-Wlogical-op-parentheses] 
    if ((board[0][0] == 'x') && (board[1][0] == 'x') && 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ 
test.cpp:20:52: note: place parentheses around the '&&' expression to silence this warning 
    if ((board[0][0] == 'x') && (board[1][0] == 'x') && 
               ^
test.cpp:23:52: warning: '&&' within '||' [-Wlogical-op-parentheses] 
     (board[0][1] == 'x') && (board[1][1] == 'x') && 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ 
test.cpp:23:52: note: place parentheses around the '&&' expression to silence this warning 
     (board[0][1] == 'x') && (board[1][1] == 'x') && 
               ^

должно быть исправлено, но это не проблема. Это однако:

test.cpp:46:1: warning: control may reach end of non-void function [-Wreturn-type] 
} 
^ 

, вероятно, ваша проблема, и ее следует решать.

Кроме того, я нашел это:

test.cpp:71:17: warning: using the result of an assignment as a condition without parentheses [-Wparentheses] 
    } while (play = 'y'); 
      ~~~~~^~~~~ 
test.cpp:71:17: note: place parentheses around the assignment to silence this warning 
    } while (play = 'y'); 
       ^
      (  ) 
test.cpp:71:17: note: use '==' to turn this assignment into an equality comparison 
    } while (play = 'y'); 
       ^
       == 

и ваш компилятор говорит вам, что вы сделали задание, который смотрит на ваш код не то, что вы хотите сделать.

Я бы рекомендовал строить с -Wall и фиксировать предупреждения. Ваш компилятор пытается помочь.

+0

Спасибо большое! Я вижу ошибку присваивания присваивания, и мне придется исследовать с использованием флага -Wall. Я не очень разбираюсь во всем, но особенно с помощью командной строки. Я просто не хотел увязываться в среде IDE. Я хочу научиться использовать командную строку! Спасибо. –

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