【问题标题】:Occupied Position in Tic-Tac-Toe Game [C]井字游戏中的占据位置 [C]
【发布时间】:2013-06-30 20:07:48
【问题描述】:

关于此代码的一个问题:如果玩家选择的选项已经被选择,我如何让他/她再次选择?

如果我现在编译代码,它会改变用户选择的位置,这不会发生。

Obs:井字游戏的“绘图”应该出现在此之前("\nInform your choice (1-9): "

这是代码:

char mat[9];

int main(void)
{
  int i,jogada,casa,jogo=0;

  for(i=0; i<= 9; i++) 
    mat[i] = ' ';

 do{
  printf("\n");
  printf("\t|\t|\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n",mat[1],mat[2],mat[3]);
  printf("--------|-------|-------\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n",mat[4],mat[5],mat[6]);
  printf("--------|-------|-------\n");
  printf("\t|\t|\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n\n",mat[7],mat[8],mat[9]);
  printf("\nJOGADOR X ");
  printf("\nInforme uma posicao livre (1-9): ");
  scanf("%d",&casa);
  }while((casa>=1)&&(casa<=9));

  if((casa>=1)&&(casa<=9))
  {

  if(mat[casa] == 'X' || mat[casa] == 'O')
     printf(" ");
  else     
     mat[casa] = 'X';

  }      
  printf("\n");
  printf("\t|\t|\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n",mat[1],mat[2],mat[3]);
  printf("--------|-------|-------\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n",mat[4],mat[5],mat[6]);
  printf("--------|-------|-------\n");
  printf("\t|\t|\n");
  printf("\t|\t|\n");
  printf("%c\t|%c\t|%c\n\n",mat[7],mat[8],mat[9]);



  if(mat[1] != ' ' && mat[1] == mat[2] && mat[2] == mat[3]) {
              jogo++;
              printf("X Ganhou!\n"); 
              break;  }
       else if(mat[4] != ' ' && mat[4] == mat[5] && mat[5] == mat[6]) {
              printf("X Ganhou!\n");
              jogo++;
              break; }
       else if(mat[7] != ' ' && mat[7] == mat[8] && mat[8] == mat[9]) {
              printf("X Ganhou!\n");
              jogo++;
                break; }
       else if(mat[1] != ' ' && mat[1] == mat[4] && mat[4] == mat[7]) {
              printf("X Ganhou!\n");
              jogo++; 
                break;}
       else if(mat[2] != ' ' && mat[2] == mat[5] && mat[5] == mat[8]) {
              printf("X Ganhou!\n");
              jogo++;
                break; }
       else if(mat[3] != ' ' && mat[3] == mat[6] && mat[6] == mat[9]) {
              printf("X Ganhou!\n");
              jogo++;
                break; }
       else if(mat[1] != ' ' && mat[1] == mat[5] && mat[5] == mat[9]){ 
               printf("X Ganhou!\n");
              jogo++; 
                break;}
       else if(mat[7] != ' ' && mat[7] == mat[5] && mat[5] == mat[3]) { 
               printf("X Ganhou!\n"); 
              jogo++;
                break; }
       else if((mat[1] != ' ') && (mat[2] != ' ') && (mat[3] != ' ') && (mat[4] != ' ') && (mat[5] != ' ') && (mat[6] != ' ') && (mat[7] != ' ') && (mat[8] != ' ') && (mat[9] = ' ')){
                printf("Velha!\n");
                jogo++;
                break;
                }

     printf("\nJOGADOR O ");
     printf("\nInforme uma posicao livre (1-9): ");
     scanf("%d",&casa);
     if((casa>=1)&&(casa<=9))
     {

     if(mat[casa] == 'X' || mat[casa] == 'O')
     ;
     else     
        mat[casa] = 'O';

     }            
     printf("\n");
     printf("\t|\t|\n");
     printf("\t|\t|\n");
     printf("%c\t|%c\t|%c\n",mat[1],mat[2],mat[3]);
     printf("--------|-------|-------\n");
     printf("\t|\t|\n");
     printf("%c\t|%c\t|%c\n",mat[4],mat[5],mat[6]);
     printf("--------|-------|-------\n");
     printf("\t|\t|\n");
     printf("\t|\t|\n");
     printf("%c\t|%c\t|%c\n\n",mat[7],mat[8],mat[9]);


       if(mat[1] != ' ' && mat[1] == mat[2] && mat[2] == mat[3]) {
              printf("O Ganhou!\n");  
              jogo++;
                break; }
       else if(mat[4] != ' ' && mat[4] == mat[5] && mat[5] == mat[6]) {
              printf("O Ganhou!\n");
              jogo++;
                break; }
       else if(mat[7] != ' ' && mat[7] == mat[8] && mat[8] == mat[9]) {
              printf("O Ganhou!\n");
              jogo++;
                break; }
       else if(mat[1] != ' ' && mat[1] == mat[4] && mat[4] == mat[7]) {
              printf("O Ganhou!\n");
              jogo++;
                break; }
       else if(mat[2] != ' ' && mat[2] == mat[5] && mat[5] == mat[8]) {
              printf("O Ganhou!\n");
              jogo++; 
                break;}
       else if(mat[3] != ' ' && mat[3] == mat[6] && mat[6] == mat[9]) {
              printf("O Ganhou!\n");
              jogo++;
                break; }
       else if(mat[1] != ' ' && mat[1] == mat[5] && mat[5] == mat[9]){ 
               printf("O Ganhou!\n");
              jogo++; 
                break;}
       else if(mat[7] != ' ' && mat[7] == mat[5] && mat[5] == mat[3]) { 
               printf("O Ganhou!\n"); 
              jogo++;
                break; }
      else if((mat[1] != ' ') && (mat[2] != ' ') && (mat[3] != ' ') && (mat[4] != ' ') && (mat[5] != ' ') && (mat[6] != ' ') && (mat[7] != ' ') && (mat[8] != ' ') && (mat[9] = ' ')){
                printf("Velha!\n");
                jogo++;
                break;
                }

}

  system("PAUSE");  
  return 0;
}

【问题讨论】:

  • 这看起来很像家庭作业。到目前为止,您尝试了什么,发生了什么?
  • 这段代码不应该对用户输入做任何事情,因为除了 scanf 之外永远不会使用 casa
  • 我发布了错误的代码,抱歉 =/。作业是做井字游戏,唯一不能做的就是这部分。
  • 请注意,您不能使用mat[9],因为mat 的长度为9,所以最后一个元素是mat[8]。 (以mat[0]开头!)
  • 但我没有使用 mat[0] 位置,这不会影响代码。

标签: c


【解决方案1】:

如果玩家选择的选项已经被选中,我该如何让他/她再次选择?

在 2 个位置(X 和 O)更改您的 scanf()

do {
  printf("\nInforme uma posicao livre (1-9): ");
  scanf("%d",&casa);
} while( (casa<1) || (casa>9) || (mat[casa] != ' ') );

你确实有一个更大的问题。

char mat[9] 更改为char mat[10]。您在整个代码中将 mat[] 从 1 索引到 9。但是char mat[9] 只允许 mat[0] 到 mat[8]。快速解决方法是使 mat[] 1 char 更长而不使用 mat[0]。保持 for(i=0; i&lt;= 9; i++) 不变。

  • 或者-

适当的解决方法是保留char mat[9] 并将所有许多mat[i] 引用更改为mat[i-1]。例如mat[5] 变成 mat[4]。改为for(i=0; i &lt; 9; i++)


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多