📄 program9_09.c
字号:
/* Program 9.9 REVERSI An Othello type game */
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
const int SIZE = 6; /* Board size - must be even */
const char comp_c = '@'; /* Computer's counter */
const char player_c = 'O'; /* Player's counter */
/* Function prototypes */
void display(char board[][SIZE]);
int valid_moves(char board[][SIZE], bool moves[][SIZE], char player);
void make_move(char board[][SIZE], int row, int col, char player);
void computer_move(char board[][SIZE], bool moves[][SIZE], char player);
int best_move(char board[][SIZE], bool moves[][SIZE], char player);
int get_score(char board[][SIZE], char player);
int main(void)
{
char board [SIZE][SIZE] = { 0 }; /* The board */
bool moves[SIZE][SIZE] = { false }; /* 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 */
/* Player indicator: true for player and false for computer */
bool next_player = true;
printf("\nREVERSI\n\n");
printf("You can go first on the first game, then we will take turns.\n");
printf(" You will be white - (%c)\n I will be black - (%c).\n",
player_c, comp_c);
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);
/* The main game loop */
do
{
/* On even games the player starts; */
/* on odd games the computer starts */
next_player = !next_player;
no_of_moves = 4; /* Starts with four counters */
/* Blank all the board squares */
for(row = 0; row < SIZE; row++)
for(col = 0; col < SIZE; col++)
board[row][col] = ' ';
/* Place the initial four counters in the center */
int mid = SIZE/2;
board[mid - 1][mid - 1] = board[mid][mid] = player_c;
board[mid - 1][mid] = board[mid][mid - 1] = comp_c;
/* The game play loop */
do
{
display(board); /* Display the board */
if(next_player=!next_player)
{ /* It is the player's turn */
if(valid_moves(board, moves, player_c))
{
/* Read player moves until a valid move is entered */
for(;;)
{
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<SIZE && y<SIZE && moves[x][y])
{
make_move(board, x, y, player_c);
no_of_moves++; /* Increment move count */
break;
}
else
printf("Not a valid move, try again.\n");
}
}
else /* No valid moves */
if(++invalid_moves < 2)
{
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(board, moves, '@')) /* Check for valid moves */
{
invalid_moves = 0; /* Reset invalid count */
computer_move(board, moves, '@');
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 < SIZE*SIZE && invalid_moves<2);
/* Game is over */
display(board); /* Show final board */
/* Get final scores and display them */
comp_score = user_score = 0;
for(row = 0; row < SIZE; row++)
for(col = 0; col < SIZE; col++)
{
comp_score += board[row][col] == comp_c;
user_score += board[row][col] == player_c;
}
printf("The final score is:\n");
printf("Computer %d\n User %d\n\n", comp_score, user_score);
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");
return 0;
}
/***********************************************
* Function to display the board in its *
* current state with row numbers and column *
* letters to identify squares. *
* Parameter is the board array. *
***********************************************/
void display(char board[][SIZE])
{
/* Display the column labels */
char col_label = 'a'; /* Column label */
printf("\n "); /* Start top line */
for(int col = 0 ; col<SIZE ;col++)
printf(" %c", col_label+col); /* Display the top line */
printf("\n"); /* End the top line */
/* Display the rows
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -