c语言判断五子棋赢
时间: 2023-08-03 09:06:10 浏览: 76
判断五子棋胜负的方法一般有两种:
1. 检查每个落子点的周围是否有相同颜色的棋子连成五子,如果有,则该颜色获胜。
2. 对于每个落子点,检查其所在的行、列、对角线上是否有相同颜色的棋子连成五子,如果有,则该颜色获胜。
以下是一种基于第二种方法的实现示例:
```c
#include <stdio.h>
#include <stdbool.h>
#define BOARD_SIZE 15
#define EMPTY 0
#define BLACK 1
#define WHITE 2
int board[BOARD_SIZE][BOARD_SIZE];
// 判断某个玩家是否获胜
bool is_win(int player) {
// 检查每行
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j <= BOARD_SIZE - 5; j++) {
bool win = true;
for (int k = 0; k < 5; k++) {
if (board[i][j + k] != player) {
win = false;
break;
}
}
if (win) {
return true;
}
}
}
// 检查每列
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j <= BOARD_SIZE - 5; j++) {
bool win = true;
for (int k = 0; k < 5; k++) {
if (board[j + k][i] != player) {
win = false;
break;
}
}
if (win) {
return true;
}
}
}
// 检查正对角线(左上-右下)
for (int i = 0; i <= BOARD_SIZE - 5; i++) {
for (int j = 0; j <= BOARD_SIZE - 5; j++) {
bool win = true;
for (int k = 0; k < 5; k++) {
if (board[i + k][j + k] != player) {
win = false;
break;
}
}
if (win) {
return true;
}
}
}
// 检查反对角线(左下-右上)
for (int i = 0; i <= BOARD_SIZE - 5; i++) {
for (int j = BOARD_SIZE - 1; j >= 4; j--) {
bool win = true;
for (int k = 0; k < 5; k++) {
if (board[i + k][j - k] != player) {
win = false;
break;
}
}
if (win) {
return true;
}
}
}
return false;
}
int main() {
// 初始化棋盘
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
// 玩家1先手,使用黑色棋子
int current_player = BLACK;
// 游戏循环
while (true) {
// 输出当前棋盘
printf("Current board:\n");
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
char c;
switch (board[i][j]) {
case EMPTY:
c = '.';
break;
case BLACK:
c = 'X';
break;
case WHITE:
c = 'O';
break;
default:
c = '?';
break;
}
printf("%c ", c);
}
printf("\n");
}
// 提示当前玩家落子
char player_name = current_player == BLACK ? 'X' : 'O';
printf("Player %c's turn, please enter the coordinate (e.g. 3 4): ", player_name);
// 读入落子坐标
int x, y;
scanf("%d %d", &x, &y);
// 检查落子是否合法
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y] != EMPTY) {
printf("Invalid move, please try again.\n");
continue;
}
// 落子
board[x][y] = current_player;
// 检查是否获胜
if (is_win(current_player)) {
printf("Player %c wins!\n", player_name);
break;
}
// 切换到下一个玩家
current_player = current_player == BLACK ? WHITE : BLACK;
}
return 0;
}
```
该程序实现了一个简单的五子棋游戏,每次落子后会检查当前玩家是否获胜,如果获胜则结束游戏。