2014-12-11 2 views
1

Я пытаюсь изучить C++, и я сделал игру lict tictactoe, но что-то не так. Я попытался сделать класс победителя как пустотой, так и bool. Но когда я ввожу одну координату, она преформирует класс. Чтобы сделать его простым, вы можете выиграть только в том случае, если 3 сверху. О. Что случилось? так, если я вход: 0 0 он говорит победительC++ Проблемы с TicTacToe

Вот код:

#include <iostream> 

const int rows = 3; 
const int elements = 3; 

const char Ochar = 'O'; 

char board[rows][elements]; 

void Clear() 
{ 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < elements; j++) 
     { 
      board[i][j] = 0; 
     } 
    } 
} 

void Show() 
{ 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < elements; j++) 
     { 
      std::cout << " " << board[i][j] << " |"; 
     } 
     std::cout << std::endl; 
     std::cout << "------------" << std::endl; 
    } 
} 

bool PlayerAttack(int x, int y) 
{ 
    if (board[x][y] == 0) 
    { 
     board[x][y] = Ochar; 
     return true; 
    } 
    return false; 
} 

void Winner() 
{ 
    if (board[0][0], board[0][1], board[0][2] = 'O') 
    { 
     std::cout << "Winner"; 
    } 
} 

int main() 
{ 
    Clear(); 
    Show(); 
    int pos1 = 0; 
    int pos2 = 0; 
    while (1) 
    { 
     std::cout << "Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout <<  std::endl; 
     PlayerAttack(pos1, pos2); 
     Show(); 
     Winner(); 
    } 
} 
+3

Они называются функции, а не классы (Clear, Шоу, ...). – tmlen

+0

'if (board [0] [0], board [0] [1], board [0] [2] = 'O')' Это вопиющее заблуждение! Читайте о C++ [сравнение] (http://en.cppreference.com/w/cpp/language/operator_comparison) и [comma] (http://en.cppreference.com/w/cpp/language/operator_other) операторах , –

ответ

7

Эта линия не делает то, что вы думаете, что делает

if (board[0][0], board[0][1], board[0][2] = 'O') 

Вы должны были бы сделать

if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O') 

Чтобы использовать функцию Winner, чтобы разбить вашу петлю

bool Winner() 
{ 
    // You'll obviously have to check more than just this row 
    if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O') 
    { 
     std::cout << "Winner"; 
     return true; 
    } 
    return false; 
} 

Тогда в main

int main() 
{ 
    Clear(); 
    Show(); 
    int pos1 = 0; 
    int pos2 = 0; 
    bool winner = false; 
    while (!winner) 
    { 
     std::cout << "Please input a coordinate: "; std::cin >> pos1 >> pos2; std::cout <<  std::endl; 
     PlayerAttack(pos1, pos2); 
     Show(); 
     winner = Winner(); // Use the returned bool 
    } 
} 
+0

Но когда я выиграю, я хочу вырваться из цикла, как мне это сделать? –

+1

Этот код будет оценивать плату выражений [0] [0] и плату [0] [1] и плату [0] [2] последовательно, игнорировать значение первого 2 (оператор запятой) и назначать 'O' на борт [0] [2]. (= оператор присваивания, оператор сравнения будет ==). Comma редко используется и не может использоваться так. Затем он возвращает присвоенное значение «O». Поскольку «O» (ака код ASCII-символа) не равен нулю, conditionnal имеет значение true, и он входит в блок и печатает «Winner». – tmlen

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