首页 > 解决方案 > 如何在.h 中使用枚举的玩家之间切换?

问题描述

有谁知道为什么当我运行此代码时它会用于 P2_TURN 以及如何使这个枚举处于活动状态,当 P2 移动时,P1 会去,并且无论谁赢得了正确的语句,都会从 print_status() 中给出……还有更简单/更清洁的方法来分配获胜者。在 void process_move(struct game* p_game_info) 是否有一种方法可以用用户输入替换数字 0-8 而无需切换大小写……抱歉,这个查询有点混乱,但现在已经是凌晨 4 点了,所以希望你能原谅我…。

游戏.c

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "game.h"

  void play_game()
  {


  struct game *p_game_info = 0;
  p_game_info = malloc(sizeof(struct game));
  initialise_game (p_game_info, "John", "Annie");


   draw_banner();
  display_board(p_game_info->board);
  system("cls");

  display_board_positions ();
  draw_banner();




  process_move( p_game_info);


  display_board(p_game_info->board);


  print_status ( p_game_info );




  }

  void initialise_game(struct game* p_game_info, char* name1, char* name2)
  {





     for (int r=0; r<3; r++)
         for(int c=0; c<3; c++)
        p_game_info->board[r][c] = SPACE;
        display_board_positions ();
        p_game_info->status=P1_TURN;


       // p_game_info->finished = False;

    strncpy(p_game_info->playerNames[0], name1,MAX_NAME_LEN);
    strncpy(p_game_info->playerNames[1], name2,MAX_NAME_LEN);

   }

    void draw_banner(){


   printf("---------------\n");
   printf("  GAME STATUS  \n");
   printf("---------------\n");
  }

   void display_board(  char board[3][3]){
   printf("---------------\n");
   for (int i = 0; i < 3; i++)
   {
      for (int j = 0; j < 3; j++)
    {
        printf(" %c ", board[i][j]);
        if (j != 2)
            printf("|");
    }
    if (i != 2)
        printf("\n-----------");
    printf("\n");
   }
    printf("---------------\n");
  }

  void print_status (struct game*p_game_info ){

  if ((p_game_info->finished=False)&&
   (p_game_info->status=P1_TURN))
    {
        printf("John's Turn\n");
    }

  else if ((p_game_info->finished=False)&&
    (p_game_info->status=P2_TURN))
    {
        printf("Annie's Turn\n");
    }



    else if
    (p_game_info->status==P1_WON)
    {
        printf( "Well done John, you have won\n");
    }

    else if
     (p_game_info->status==P2_WON)
        {
            printf("Well done Annie, you have won\n");
        }
     else if
      (p_game_info->status==DRAW)
        {
            printf("Game Over It is a draw\n");
        }


       }

      void display_board_positions (){

      int count = 0;

      printf("---------------\n");

     for (int i = 0; i < 3; i++)
     {
      for (int j = 0; j < 3; j++)
      {
        printf(" %d ", count);
        count++;
        if (j != 2)
            printf("|");
    }
    if (i != 2)
        printf("\n-----------");

    printf("\n");
     }
     printf("---------------\n");

     }


    void  process_move(struct game* p_game_info){



  if (p_game_info->status==P1_TURN){
  printf("enter number for 'X' from 0-8\n");

   char ckey = (char) getchar();
    switch (ckey){
   case '0':
   if(p_game_info->board[0][0]==SPACE){
     p_game_info->board[0][0]=X_SYMBOL;
     }
    break;
   case '1':
   if(p_game_info->board[0][1]==SPACE){
    p_game_info->board[0][1]=X_SYMBOL;
    }
    break;
    case '2':
    if(p_game_info->board[0][2]==SPACE){
    p_game_info->board[0][2]=X_SYMBOL;
    }
    break;
    case '3':
    if(p_game_info->board[1][0]==SPACE){
    p_game_info->board[1][0]=X_SYMBOL;
   }
    break;
  case '4':
   if(p_game_info->board[1][1]==SPACE){
    p_game_info->board[1][1]=X_SYMBOL;
     }
   break;
  case '5':
   if(p_game_info->board[1][2]==SPACE){
    p_game_info->board[1][2]=X_SYMBOL;
   }
   break;
 case '6':
   if(p_game_info->board[2][0]==SPACE){
    p_game_info->board[2][0]=X_SYMBOL;
   }
    break;
  case '7':
    if(p_game_info->board[2][1]==SPACE){
    p_game_info->board[2][1]=X_SYMBOL;
   }
   break;
  case '8':
    if(p_game_info->board[2][1]==SPACE){
    p_game_info->board[2][1]=X_SYMBOL;
  }
    break;
  default:
   ;
  }p_game_info->status=P2_TURN
   }



  else if (p_game_info->status=P2_TURN){
   printf("enter number for 'O' from 0-8\n");

  char ckey = (char) getchar();
  switch (ckey){
  case '0':
    if(p_game_info->board[0][0]==SPACE){
    p_game_info->board[0][0]=O_SYMBOL;
    }
   break;
  case '1':
  if(p_game_info->board[0][1]==SPACE){
    p_game_info->board[0][1]=O_SYMBOL;
   }
   break;
   case '2':
   if(p_game_info->board[0][2]==SPACE){
    p_game_info->board[0][2]=O_SYMBOL;
  }
   break;
  case '3':
   if(p_game_info->board[1][0]==SPACE){
    p_game_info->board[1][0]=O_SYMBOL;
   }
   break;
 case '4':
   if(p_game_info->board[1][1]==SPACE){
    p_game_info->board[1][1]=O_SYMBOL;
   }
  break;
 case '5':
  if(p_game_info->board[1][2]==SPACE){
    p_game_info->board[1][2]=O_SYMBOL;
   }
  break;
  case '6':
   if(p_game_info->board[2][0]==SPACE){
    p_game_info->board[2][0]=O_SYMBOL;
   }
   break;
  case '7':
   if(p_game_info->board[2][1]==SPACE){
    p_game_info->board[2][1]=O_SYMBOL;
   }
    break;
   case '8':
   if(p_game_info->board[2][1]==SPACE){
    p_game_info->board[2][1]=O_SYMBOL;
   }
   break;
  default:
   ;
   }}
 }

  void finished_game(struct game* p_game_info){

     if((p_game_info->board[0][0]==O_SYMBOL)&&(p_game_info->board[0]           [1]==O_SYMBOL)&&(p_game_info->board[0][2]==O_SYMBOL)||

    (p_game_info->board[1][0]==O_SYMBOL)&&(p_game_info->board[1][1]==O_SYMBOL)&&       (p_game_info->board[1][2]==O_SYMBOL)||

    (p_game_info->board[2][0]==O_SYMBOL)&&(p_game_info->board[2][1]==O_SYMBOL)&&(p_game_info->board[2][2]==O_SYMBOL)||

    (p_game_info->board[0][0]==O_SYMBOL)&&(p_game_info->board[1][0]==O_SYMBOL)&&(p_game_info->board[2][0]==O_SYMBOL)||

    (p_game_info->board[0][1]==O_SYMBOL)&&(p_game_info->board[1][1]==O_SYMBOL)&&(p_game_info->board[2][1]==O_SYMBOL)||

    (p_game_info->board[0][2]==O_SYMBOL)&&(p_game_info->board[1][2]==O_SYMBOL)&&(p_game_info->board[2][2]==O_SYMBOL)||

   (p_game_info->board[0][0]==O_SYMBOL)&&(p_game_info->board[1][1]==O_SYMBOL)&&(p_game_info->board[2][2]==O_SYMBOL)||

   (p_game_info->board[0][2]==O_SYMBOL)&&(p_game_info->board[1][1]==O_SYMBOL)&&(p_game_info->board[2][0]==O_SYMBOL))
   {
    p_game_info->status=P2_WON;

    return;
   }



     else if((p_game_info->board[0][0]==X_SYMBOL)&&(p_game_info->board[0][1]==X_SYMBOL)&&(p_game_info->board[0][2]==X_SYMBOL)||

    (p_game_info->board[1][0]==X_SYMBOL)&&(p_game_info->board[1][1]==X_SYMBOL)&&(p_game_info->board[1][2]==X_SYMBOL)||

    (p_game_info->board[2][0]==X_SYMBOL)&&(p_game_info->board[2][1]==X_SYMBOL)&&(p_game_info->board[2][2]==X_SYMBOL)||

     (p_game_info->board[0][0]==X_SYMBOL)&&(p_game_info->board[1][0]==X_SYMBOL)&&(p_game_info->board[2][0]==X_SYMBOL)||

     (p_game_info->board[0][1]==X_SYMBOL)&&(p_game_info->board[1][1]==X_SYMBOL)&&(p_game_info->board[2][1]==X_SYMBOL)||

     (p_game_info->board[0][2]==X_SYMBOL)&&(p_game_info->board[1][2]==X_SYMBOL)&&(p_game_info->board[2][2]==X_SYMBOL)||

    (p_game_info->board[0][0]==X_SYMBOL)&&(p_game_info->board[1][1]==X_SYMBOL)&&(p_game_info->board[2][2]==X_SYMBOL)||

    (p_game_info->board[0][2]==X_SYMBOL)&&(p_game_info->board[1][1]==X_SYMBOL)&&(p_game_info->board[2][0]==X_SYMBOL))
    {
        p_game_info->status=P1_WON;

        return;
    }
   else
   {
       p_game_info->status=DRAW;
       return;
   }

 }

