2016-03-25 2 views
-4

EDIT: Решил теперь поблагодарить triple_r и AJNeufield за вашу помощь по этой проблеме, которую я имел.Невозможно разобраться, как петли playerturns и движется Tic Tac Toe (C++)

Я просмотрел несколько веб-сайтов и YouTube об этом, и я не могу найти что-либо в том, что я специально ищу для этого, так как мой формат для программы - это хороший бит, отличный от других. Поэтому трудно расшифровать, где мне нужно, чтобы вещи, которые мне нужны, я знаю.

Обратите внимание, что я относительно не знаком с C++, поэтому я был бы признателен за все отзывы или критику, которые вы могли бы мне предоставить.

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

Quick Edit: переключил код с новой настройкой, предложенной triple_r, но я, казалось, перепутал его где-то вдоль линии, и он компилируется (за исключением использования x и y и другой ошибки), но он всегда начинается с первого игрока 2, и как только он получает вход, он автоматически заканчивается ошибкой сегментации.

#include <iostream> 
#include <cstdlib> 
using namespace std; 
////////////////////////////////////////////////////////// 
void initboard(char board[3][3]) 
{ 
    int x,y; 
    for (x=0;x<3;x++) 
      for (y=0;y<3;y++) 
      board[x][y]=' '; 
    return; 
} 
////////////////////////////////////////////////////////// 
void printboard(char board[3][3]) 
{ 
    int x,y; 
    for (x=0;x<3;x++) 
    { 
     cout<<"\n"; 
     for (y=0;y<3;y++) 
     { 
      cout<<" "<<board[x][y]<<" "; 
      if (y<2) cout<<"|"; 
     } 
     if (x<2) cout<<"\n==========="; 
    } 
    return; 
} 
////////////////////////////////////////////////////////// 
void getmove(char board[3][3], int player) 
{ 
    return; 
} 
////////////////////////////////////////////////////////// 
int main() 
{ 
    bool done=false; 
    char board[3][3]; 
    int x,y,player=1,turn,playerchoice,playermark; 

    initboard(board); 
    turn=0; 
    do 
    { 
     if (player==1) 
      playermark='X'; 
     else 
      playermark='O'; 
     if (turn%2) 
      player=1; 
     else 
      player=2; 

     cout<<"Player "<<player<<" where do you want to move?: "; 
     cin>>playerchoice; 
     if (playerchoice==1) 
     { 
      board[0][0]=playermark; 
     } 
     else if (playerchoice==2) 
     { 
      board[0][1]=playermark; 
     } 
     else if (playerchoice==3) 
     { 
      board[0][2]=playermark; 
     } 
     else if (playerchoice==4) 
     { 
      board[1][0]=playermark; 
     } 
     else if (playerchoice==5) 
     { 
      board[1][1]=playermark; 
     } 
     else if (playerchoice==6) 
     { 
      board[1][2]=playermark; 
     } 
     else if (playerchoice==7) 
     { 
      board[2][0]=playermark; 
     } 
     else if (playerchoice==8) 
     { 
      board[2][1]=playermark; 
     } 
     else if (playerchoice==9) 
     { 
      board[2][2]=playermark; 
     } 
     else 
     { 
      cout<<"Invalid move "; 
     } 
     if (board[x][y]!=' ') 
      cout<<"Move is already taken."; 
     board[x][y]=playermark; 

     if(board[x][y]==' ') 
      turn++; 
    }while (!done); 
    void printboard(char board[3][3]); 
    return 0; 
} 

ответ

0

EDIT: на основе обновленного кода

Итак, первая вещь, которую я могу видеть, что вы используете x и y в вашей программе, но вы не инициализировать их или присвоить какое-либо значение. Кроме того, попробуйте использовать функции/classes/... yo, чтобы ваш код стал более читаемым. У вас уже есть функция перемещения игрока, но вы его не используете. Вы можете перемещать большой оператор if внутри этой функции, что сделает ваш основной код короче и читабельнее.

Вот мои комментарии по основной части программы:

