用c语言写一个五子棋游戏
时间: 2023-11-24 22:06:35 浏览: 33
好的,下面是一个简单的五子棋游戏的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROWS 15
#define COLS 15
// 初始化棋盘
void InitBoard(char board[][COLS], int rows, int cols)
{
int i, j;
for (i = 0; i < rows; ++i) {
for (j = 0; j < cols; ++j) {
board[i][j] = '+';
}
}
}
// 打印棋盘
void DisplayBoard(char board[][COLS], int rows, int cols)
{
int i, j;
printf(" ");
for (i = 0; i < cols; ++i) {
printf("%c ", 'A' + i);
}
printf("\n");
for (i = 0; i < rows; ++i) {
printf("%2d", i+1);
for (j = 0; j < cols; ++j) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
// 判断是否胜利
bool IsWin(char board[][COLS], int row, int col, char ch)
{
int i, j, count;
// 判断横向是否五子连珠
count = 0;
for (i = col-4; i <= col; ++i) {
if (i < 0 || i+4 >= COLS) {
continue;
}
count = 0;
for (j = i; j <= i+4; ++j) {
if (board[row][j] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断纵向是否五子连珠
count = 0;
for (i = row-4; i <= row; ++i) {
if (i < 0 || i+4 >= ROWS) {
continue;
}
count = 0;
for (j = i; j <= i+4; ++j) {
if (board[j][col] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断左上到右下是否五子连珠
count = 0;
for (i = row-4, j = col-4; i <= row, j <= col; ++i, ++j) {
if (i < 0 || i+4 >= ROWS || j < 0 || j+4 >= COLS) {
continue;
}
count = 0;
for (int k = 0; k < 5; ++k) {
if (board[i+k][j+k] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断左下到右上是否五子连珠
count = 0;
for (i = row+4, j = col-4; i >= row, j <= col; --i, ++j) {
if (i >= ROWS || i-4 < 0 || j < 0 || j+4 >= COLS) {
continue;
}
count = 0;
for (int k = 0; k < 5; ++k) {
if (board[i-k][j+k] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
return false;
}
int main()
{
char board[ROWS][COLS];
int row, col, player = 1;
char ch = ' ';
InitBoard(board, ROWS, COLS);
DisplayBoard(board, ROWS, COLS);
while (true) {
printf("player %d input the coordinate(row, column):", player);
scanf("%d %d", &row, &col);
getchar(); // 去除输入缓冲区的回车
if (row < 1 || row > ROWS || col < 0 || col >= COLS) {
printf("Invalid input!\n");
continue;
}
if (board[row-1][col] != '+') {
printf("(%d, %d) has been occupied!\n", row, col);
continue;
}
if (player == 1) {
ch = 'X';
player = 2;
} else {
ch = 'O';
player = 1;
}
board[row-1][col] = ch;
DisplayBoard(board, ROWS, COLS);
if (IsWin(board, row-1, col, ch)) {
printf("player %d win!", player==1 ? 2 : 1);
break;
}
}
return 0;
}
```
该程序中,使用二维字符数组`board`存储棋盘,每个位置初始化为`+`。打印棋盘时,先打印列对应的字母标号,再打印行对应的数字标号,最后打印棋盘上每个位置对应的字符。判断是否胜利时,分别判断横向、纵向和两条对角线是否有五个连续的字符相同,如果有,则胜利。在用户输入坐标时,需要检查输入是否合法,如是否超出了棋盘范围、是否已经有棋子占据等。如果输入不合法,则需要提示用户重新输入。如果输入合法,则将对应位置的字符替换为当前玩家对应的字符(`X`或`O`),并判断当前玩家是否胜利。如果胜利,则打印胜利玩家的编号并退出程序。