2015-04-25 2 views
1

Извините, ребята, я просто задал вопрос пару часов назад, но это последнее, что мне нужно для завершения моего проекта. Моя программа позволяет перезаписать ходы. Например, если игрок 1 выбирает первый квадрат, он позволит игроку 2 также выбрать этот квадрат. Все остальное отлично функционирует, я просто не справлялся с этим.Остановить Tic Tac Toe от переписывания движется в C

Любые идеи? Я просто поместил одну часть своего кода, так как много моего кода печально скопировано и вставлено. Я действительно новичок, поэтому я еще не понял оптимизацию, и у меня уже нет времени для этого проекта, поэтому любая помощь будет оценена по достоинству.

Так что в этом коде я включил только печать оригинальной доски и первый ход первого игрока (если играю с двумя людьми). Этого должно быть достаточно, чтобы получить помощь, но если кто-то хочет увидеть остальную часть кода, пожалуйста, дайте мне знать, поскольку я упустил большинство из них. Спасибо !!!

#include <stdio.h> 
#include <stdlib.h> 

/* known bugs: Allows players to place a 1 or 2 on board even if there is already a 1 or 2 in that spot. */ 

int main() 
{ 
    char board[3][3]; 
    int i,j,k,l, player, move; 

    for(i=0;i<=3;i++) // prints initial board of 0's 
    { 
     for(j=0;j<=3;j++) 
     { 
      board[i][j] = '0'; 
     } 
    } 


    printf("Hello! Do you want to play alone or with a computer? \n\n" 
      "Enter 1 for alone or 2 to play with a friend!\n"); 
    scanf("%d", &player); 

    if (player == 2) 
    { 
     for(k=0;k<9;k++) // 9 moves max. 
     { 
      printf("\n\n"); // print board again. 
      printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); 
      printf("---+---+---\n"); 
      printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); 
      printf("---+---+---\n"); 
      printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); 

      do 
      { 
       printf("Player 1, where would you like to move? Enter 1-9\n"); 
       scanf("%d", &move); 

       if (move == 1) 
        board[0][0] = '1'; 
       if (move == 2) 
        board[0][1] = '1'; 
       if (move == 3) 
        board[0][2] = '1'; 
       if (move == 4) 
        board[1][0] = '1'; 
       if (move == 5) 
        board[1][1] = '1'; 
       if (move == 6) 
        board[1][2] = '1'; 
       if (move == 7) 
        board[2][0] = '1'; 
       if (move == 8) 
        board[2][1] = '1'; 
       if (move == 9) 
        board[2][2] = '1'; 

      }while(move>9 && move <1); 
+0

BTW 'i <= 3',' j <=3' --> 'i <3',' j <3' – BLUEPIXY

+0

Спасибо! Я пропустил это, но он все еще работал lol –

+0

'if (move == 1 && board [0] [0] == '0') board [0] [0] = '1';' – BLUEPIXY

ответ

0
  1. Я хотел бы предложить использовать случай переключения в последний раз? Во время цикла (смотри пример)
  2. Я думаю, вам просто нужно проверить, если поле вы ссылаетесь уже приняты!

** check() **

void check (char *c, int *move){ 
    if(*c == '0'){ 
     *c = '1'; 
    }else { 
     printf("\nThis field is already taken! Please choose another one.\n"); 
     /* since you repeat this as long as move is bigger than 9 or smaller 
      than 1, this will have the user make another choice. */ 
     *move = 0; 
    } 
} 

** Ваша последняя делать во время **

do { 
    printf("Player 1, where would you like to move? Enter 1-9\n"); 
    scanf("%d", &move); 

    switch (move){ 
     case 1: 
      check(&board[0][0], &move); 
      break; 
     case 2: 
      check(&board[0][1], &move); 
      break; 
     case 3: 
      check(&board[0][2], &move); 
      break; 
     case 4: 
      check(&board[1][0], &move); 
      break; 
     case 5: 
      check(&board[1][1], &move); 
      break; 
     case 6: 
      check(&board[1][2], &move); 
      break; 
     case 7: 
      check(&board[2][0], &move); 
      break; 
     case 8: 
      check(&board[2][1], &move); 
      break; 
     case 9: 
      check(&board[2][2], &move); 
      break; 
     default: 
      printf("\nError! Choose a field between 1 and 9\n"); 
    } 

}while(move>9 || move <1); 

Примечание: как другие сказали, ваши для-петли необходимо, чтобы перебирать, пока я/j < 3, так как ваш массив имеет размер 3 (индексы 0, 1, 2);

Примечание 2: Оператор while должен быть move > 9 OR move < 1, так как int не может быть больше 9 и меньше 1 в одно и то же время, что приведет к бесконечному циклу.

1

Когда вы объявляете массив размера N, индексы идут от нуля до X минус один.

Таким образом, в вашем случае индексы 0 - 2 для массивов board. Ваши петли в функции main идут от 0 до 3, т. Е. Вне пределов.

Запись в массив за пределами границ ведет к undefined behavior, а неопределенное поведение делает вашу программу плохо сформированной. Неопределенное поведение (или UB) может вызвать любые проблемы, в том числе , казалось бы, работы, только к следующему моменту привести к nasal demons.

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

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