int main() 
{ 
    // add a new variable to see if the move was valid or not: 
    bool done=false, validmove = true; 
    char board[3][3]; 
    int x, y, player = 1, turn = 0, playerchoice, playermark; 

    initboard(board); 
    do 
    { 
     // swap the two `if`s so you decide who`s turn it is then assign the player mark, 
     // also, reverse the condition to make sure turn '0' is player 1's turn. 
     if (!(turn % 2)) 
      player = 1; 
     else 
      player = 2; 
     if (player == 1) 
      playermark = 'X'; 
     else 
      playermark = 'O'; 

     cout << "Player " << player << " where do you want to move?: "; 
     cin >> playerchoice; 

     // Assign `x` and `y` here instead of updating the board, because you want to make 
     // sure that the move is valid before putting the mark: 
     validmove = true; 
     if (playerchoice == 1) 
     { 
      x = 0; y = 0; 
     } 
     else if (playerchoice == 2) 
     { 
      x = 0; y = 1; 
     } 
     else if (playerchoice == 3) 
     { 
      x = 0; y = 2; 
     } 
     else if (playerchoice == 4) 
     { 
      x = 1; y = 0; 
     } 
     else if (playerchoice == 5) 
     { 
      x = 1; y = 1; 
     } 
     else if (playerchoice == 6) 
     { 
      x = 1; y = 2; 
     } 
     else if (playerchoice == 7) 
     { 
      x = 2; y = 0; 
     } 
     else if (playerchoice == 8) 
     { 
      x = 2; y = 1; 
     } 
     else if (playerchoice == 9) 
     { 
      x = 2; y = 2; 
     } 
     else 
     { 
      cout << "Invalid move, try again!"; 

      // Make sure to mark the move as invalid so they get a chance to 
      // change their move: 
      validmove = false; 
     } 

     // check to see if the turn was valid: 
     if(validmove) 
     { 
      if (board[x][y] != ' ') 
      { 
       cout << "Move is already taken, try again"; 
      } 
      else 
      { 
       board[x][y] = playermark; 
       turn++; 
      } 
     } 

     // have to make sure you have a condition for end of game. A simple 
     // one is to check if turn is less than `9`, otherwise the board is 
     // full: 
     if(turn == 9) 
      done = true; 

     // you probably want to add a few more checks to see who won the game. 
    }while (!done); 

    // when calling a function, no need to put the return type or parameter type: 
    printboard(board); 
    return 0; 
} 

=========================== ============================================

это две петли do-while в вашей программе, и оба они кажутся как игровой цикл. Что я буду делать, это:

initboard(...); 
turn = 0; 
do{ 
    //this is the game loop 
    ...; 
    if(validturn) 
     turn++; 
}while(!done); 
release_resources(...); 
return 0; 

так, вы сложите все в одну петлю.В этом цикле, вы хотите:

  1. находки, кто превратить это:

    if (turn % 2) 
        player = 1; 
    else 
        player = 2; 
    
  2. получает пользователь входа:

    выбора
    std::cin >> playerchoice; 
    ... 
    
  3. новообращенного игрока на место сетки:

    switch (move) 
    { 
        case 0: 
         x = 0; 
         y = 0; 
         break; 
        case 1: 
         ...; 
        ... 
        default: 
         //invalid move 
    } 
    
  4. увидеть, если движение действительно:

    if(board[x][y] != ' ') 
        //already taken, invalid move 
    
  5. затем применить ход:

    board[x][y] = playermark; 
    

Я надеюсь, что это помогает.

+0

Спасибо за помощь, я попробую это triple_r. – Sollux

+0

Хорошо, я сделал то, что вы предложили triple_r, но теперь он автоматически устанавливает плеер на плеер 2 и дает мне ошибки сегментации, когда я иду на вход. Это после того, как я изменил его с того, что было, когда я изменил его на то, что вы предложили изначально с помощью оператора switch, который дал мне постоянное указание, что перемещение недействительно вместо ввода перемещения и вывода платы с перемещением по ней. Должен ли я переписать свой код для вас? Прошу прощения за неудобства. – Sollux

+0

Было бы намного проще, если бы вы перекомпилировали свой код :-) Вероятно, вы должны отредактировать свой вопрос, чтобы добавить новый код, и таким образом больше людей смогут увидеть обновленный код и помочь вам найти, в чем проблема. –

0

Ваш cin >> playerchoice находится за пределами do { ... } while (moves != 9); цикла. Переместите его внутрь.

+0

Благодарим за отзыв AJNeufield, как только я это сделал, хотя сделал так, что программа не будет работать полностью. Как только он собирает вход, он просто оставляет его там, не продолжая цикл и распечатывая доску. – Sollux