使用算法設計C语言五子棋
时间: 2023-07-26 09:13:03 浏览: 97
五子棋是一种在棋盘上进行的二人对弈游戏,玩家轮流落子,先在棋盘上连成一条直线的一方获胜。以下是使用算法设计C语言五子棋的示例:
```
#include <stdio.h>
#include <stdlib.h>
#define BOARD_SIZE 15 // 棋盘大小
#define EMPTY 0 // 空格
#define BLACK 1 // 黑子
#define WHITE 2 // 白子
// 定义棋盘
int board[BOARD_SIZE][BOARD_SIZE];
// 初始化棋盘
void initBoard() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
}
// 打印棋盘
void printBoard() {
printf(" ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i);
for (int j = 0; j < BOARD_SIZE; j++) {
switch (board[i][j]) {
case BLACK:
printf("●");
break;
case WHITE:
printf("○");
break;
default:
printf("+");
break;
}
printf(" ");
}
printf("\n");
}
}
// 判断当前位置是否合法
int isValidPosition(int x, int y) {
return x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY;
}
// 判断棋局是否结束
int isGameOver() {
int i, j, k, count;
// 横向检查
for (i = 0; i < BOARD_SIZE; i++) {
for (j = 0; j < BOARD_SIZE - 4; j++) {
if (board[i][j] != EMPTY) {
count = 1;
for (k = 1; k < 5; k++) {
if (board[i][j + k] == board[i][j]) {
count++;
} else {
break;
}
}
if (count == 5) {
return board[i][j];
}
}
}
}
// 竖向检查
for (j = 0; j < BOARD_SIZE; j++) {
for (i = 0; i < BOARD_SIZE - 4; i++) {
if (board[i][j] != EMPTY) {
count = 1;
for (k = 1; k < 5; k++) {
if (board[i + k][j] == board[i][j]) {
count++;
} else {
break;
}
}
if (count == 5) {
return board[i][j];
}
}
}
}
// 斜向检查
for (i = 0; i < BOARD_SIZE - 4; i++) {
for (j = 0; j < BOARD_SIZE - 4; j++) {
if (board[i][j] != EMPTY) {
count = 1;
for (k = 1; k < 5; k++) {
if (board[i + k][j + k] == board[i][j]) {
count++;
} else {
break;
}
}
if (count == 5) {
return board[i][j];
}
}
}
}
// 反斜向检查
for (i = 0; i < BOARD_SIZE - 4; i++) {
for (j = 4; j < BOARD_SIZE; j++) {
if (board[i][j] != EMPTY) {
count = 1;
for (k = 1; k < 5; k++) {
if (board[i + k][j - k] == board[i][j]) {
count++;
} else {
break;
}
}
if (count == 5) {
return board[i][j];
}
}
}
}
return EMPTY;
}
// 玩家下棋
void playerMove(int player) {
int x, y;
while (1) {
printf("Player %d's turn (x y): ", player);
scanf("%d %d", &x, &y);
if (isValidPosition(x, y)) {
board[x][y] = player;
break;
} else {
printf("Invalid position!\n");
}
}
}
// AI下棋
void aiMove(int player) {
// TODO: 实现AI下棋算法
// 这里使用随机下棋
int x, y;
while (1) {
x = rand() % BOARD_SIZE;
y = rand() % BOARD_SIZE;
if (isValidPosition(x, y)) {
board[x][y] = player;
break;
}
}
printf("AI's turn: %d %d\n", x, y);
}
int main() {
initBoard();
printBoard();
int currentPlayer = BLACK;
while (1) {
if (currentPlayer == BLACK) {
playerMove(currentPlayer);
} else {
aiMove(currentPlayer);
}
printBoard();
int winner = isGameOver();
if (winner != EMPTY) {
printf("Player %d wins!\n", winner);
break;
}
currentPlayer = currentPlayer == BLACK ? WHITE : BLACK;
}
return 0;
}
```
上述代码中,我们使用二维数组 `board` 来表示棋盘,其中 0 表示空格,1 表示黑子,2 表示白子。我们定义了一些函数来实现棋盘的初始化、打印、检查游戏是否结束以及玩家和 AI 下棋的功能。
其中,`isGameOver` 函数用于检查游戏是否结束。我们通过遍历棋盘来检查横向、竖向、斜向和反斜向是否有任意一方连成了五子。如果有一方连成了五子,则返回其颜色,否则返回 0。
在主函数中,我们使用一个循环来实现玩家和 AI 交替下棋。如果当前玩家是黑子,则调用 `playerMove` 函数让玩家下棋,否则调用 `aiMove` 函数让 AI 下棋。每次下棋后打印棋盘,并检查游戏是否结束。如果游戏结束,则输出获胜方,并退出循环。
由于 `aiMove` 函数需要实现 AI 下棋算法,这里我们只是简单地使用随机下棋。如果需要实现更复杂的算法,可以在此函数中实现。
阅读全文