Pages

Jeu othello - erreurs à la compilation sujet

vendredi 31 janvier 2014




bonsoir a tous j'ai un problème avec mon code source quand je le compile il m"affiche que j'ai deux erreurs que je n'arrive pas a trouver et tous truc que je modifie change tout le reste quelqu'un pourrai-t-il m'aider c'est pour un jeu othello que je fais sur codeblocks


Code:


#include <stdio.h>
#include <ctype.h>



void affiche_tableau()
{
  char tab [8][8] = { 0 };  /* The board          */
  int moves[0][0] = { 0 };    /* Valid moves        */
  int row = 0;                      /* Board row index    */
  int col = 0;                      /* Board column index  */
  int no_of_games = 0;              /* Number of games    */
  int no_of_moves = 0;              /* Count of moves      */
  int invalid_moves = 0;            /* Invalid move count  */
  int comp_score = 0;              /* Computer score      */
  int user_score = 0;              /* Player score        */
  char y = 0;                      /* Column letter      */
  int x = 0;                        /* Row number          */
  char again = 0;                  /* Replay choice input */
  int player = 0;                  /* Player indicator    */

  printf("\nREVERSI\n\n");
  printf("You can go first on the first game, then we will take turns.\n");
  printf("  You will be white - (0)\n  I will be black  - (1).\n");
  printf("Select a square for your move by typing a digit for the row\n "
    "and a letter for the column with no spaces between.\n");
  printf("\nGood luck!  Press Enter to start.\n");
  scanf("%c", &again);

  /* Prompt for how to play - as before */

  /* The main game loop */
  do
  {
    /* On even games the player starts; */
    /* on odd games the computer starts */
    player = ++no_of_games % 2;
    no_of_moves = 4;                /* Starts with four counters */

    /* Blank all the board squares */
    for(row = 0; row < 8; row++)
      for(col = 0; col < 8; col++)
        tab[row][col] = ' ';

    /* Place the initial four counters in the center */
    tab[8/2 - 1][8/2 - 1] = tab[8/2][8/2] = '0';
    tab[8/2 - 1][8/2] = tab[8/2][8/2 - 1] = '1';

    /* The game play loop */
    do
    {
      display(tab);            /* Display the board  */
      if(player++ % 2)
      { /*  It is the player's turn                    */
        if(valid_moves(tab, moves, '0'))
        {
          /* Read player moves until a valid move is entered */
          for(;;)
          {
            fflush(stdin);              /* Flush the keyboard buffer */
            printf("Please enter your move (row column): ");
            scanf("%d%c", &x, &y);              /* Read input        */
            y = tolower(y) - 'a';        /* Convert to column index */
            x--;                          /* Convert to row index    */
            if( x>=0 && y>=0 && x<8 && y<8 && moves[x][y])
            {
              make_move(tab, x, y, '0');
              no_of_moves++;              /* Increment move count */
              break;
            }
            else
              printf("Not a valid move, try again.\n");
          }
        }
        else                              /* No valid moves */
          if(++invalid_moves<2)
          {
            fflush(stdin);
            printf("\nYou have to pass, press return");
            scanf("%c", &again);
          }
          else
            printf("\nNeither of us can go, so the game is over.\n");
      }
      else
      { /* It is the computer's turn                    */
        if(valid_moves(tab, moves, '1')) /* Check for valid moves */
        {
          invalid_moves = 0;              /* Reset invalid count  */
          computer_move(tab, moves, '1');
          no_of_moves++;                  /* Increment move count  */
        }
        else
        {
          if(++invalid_moves<2)
            printf("\nI have to pass, your go\n"); /* No valid move */
          else
            printf("\nNeither of us can go, so the game is over.\n");
        }
      }
    }while(no_of_moves < 8*8 && invalid_moves<2);

    /* Game is over */
    display(tab);  /* Show final board */

    /* Get final scores and display them */
    comp_score = user_score = 0;
    for(row = 0; row < 8; row++)
      for(col = 0; col < 8; col++)
      {
        comp_score += tab[row][col] == '1';
        user_score += tab[row][col] == '0';
      }
    printf("The final score is:\n");
    printf("Computer %d\n    User %d\n\n", comp_score, user_score);

    fflush(stdin);              /* Flush the input buffer */
    printf("Do you want to play again (y/n): ");
    scanf("%c", &again);        /* Get y or n            */
  }while(tolower(again) == 'y'); /* Go again on y          */

  printf("\nGoodbye\n");
}

/***********************************************
 * Function to display the board in it's      *
 * current state with row numbers and column  *
 * letters to identify squares.                *
 * Parameter is the board array.              *
 ***********************************************/
