2016-12-12 12 views
2

Игровая доска хранится в виде массива 2D-символов. Игрок перемещает свой курсор по доске с помощью numpad и выбирает с введенным курсором текущим положением курсора, который хранится в двух интервалах.Консоль C++ TicTacToe: проверка условий выигрыша

После каждого шага плата оценивается для выигрыша, используя метод ниже.

void checkwin() 
{ 
    //look along lines from current position 
    int x = cursorPosX; 
    int y = cursorPosY; 
    int c = playerTurn ? 1 : 2; //which mark to look for 

    for (int xAxis = 0; xAxis <= 2; xAxis++) //look along x axis 
    { 
     x = WrapValue(0, sizeof(squares[0]), x + 1); 
     if (CheckPos(x, y) != c) //if we don't find the same mark, must not be a horizontal line, otherwise, break out. 
     { 
      x = cursorPosX; //reset x 
      for (int yAxis = 0; yAxis <= 2; yAxis++) //look along y axis 
      { 
       y = WrapValue(0, sizeof(squares[0]), y + 1); 
       if (CheckPos(x, y) != c) 
       { 
        y = cursorPosY; 
        //look for diagonal 
        for (int i = 0; i <= 2; i++) 
        { 
         x = WrapValue(0, sizeof(squares[0]), x + 1); 
         y = WrapValue(0, sizeof(squares[0]), y + 1); 
         if (CheckPos(x, y) != c) 
         { 
          //failed everything, return 
          winConditions = -1; 
          return; 
         } 
        } 
        break; 
       } 
      } 
      break; 
     } 
    } 
    //if we make it out of the loops, we have a winner. 
    winConditions = playerTurn ? 0 : 1; 
} 

Я получаю неправильные результаты - возвращает ничью или выигрывает, когда это не подходит. Я почти уверен, что x и y в какой-то момент имеют неправильные значения и начинают проверять неправильные точки.

Visual Studio перестает обновлять часы на x и y после перехода в цикл yAxis. Я не уверен, почему, но это мешает мне отслеживать эти значения. Я что-то нарушаю? Это единственное место, где я использую x и y как имена переменных.

Соответствующий метод обертывания ниже. Моя цель состояла в том, чтобы всегда быть в состоянии проверить другие 2 места, добавив, независимо от того, где я был на борту

int WrapValue(int min, int max, int value) 
{ 
    auto range = max - min; 

    while (value >= max) 
    { 
     value -= range; 
    } 
    while (value < min) 
    { 
     value += range; 
    } 

    return value; 
} 

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

+1

Знаете ли вы, как отлаживать? Если нет: это идеальное время, чтобы изучить его. – Gewure

+1

Где бы вы предложили начать? – Luke

+1

Предлагаю: 1) скомпилировать программу с отладочной информацией; 2) Запустите программу в отладчике; 3) Используйте команду * next * statement для выполнения следующей инструкции и значений переменных представления; 4) Шаг * в * функции и посмотреть, как они работают. Найдите в Интернете «C++, как отлаживать небольшие программы». –

ответ

1

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

for (int xAxis = 0; xAxis <= 2; xAxis++) //look along x axis 
{ 
    x = WrapValue(0, sizeof(squares[0]), x + 1); 
    if (CheckPos(x, y) != c) //if we don't find the same mark, must not be a horizontal line, otherwise, break out. 
    { 
     x = cursorPosX; //reset x 
     break; 
    } 
    else if (xAxis == 2) 
    { 
     winConditions = playerTurn ? 0 : 1; 
     return; 
    } 
} 

for (int yAxis = 0; yAxis <= 2; yAxis++) //look along y axis 
{ 
    y = WrapValue(0, sizeof(squares[0]), y + 1); 
    if (CheckPos(x, y) != c) 
    { 
     y = cursorPosY; 
     break; 
    } 
    else if (yAxis == 2) 
    { 
     winConditions = playerTurn ? 0 : 1; 
     return; 
    } 
} 
...ect 

Это нарушает СУХОЙ, но это не работает так, как это предполагается, я уверен, что я могу упростить его позже.

Хотя я не совсем уверен, почему предыдущий способ не сработал, я понимаю, что это был просто плохая конструкция.

+0

Я должен помнить, что принимаю через 2 дня, но я думаю, что этот вопрос можно закрыть сейчас, так как проблема решена. – Luke

+0

Причина, по которой ваша проблема заключается в том, что вы объявляли новые x и y во внутренних циклах, которые маскировали внешние определения. Хотя это юридический код, ваш компилятор должен был предупредить вас. Вы игнорируете предупреждения? – stark

+0

Я всегда слушаю предупреждения, будь то от матери или моего компилятора. Итак, вы говорите, когда я присваиваю значение переменной, инициализированной вне цикла, она инициализирует новую переменную с тем же именем? Хотя я никогда не инициализировал явно? Интересно, можете ли вы связать меня с чем-то, что объясняет это? – Luke

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

  • Нет связанных вопросов^_^