用C++面向对象的思想实现五子棋
时间: 2024-05-01 10:24:12 浏览: 20
在 C 语言中,没有原生的面向对象特性,但可以通过结构体和函数指针等方式来实现类似于面向对象的编程。以下是一个简单的五子棋游戏的实现,其中包含了棋盘、棋子和玩家等相关结构体,以及对应的函数指针实现的方法。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BOARD_SIZE 15
#define MAX_NAME_LENGTH 50
typedef struct {
int x;
int y;
} Point;
typedef struct {
char name[MAX_NAME_LENGTH];
char chess;
} Player;
typedef struct {
char board[BOARD_SIZE][BOARD_SIZE];
Player *players[2];
int current_player;
void (*print_board)(char board[BOARD_SIZE][BOARD_SIZE]);
void (*place_chess)(char board[BOARD_SIZE][BOARD_SIZE], Point point, char chess);
int (*check_win)(char board[BOARD_SIZE][BOARD_SIZE], Point point);
Point (*get_input)(void);
} Game;
void print_board(char board[BOARD_SIZE][BOARD_SIZE]) {
printf(" ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%c ", i + 'A');
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d", i + 1);
for (int j = 0; j < BOARD_SIZE; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void place_chess(char board[BOARD_SIZE][BOARD_SIZE], Point point, char chess) {
board[point.x][point.y] = chess;
}
int check_win(char board[BOARD_SIZE][BOARD_SIZE], Point point) {
char chess = board[point.x][point.y];
// check horizontal
int count = 1;
for (int i = point.y - 1; i >= 0; i--) {
if (board[point.x][i] == chess) {
count++;
} else {
break;
}
}
for (int i = point.y + 1; i < BOARD_SIZE; i++) {
if (board[point.x][i] == chess) {
count++;
} else {
break;
}
}
if (count >= 5) return 1;
// check vertical
count = 1;
for (int i = point.x - 1; i >= 0; i--) {
if (board[i][point.y] == chess) {
count++;
} else {
break;
}
}
for (int i = point.x + 1; i < BOARD_SIZE; i++) {
if (board[i][point.y] == chess) {
count++;
} else {
break;
}
}
if (count >= 5) return 1;
// check diagonal
count = 1;
for (int i = point.x - 1, j = point.y - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == chess) {
count++;
} else {
break;
}
}
for (int i = point.x + 1, j = point.y + 1; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++) {
if (board[i][j] == chess) {
count++;
} else {
break;
}
}
if (count >= 5) return 1;
// check anti-diagonal
count = 1;
for (int i = point.x - 1, j = point.y + 1; i >= 0 && j < BOARD_SIZE; i--, j++) {
if (board[i][j] == chess) {
count++;
} else {
break;
}
}
for (int i = point.x + 1, j = point.y - 1; i < BOARD_SIZE && j >= 0; i++, j--) {
if (board[i][j] == chess) {
count++;
} else {
break;
}
}
if (count >= 5) return 1;
return 0;
}
Point get_input(void) {
char input[MAX_NAME_LENGTH];
printf("Please input the position (e.g. \"A1\"): ");
scanf("%s", input);
Point point;
point.x = input[1] - '1';
point.y = input[0] - 'A';
return point;
}
void play_game(Game *game) {
while (1) {
Player *player = game->players[game->current_player];
printf("%s's turn (%c)\n", player->name, player->chess);
Point point = game->get_input();
if (game->board[point.x][point.y] != ' ') {
printf("This position has been occupied, please choose another one.\n");
continue;
}
game->place_chess(game->board, point, player->chess);
game->print_board(game->board);
if (game->check_win(game->board, point)) {
printf("%s wins!\n", player->name);
break;
}
game->current_player = 1 - game->current_player;
}
}
int main() {
Game game;
game.current_player = 0;
game.print_board = print_board;
game.place_chess = place_chess;
game.check_win = check_win;
game.get_input = get_input;
Player player1 = {"Player 1", 'X'};
Player player2 = {"Player 2", 'O'};
game.players[0] = &player1;
game.players[1] = &player2;
memset(game.board, ' ', sizeof(game.board));
game.print_board(game.board);
play_game(&game);
return 0;
}
```
在上述代码中,我们定义了 `Point`、`Player` 和 `Game` 三个结构体,分别表示一个点的坐标、一个玩家和一个游戏。`Game` 结构体中包含了棋盘、两个玩家、当前玩家、打印棋盘、落子、胜利判断和获取输入等函数指针。通过这些函数指针,我们可以方便地实现不同的游戏逻辑。
在 `play_game` 函数中,我们通过循环来进行游戏,每次轮到一个玩家时,获取输入、落子、打印棋盘、判断胜利并切换到下一个玩家。如果有一方胜利,则结束游戏。