void display(char tab[][8])
{
  int row  = 0;          /* Row index      */
  int col = 0;          /* Column index  */
  char col_label = 'a';  /* Column label  */

  printf("\n ");        /* Start top line */
  for(col = 0 ; col<8 ;col++)
    printf("  %c", col_label+col); /* Display the top line */
  printf("\n");                    /* End the top line    */

  /* Display the intermediate rows */
  for(row = 0; row < 8; row++)
  {
    printf("  +");
    for(col = 0; col<8; col++)
      printf("---+");
    printf("\n%2d|",row + 1);

    for(col = 0; col<8; col++)
      printf(" %c |", tab[row][col]);  /* Display counters in row */
    printf("\n");
  }

  printf("  +");                  /* Start the bottom line  */
  for(col = 0 ; col<8 ;col++)
    printf("---+");              /* Display the bottom line */
  printf("\n");                  /* End the bottom  line    */
}

/***********************************************
/* Calculates which squares are valid moves    *
 * for player. Valid moves are recorded in the *
 * moves array - 1 indicates a valid move,    *
 * 0 indicates an invalid move.                *
 * First parameter is the board array          *
 * Second parameter is the moves array        *
 * Third parameter identifies the player      *
 * to make the move.                          *
 * Returns valid move count.                  *
 ***********************************************/
int valid_moves(char tab[][8], int moves[][8], char player)
{
  int rowdelta = 0;    /* Row increment around a square    */
  int coldelta = 0;    /* Column increment around a square */
  int row = 0;          /* Row index                        */
  int col = 0;          /* Column index                    */
  int x = 0;            /* Row index when searching        */
  int y = 0;            /* Column index when searching      */
  int no_of_moves = 0;  /* Number of valid moves            */

  /* Set the opponent            */
  char opponent = (player == '0')? '1' : '0';

  /* Initialize moves array to zero */
  for(row = 0; row < 8; row++)
    for(col = 0; col < 8; col++)
      moves[row][col] = 0;

  /* Find squares for valid moves.                          */
  /* A valid move must be on a blank square and must enclose */
  /* at least one opponent square between two player squares */
  for(row = 0; row < 8; row++)
    for(col = 0; col < 8; col++)
    {
      if(tab[row][col] != ' ')  /* Is it a blank square?  */
        continue;                  /* No - so on to the next */

      /* Check all the squares around the blank square  */
      /* for the opponents counter                      */
      for(rowdelta = -1; rowdelta <= 1; rowdelta++)
        for(coldelta = -1; coldelta <= 1; coldelta++)
        {
          /* Don't check outside the array, or the current square */
          if(row + rowdelta < 0 || row + rowdelta >= 8 ||
              col + coldelta < 0 || col + coldelta >= 8 ||
                                      (rowdelta==0 && coldelta==0))
            continue;

          /* Now check the square */
          if(tab[row + rowdelta][col + coldelta] == opponent)
          {
            /* If we find the opponent, move in the delta direction  */
            /* over opponent counters searching for a player counter */
            x = row + rowdelta;                /* Move to          */
            y = col + coldelta;                /* opponent square  */

            /* Look for a player square in the delta direction */
            for(;;)
            {
              x += rowdelta;                  /* Go to next square */
              y += coldelta;                  /* in delta direction*/

              /* If we move outside the array, give up */
              if(x < 0 || x >= 8 || y < 0 || y >= 8)
                break;

              /* If we find a blank square, give up */
              if(tab[x][y] == ' ')
                break;
                /*  If the square has a player counter */
                /*  then we have a valid move          */
              if(tab[x][y] == player)
              {
                moves[row][col] = 1;  /* Mark as valid */
                no_of_moves++;        /* Increase valid moves count */
                break;                /* Go check another square    */
              }
            }
          }
        }
    }
  return no_of_moves;
}

/************
 * Finds the best move for the computer. This is the move for      *
 * which the opponent's best possible move score is a minimum.    *
 * First parameter is the board array.                            *
 * Second parameter is the moves array containing valid moves.    *
 * Third parameter identifies the computer.                        *
 ************/
void computer_move(char tab[][8], int moves[][8], char player)
{
  int row = 0;                          /* Row index              */
  int col = 0;                          /* Column index            */
  int best_row = 0;                    /* Best row index          */
  int best_col = 0;                    /* Best column index      */
  int i = 0;                            /* Loop index              */
  int j = 0;                            /* Loop index              */
  int new_score = 0;                    /* Score for current move  */
  int score = 100;                      /* Minimum opponent score  */
  char temp_tab[8][8];          /* Local copy of board    */
  int temp_moves[8][8];          /* Local valid moves array */
  char opponent = (player == '0')? '1' : '0'; /* Identify opponent */

  /* Go through all valid moves */
  for(row = 0; row < 8; row++)
    for(col = 0; col < 8; col++)
    {
      if(moves[row][col] == 0)
        continue;

      /* First make copies of the board and moves arrays */
      for(i = 0; i < 8; i++)
        for(j = 0; j < 8; j++)
          temp_tab[i][j] = tab[i][j];

      /* Now make this move on the temporary board */
      make_move(temp_tab, row, col, player);

      /* find valid moves for the opponent after this move */
      valid_moves(temp_tab, temp_moves, opponent);

      /* Now find the score for the opponents best move */
      new_score = best_move(temp_tab, temp_moves, opponent);

      if(new_score<score)    /* Is it worse?          */
      {                      /* Yes, so save this move */
        score = new_score;  /* Record new lowest opponent score */
        best_row = row;  /* Record best move row            */
        best_col = col;  /* and column                      */
      }
    }

  /* Make the best move */
  make_move(tab, best_row, best_col, player);
}