游戏.h

    #ifndef GAME_H_INCLUDED
    #define GAME_H_INCLUDED

    #define MAX_NAME_LEN 50
   enum Bool { False, True };
   enum status { P1_TURN, P2_TURN, P1_WON, P2_WON, DRAW };
   typedef enum Bool boolean;
   static const char SPACE= '-';
   static const char X_SYMBOL = 'X';
   static const char O_SYMBOL = 'O';

  struct game {
   char board[3][3];
   char playerNames[2][MAX_NAME_LEN];
   int status;
   boolean finished;
  };

  void play_game();
  void initialise_game(struct game* p_game_info, char* name1, char* name2);
  void draw_banner();
  void display_board(  char board[3][3]);
  void print_status (struct game*p_game_info );
  void display_board_positions ();
  void  process_move(struct game* p_game_info);
  void finished_game(struct game* p_game_info);
  #endif // game

电流输出---------------

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8


游戏状态

输入 0-8 的“O”数字

2

- | - | ○

- | - | -

- | - | -

进程返回 0 (0x0) 执行时间:7.731 s 按任意键继续。

标签: c

解决方案


你的问题确实很混乱。我不确定您真正想知道什么,但请注意“else if (p_game_info->status=P2_TURN){”是错误的。你需要一个双等号。


推荐阅读