c语言
IsWin判赢
display 画 10 x 10 的棋盘
判断落子的坐标是否已有棋子
判断落子坐标范围是否超出范围
// 五子棋
#include <stdio.h>
#include <stdlib.h>
// 画棋盘 10 x 10的棋盘,len为行数
void display(char map[][10], int len)
{
system("clear");
printf(" 0 1 2 3 4 5 6 7 8 9\n");
for (int i = 0; i < len; i++) {
printf("%d ", i);
for (int j = 0; j < 10; j++) {
printf("|%c", map[i][j]);
}
printf("|\n");
}
}
// 判断是否赢棋
int IsWin(char map[][10], int len, int x, int y)
{
int xx;
int yy;
int saves = 0;
int count = 1;
// 判断是否棋盘下满
for (int i = 0; i < len; i++) {
for (int j = 0; j < 10; j++) {
if (map[i][j] == ' ') {
saves += 1;
}
}
}
if (saves == 0) {
printf("棋盘下满,平局!\n");
return -1;
}
//判断赢棋,从横、纵、斜、反斜四个方向判断
// 横向判断
// count == 1 是因为下面 for循环判断是从坐标的横移左一个、横移右一个开始判断的
for (yy = y-1; yy > -1; yy--) {
if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
for (yy = y+1; yy < 10; yy++) {
if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
if (count >= 5) {
if (map[x][y] == 'O') {
printf("白棋赢\n");
return 1;
} else {
printf("黑棋赢\n");
return 2;
}
}
count = 1;
// 纵向判断
for (xx = x-1; xx > -1; xx--) {
if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
for (xx = x+1; xx < len; xx++) {
if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
if (count >= 5) {
if (map[x][y] == 'O') {
printf("白棋赢\n");
return 1;
} else {
printf("黑棋赢\n");
return 2;
}
}
count = 1;
// 反斜方向判断
for (xx = x-1,yy = y + 1; xx > -1 && yy < 10; xx--,yy++) {
if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
for (xx= x+1,yy = y-1; xx < len && yy > -1; yy--,xx++) {
if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
if (count >= 5) {
if (map[x][y] == 'O') {
printf("白棋赢\n");
return 1;
} else {
printf("黑棋赢\n");
return 2;
}
}
count = 1;
// 斜线 方向判断
for (xx = x-1,yy = y - 1; xx > -1 && yy > -1; xx--,yy--) {
if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
for (xx= x+1,yy = y+1; xx < len && yy < 10; yy++,xx++) {
if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
count += 1;
}
}
if (count >= 5) {
if (map[x][y] == 'O') {
printf("白棋赢\n");
return 1;
} else {
printf("黑棋赢\n");
return 2;
}
}
return 0;
}
int main(void)
{
char map[10][10] = {};
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
map[i][j] = ' ';
}
}
display(map, 10);
int x = 0, y = 0,ret = -1;
while (1) {
while (1) {
printf("白旗落子\n"); // 'O'
printf("请输入横坐标:");
scanf("%d", &x);
printf("请输入纵坐标:");
scanf("%d", &y);
if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
if (map[x][y] != ' ') {
printf("该坐标已落子,请重新输入坐标\n");
continue;
} else {
map[x][y] = 'O';
display(map, 10);
break;
}
}
else {
printf("输入坐标超出棋盘范围,请重新输入\n");
continue;
}
}
ret = IsWin(map, 10, x, y);
if (ret != 0) {
break;
}
while (1) {
printf("黑旗落子\n"); // 'X'
printf("请输入横坐标:");
scanf("%d", &x);
printf("请输入纵坐标:");
scanf("%d", &y);
if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
if (map[x][y] != ' ') {
printf("该坐标已落子,请重新输入坐标!\n");
continue;
} else {
map[x][y] = 'X';
display(map, 10);
break;
}
}
else {
printf("输入坐标超出棋盘范围,请重新输入!\n");
continue;
}
}
ret = IsWin(map, 10, x, y);
if (ret != 0) {
break;
}
}
return 0;
}