本文提供一個純文字介面的五子棋遊戲實作,棋盤大小 15×15,支援雙人輪流落子、座標輸入驗證、四向連線判定(橫、直、正斜、反斜)與獲勝即時結束。程式碼結構清晰,適合初學者研讀遊戲迴圈、陣列操作與判斷演算法。
N = 15:棋盤尺寸常數chessboard[16][16]:索引 1~15 對應實際棋點,0 列/行顯示座標標號whoseTurn:回合計數器,奇數為玩家 1(白子 O),偶數為玩家 2(黑子 X)initGame()、printChessboard()、playChess()、judge()initGame()y/Y 進入遊戲,否則直接退出system("cls") 清螢幕(Windows),Linux/Mac 需改 system("clear")printChessboard()i==0 印列號(1~15),j==0 印行號0→*(空點)、1→O、2→X%3d、" O"、" X"、" *" 對齊顯示playChess()whoseTurn 奇偶決定玩家與棋子代碼(1 或 2)scanf("%d %d", &i, &j) 讀取座標while (chessboard[i][j] != 0) 檢查重疊,提示重新輸入judge() 判定勝負exit(0) 結束程式judge(int x, int y)檢查以最新落子 (x,y) 為中心的四個方向是否有連續 5 顆同色棋:
i 從 x-4 到 x,檢查 (i,j) ~ (i+4,j)j 從 y-4 到 y,檢查 (i,j) ~ (i,j+4)i,j 同步遞增,檢查 (i,j) ~ (i+4,j+4)i 遞減 j 遞增,檢查 (i,j) ~ (i-4,j+4)邊界條件:1 <= 座標 <= N-4 確保 5 顆完整落在棋盤內。t = 2 - whoseTurn%2 取得當前玩家棋子代碼。
#include <stdio.h>
#include <stdlib.h>
#define N 15
int chessboard[N + 1][N + 1] = { 0 };
int whoseTurn = 0;
void initGame(void);
void printChessboard(void);
void playChess(void);
int judge(int, int);
int main(void) {
initGame();
while (1) {
whoseTurn++;
playChess();
}
return 0;
}
void initGame(void) {
char c;
printf("Please input 'y' to enter the game: ");
c = getchar();
if ('y' != c && 'Y' != c) exit(0);
system("cls"); // Linux/Mac 請改 system("clear")
printChessboard();
}
void printChessboard(void) {
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
if (0 == i) printf("%3d", j);
else if (j == 0) printf("%3d", i);
else if (1 == chessboard[i][j]) printf(" O");
else if (2 == chessboard[i][j]) printf(" X");
else printf(" *");
}
printf("\n");
}
}
void playChess(void) {
int i, j, winner;
int player = (1 == whoseTurn % 2) ? 1 : 2;
printf("Turn to player %d, please input the position: ", player);
scanf("%d %d", &i, &j);
while (chessboard[i][j] != 0) {
printf("This position has been occupied, please input again: ");
scanf("%d %d", &i, &j);
}
chessboard[i][j] = player;
system("cls");
printChessboard();
if (judge(i, j)) {
printf("Winner is player %d!\n", player);
exit(0);
}
}
int judge(int x, int y) {
int t = (1 == whoseTurn % 2) ? 1 : 2; // 當前玩家棋子
// 垂直
for (int i = x - 4; i <= x; i++)
if (i >= 1 && i <= N - 4
&& t == chessboard[i][y]
&& t == chessboard[i+1][y]
&& t == chessboard[i+2][y]
&& t == chessboard[i+3][y]
&& t == chessboard[i+4][y])
return 1;
// 水平
for (int j = y - 4; j <= y; j++)
if (j >= 1 && j <= N - 4
&& t == chessboard[x][j]
&& t == chessboard[x][j+1]
&& t == chessboard[x][j+2]
&& t == chessboard[x][j+3]
&& t == chessboard[x][j+4])
return 1;
// 主對角線
for (int i = x - 4, j = y - 4; i <= x && j <= y; i++, j++)
if (i >= 1 && i <= N - 4 && j >= 1 && j <= N - 4
&& t == chessboard[i][j]
&& t == chessboard[i+1][j+1]
&& t == chessboard[i+2][j+2]
&& t == chessboard[i+3][j+3]
&& t == chessboard[i+4][j+4])
return 1;
// 次對角線
for (int i = x + 4, j = y - 4; i >= 1 && j <= y; i--, j++)
if (i >= 1 && i <= N - 4 && j >= 1 && j <= N - 4
&& t == chessboard[i][j]
&& t == chessboard[i-1][j+1]
&& t == chessboard[i-2][j+2]
&& t == chessboard[i-3][j+3]
&& t == chessboard[i-4][j+4])
return 1;
return 0;
}
gcc gomoku.c -o gomoku ./gomoku
輸入 y 開始,依提示輸入 行 列(如 8 8)落子。
此實作展示了 C 語言處理陣列、迴圈、條件判斷與模組化函式設計的基本功力,是進階學習遊戲程式設計的良好起點。