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;
}