首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言實作五子棋:完整原始碼與邏輯解析

     編輯:關於C語言

C 語言實作五子棋:完整原始碼與邏輯解析

本文提供一個純文字介面的五子棋遊戲實作,棋盤大小 15×15,支援雙人輪流落子、座標輸入驗證、四向連線判定(橫、直、正斜、反斜)與獲勝即時結束。程式碼結構清晰,適合初學者研讀遊戲迴圈、陣列操作與判斷演算法。

一、程式架構概覽

  • N = 15:棋盤尺寸常數
  • chessboard[16][16]:索引 1~15 對應實際棋點,0 列/行顯示座標標號
  • whoseTurn:回合計數器,奇數為玩家 1(白子 O),偶數為玩家 2(黑子 X)
  • 四大核心函式:initGame()、printChessboard()、playChess()、judge()

二、核心函式詳解

1. 初始化 initGame()

  • 提示輸入 y/Y 進入遊戲,否則直接退出
  • 呼叫 system("cls") 清螢幕(Windows),Linux/Mac 需改 system("clear")
  • 繪製初始空棋盤

2. 繪製棋盤 printChessboard()

  • 雙層迴圈遍歷 0~15
  • i==0 印列號(1~15),j==0 印行號
  • 陣列值:0→*(空點)、1→O、2→X
  • 使用 %3d、" O"、" X"、" *" 對齊顯示

3. 落子邏輯 playChess()

  • 依 whoseTurn 奇偶決定玩家與棋子代碼(1 或 2)
  • scanf("%d %d", &i, &j) 讀取座標
  • while (chessboard[i][j] != 0) 檢查重疊,提示重新輸入
  • 更新陣列、清螢幕重繪、呼叫 judge() 判定勝負
  • 獲勝列印訊息並 exit(0) 結束程式

4. 勝負判定 judge(int x, int y)

檢查以最新落子 (x,y) 為中心的四個方向是否有連續 5 顆同色棋:

  1. 垂直:i 從 x-4 到 x,檢查 (i,j) ~ (i+4,j)
  2. 水平:j 從 y-4 到 y,檢查 (i,j) ~ (i,j+4)
  3. 主對角線 (↘):i,j 同步遞增,檢查 (i,j) ~ (i+4,j+4)
  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)落子。

五、可擴充方向

  • 加入 AI 對戰(Minimax + Alpha-Beta 剪枝)
  • 支援悔棋、存檔/讀檔
  • 使用 ncurses 或圖形庫改善介面
  • 泛化為 N 子棋、可調整棋盤大小

此實作展示了 C 語言處理陣列、迴圈、條件判斷與模組化函式設計的基本功力,是進階學習遊戲程式設計的良好起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved