refactor: rename variable identifiers for clarity
This commit is contained in:
85
drop4.c
85
drop4.c
@@ -6,7 +6,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define ROWS 6
|
#define ROWS 6
|
||||||
#define COLS 7
|
#define COLUMNS 7
|
||||||
#define EMPTY 0
|
#define EMPTY 0
|
||||||
#define P1 1
|
#define P1 1
|
||||||
#define P2 2
|
#define P2 2
|
||||||
@@ -14,31 +14,31 @@
|
|||||||
#define NUM_DIRECTIONS 4
|
#define NUM_DIRECTIONS 4
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int board[ROWS][COLS];
|
int board[ROWS][COLUMNS];
|
||||||
int current_player;
|
int current_player;
|
||||||
int last_row;
|
int last_row;
|
||||||
int last_col;
|
int last_column;
|
||||||
} Game;
|
} Game;
|
||||||
|
|
||||||
void init_game(Game *game) {
|
void init_game(Game *game) {
|
||||||
for (int i = 0; i < ROWS; i++) {
|
for (int i = 0; i < ROWS; i++) {
|
||||||
for (int j = 0; j < COLS; j++) {
|
for (int j = 0; j < COLUMNS; j++) {
|
||||||
game->board[i][j] = EMPTY;
|
game->board[i][j] = EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
game->current_player = P1;
|
game->current_player = P1;
|
||||||
game->last_row = -1;
|
game->last_row = -1;
|
||||||
game->last_col = -1;
|
game->last_column = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_board(Game *game) {
|
void print_board(Game *game) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
for (int j = 0; j < COLS; j++) {
|
for (int j = 0; j < COLUMNS; j++) {
|
||||||
printf(" %d ", j);
|
printf(" %d ", j);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
for (int i = 0; i < ROWS; i++) {
|
for (int i = 0; i < ROWS; i++) {
|
||||||
for (int j = 0; j < COLS; j++) {
|
for (int j = 0; j < COLUMNS; j++) {
|
||||||
char symbol = game->board[i][j] == EMPTY ? '.'
|
char symbol = game->board[i][j] == EMPTY ? '.'
|
||||||
: game->board[i][j] == P1 ? 'X'
|
: game->board[i][j] == P1 ? 'X'
|
||||||
: 'O';
|
: 'O';
|
||||||
@@ -53,51 +53,53 @@ void switch_player(Game *game) {
|
|||||||
game->current_player = game->current_player == P1 ? P2 : P1;
|
game->current_player = game->current_player == P1 ? P2 : P1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drop_piece(Game *game, int col) {
|
int drop_piece(Game *game, int column) {
|
||||||
for (int i = ROWS - 1; i >= 0; i--) {
|
for (int i = ROWS - 1; i >= 0; i--) {
|
||||||
if (game->board[i][col] == EMPTY) {
|
if (game->board[i][column] == EMPTY) {
|
||||||
game->board[i][col] = game->current_player;
|
game->board[i][column] = game->current_player;
|
||||||
game->last_row = i;
|
game->last_row = i;
|
||||||
game->last_col = col;
|
game->last_column = column;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_valid_move(Game *game, int col) {
|
int is_valid_move(Game *game, int column) {
|
||||||
return col >= 0 && col < COLS && game->board[0][col] == EMPTY;
|
return column >= 0 && column < COLUMNS && game->board[0][column] == EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_winning_move(Game *game) {
|
int is_winning_move(Game *game) {
|
||||||
if (game->last_row < 0 || game->last_col < 0) {
|
if (game->last_row < 0 || game->last_column < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int row = game->last_row;
|
int row = game->last_row;
|
||||||
int col = game->last_col;
|
int column = game->last_column;
|
||||||
int player = game->board[row][col];
|
int player = game->board[row][column];
|
||||||
const int directions[NUM_DIRECTIONS][2] = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
|
const int directions[NUM_DIRECTIONS][2] = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
|
||||||
|
|
||||||
for (int dir = 0; dir < NUM_DIRECTIONS; dir++) {
|
for (int direction = 0; direction < NUM_DIRECTIONS; direction++) {
|
||||||
int count = 1;
|
int count = 1;
|
||||||
for (int offset = 1; offset < WIN_LENGTH; offset++) {
|
for (int offset = 1; offset < WIN_LENGTH; offset++) {
|
||||||
int new_row = row + directions[dir][0] * offset;
|
int new_row = row + directions[direction][0] * offset;
|
||||||
int new_col = col + directions[dir][1] * offset;
|
int new_column = column + directions[direction][1] * offset;
|
||||||
if (new_row < 0 || new_row >= ROWS || new_col < 0 || new_col >= COLS)
|
if (new_row < 0 || new_row >= ROWS || new_column < 0 ||
|
||||||
|
new_column >= COLUMNS)
|
||||||
break;
|
break;
|
||||||
if (game->board[new_row][new_col] != player)
|
if (game->board[new_row][new_column] != player)
|
||||||
break;
|
break;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (count >= WIN_LENGTH)
|
if (count >= WIN_LENGTH)
|
||||||
return 1;
|
return 1;
|
||||||
for (int offset = 1; offset < WIN_LENGTH; offset++) {
|
for (int offset = 1; offset < WIN_LENGTH; offset++) {
|
||||||
int new_row = row - directions[dir][0] * offset;
|
int new_row = row - directions[direction][0] * offset;
|
||||||
int new_col = col - directions[dir][1] * offset;
|
int new_column = column - directions[direction][1] * offset;
|
||||||
if (new_row < 0 || new_row >= ROWS || new_col < 0 || new_col >= COLS)
|
if (new_row < 0 || new_row >= ROWS || new_column < 0 ||
|
||||||
|
new_column >= COLUMNS)
|
||||||
break;
|
break;
|
||||||
if (game->board[new_row][new_col] != player)
|
if (game->board[new_row][new_column] != player)
|
||||||
break;
|
break;
|
||||||
count++;
|
count++;
|
||||||
if (count >= WIN_LENGTH)
|
if (count >= WIN_LENGTH)
|
||||||
@@ -108,7 +110,7 @@ int is_winning_move(Game *game) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int is_board_full(Game *game) {
|
int is_board_full(Game *game) {
|
||||||
for (int j = 0; j < COLS; j++) {
|
for (int j = 0; j < COLUMNS; j++) {
|
||||||
if (game->board[0][j] == EMPTY)
|
if (game->board[0][j] == EMPTY)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -154,11 +156,11 @@ static int is_quit_command(const char *str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get_column_input(Game *game) {
|
int get_column_input(Game *game) {
|
||||||
int col;
|
int column;
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
while (1) {
|
while (1) {
|
||||||
printf("Player %d, enter a column (0-%d) or 'q' to quit: ",
|
printf("Player %d, enter a column (0-%d) or 'q' to quit: ",
|
||||||
game->current_player, COLS - 1);
|
game->current_player, COLUMNS - 1);
|
||||||
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
|
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -169,7 +171,7 @@ int get_column_input(Game *game) {
|
|||||||
while ((c = getchar()) != '\n' && c != EOF)
|
while ((c = getchar()) != '\n' && c != EOF)
|
||||||
;
|
;
|
||||||
printf("Error: Input too long. Please enter a number between 0 and %d.\n",
|
printf("Error: Input too long. Please enter a number between 0 and %d.\n",
|
||||||
COLS - 1);
|
COLUMNS - 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,14 +186,14 @@ int get_column_input(Game *game) {
|
|||||||
if (errno == ERANGE || col_long < INT_MIN || col_long > INT_MAX) {
|
if (errno == ERANGE || col_long < INT_MIN || col_long > INT_MAX) {
|
||||||
printf(
|
printf(
|
||||||
"Error: Number too large. Please enter a number between 0 and %d.\n",
|
"Error: Number too large. Please enter a number between 0 and %d.\n",
|
||||||
COLS - 1);
|
COLUMNS - 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (endptr == buffer) {
|
if (endptr == buffer) {
|
||||||
printf("Error: Invalid input. Please enter a number between 0 and %d, or "
|
printf("Error: Invalid input. Please enter a number between 0 and %d, or "
|
||||||
"'q' to quit.\n",
|
"'q' to quit.\n",
|
||||||
COLS - 1);
|
COLUMNS - 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,25 +204,26 @@ int get_column_input(Game *game) {
|
|||||||
if (*endptr != '\0') {
|
if (*endptr != '\0') {
|
||||||
printf("Error: Invalid characters after number. Please enter only a "
|
printf("Error: Invalid characters after number. Please enter only a "
|
||||||
"number between 0 and %d.\n",
|
"number between 0 and %d.\n",
|
||||||
COLS - 1);
|
COLUMNS - 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
col = (int)col_long;
|
column = (int)col_long;
|
||||||
|
|
||||||
if (col < 0 || col >= COLS) {
|
if (column < 0 || column >= COLUMNS) {
|
||||||
printf("Error: Column %d is out of range. Please enter a number between "
|
printf("Error: Column %d is out of range. Please enter a number between "
|
||||||
"0 and %d.\n",
|
"0 and %d.\n",
|
||||||
col, COLS - 1);
|
column, COLUMNS - 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_valid_move(game, col)) {
|
if (!is_valid_move(game, column)) {
|
||||||
printf("Error: Column %d is full. Please choose another column.\n", col);
|
printf("Error: Column %d is full. Please choose another column.\n",
|
||||||
|
column);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return col;
|
return column;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,13 +233,13 @@ int main() {
|
|||||||
print_board(&game);
|
print_board(&game);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int col = get_column_input(&game);
|
int column = get_column_input(&game);
|
||||||
if (col < 0) {
|
if (column < 0) {
|
||||||
printf("\nGame interrupted.\n");
|
printf("\nGame interrupted.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_piece(&game, col);
|
drop_piece(&game, column);
|
||||||
print_board(&game);
|
print_board(&game);
|
||||||
if (is_winning_move(&game)) {
|
if (is_winning_move(&game)) {
|
||||||
printf("Player %d wins!\n", game.current_player);
|
printf("Player %d wins!\n", game.current_player);
|
||||||
|
|||||||
Reference in New Issue
Block a user