/************
 * Calculates the score for the current board position for the    *
 * player. player counters score +1, opponent counters score -1    *
 * First parameter is the board array                              *
 * Second parameter identifies the player                          *
 * Return value is the score.                                      *
 ************/
int get_score(char tab[][8], char player)
{
  int score = 0;      /* Score for current position */
  int row = 0;        /* Row index                  */
  int col = 0;        /* Column index              */
  char opponent = player == '0' ? '1' : '0';  /* Identify opponent */

  /* Check all board squares */
  for(row = 0; row < 8; row++)
    for(col = 0; col < 8; col++)
  {
    score -= tab[row][col] == opponent; /* Decrement for opponent */
    score += tab[row][col] == player;  /* Increment for player  */
  }
  return score;
}

/************
 * Calculates the score for the best move out of the valid moves  *
 * for player in the current position.                            *
 * First parameter is the board array                              *
 * Second parameter is the moves array defining valid moves.      *
 * Third parameter identifies the player                          *
 * The score for the best move is returned                        *
 ************/
int best_move(char tab[][8], int moves[][8], char player)
{
  int row = 0;    /* Row index    */
  int col = 0;    /* Column index */
  int i = 0;      /* Loop index  */
  int j = 0;      /* Loop index  */

  char opponent = player=='0'?'1':'0'; /* Identify opponent */

  char new_tab[8][8] = { 0 };  /* Local copy of board    */

  int score = 0;                      /* Best score            */
  int new_score = 0;                  /* Score for current move */

  /* Check all valid moves to find the best */
  for(row = 0 ; row<8 ; row++)
    for(col = 0 ; col<8 ; col++)
    {
      if(!moves[row][col])            /* Not a valid move?      */
        continue;                      /* Go to the next        */

      /* Copy the board */
      for(i = 0 ; i<8 ; i++)
        for(j = 0 ; j<8 ; j++)
          new_tab[i][j] = tab[i][j];

      /* Make move on the board copy */
      make_move(new_tab, row, col, player);

      /* Get score for move */
      new_score = get_score(new_tab, player);

      if(score<new_score)        /* Is it better?              */
              score = new_score;  /* Yes, save it as best score  */
    }
  return score;                  /* Return best score          */
}

/*************
 * Makes a move. This places the counter on a square,and reverses  *
 * all the opponent's counters affected by the move.                *
 * First parameter is the board array.                              *
 * Second and third parameters are the row and column indices.      *
 * Fourth parameter identifies the player.                          *
 *************/
void make_move(char tab[][8], int row, int col, char player)
{
  int rowdelta = 0;                  /* Row increment              */
  int coldelta = 0;                  /* Column increment          */
  int x = 0;                          /* Row index for searching    */
  int y = 0;                          /* Column index for searching */
  char opponent = (player == '0')? '1' : '0';  /* Identify opponent */

  tab[row][col] = player;          /* Place the player counter  */

  /* Check all the squares around this square */
  /* for the opponents counter                */
  for(rowdelta = -1; rowdelta <= 1; rowdelta++)
    for(coldelta = -1; coldelta <= 1; coldelta++)
    {
      /* Don't check off the board, or the current square */
      if(row + rowdelta < 0 || row + rowdelta >= 8 ||
          col + coldelta < 0 || col + coldelta >= 8 ||
                              (rowdelta==0 && coldelta== 0))
        continue;

      /* Now check the square */
      if(tab[row + rowdelta][col + coldelta] == opponent)
      {
        /* If we find the opponent, search in the same direction */
        /* for a player counter                                  */
        x = row + rowdelta;        /* Move to opponent */
        y = col + coldelta;        /* square          */

        for(;;)
        {
          x += rowdelta;          /* Move to the      */
          y += coldelta;          /* next square      */

          /* If we are off the board give up */
          if(x < 0 || x >= 8 || y < 0 || y >= 8)
            break;

          /* If the square is blank give up */
          if(tab[x][y] == ' ')
            break;

          /* If we find the player counter, go backwards from here */
          /* changing all the opponents counters to player        */
          if(tab[x][y] == player)
          {
            while(tab[x-=rowdelta][y-=coldelta]==opponent) /* Opponent? */
              tab[x][y] = player;    /* Yes, change it */
            break;                    /* We are done    */
          }
        }
      }
    }
}






Aucun commentaire:

Enregistrer un commentaire