溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言五子棋小游戲實現代碼怎么寫

發布時間:2022-08-05 15:53:56 來源:億速云 閱讀:186 作者:iii 欄目:開發技術

C語言五子棋小游戲實現代碼怎么寫

五子棋是一種經典的策略性棋類游戲,因其規則簡單、趣味性強而廣受歡迎。本文將詳細介紹如何使用C語言實現一個簡單的五子棋小游戲。我們將從游戲的基本規則、數據結構設計、核心算法實現、用戶交互等方面進行講解,并提供完整的代碼示例。

1. 五子棋游戲規則簡介

五子棋的規則非常簡單:兩名玩家輪流在棋盤上下棋,一方使用黑棋,另一方使用白棋。當某一方的棋子在某一條直線上(橫、豎、斜)連續出現五個時,該方獲勝。如果棋盤被填滿且沒有一方獲勝,則游戲以平局告終。

2. 游戲設計思路

在實現五子棋游戲時,我們需要考慮以下幾個方面:

  1. 棋盤表示:使用二維數組來表示棋盤,數組中的每個元素代表棋盤上的一個位置。
  2. 玩家輪流下棋:通過循環實現玩家輪流下棋的功能。
  3. 勝負判斷:每次下棋后,檢查當前下棋的位置是否形成五子連珠。
  4. 用戶交互:通過命令行與用戶進行交互,提示玩家輸入下棋位置。
  5. 游戲結束處理:當游戲結束時,顯示獲勝方或平局信息,并詢問玩家是否繼續游戲。

3. 數據結構設計

3.1 棋盤表示

我們使用一個15x15的二維數組來表示棋盤,數組中的每個元素可以取以下值:

  • 0:表示該位置為空。
  • 1:表示該位置為黑棋。
  • 2:表示該位置為白棋。
#define BOARD_SIZE 15

int board[BOARD_SIZE][BOARD_SIZE] = {0};

3.2 玩家輪流下棋

我們使用一個變量current_player來表示當前下棋的玩家,1表示黑棋玩家,2表示白棋玩家。

int current_player = 1; // 1: 黑棋, 2: 白棋

4. 核心算法實現

4.1 下棋操作

玩家下棋時,需要輸入棋子的行和列坐標。我們需要檢查該位置是否為空,如果為空則下棋,否則提示玩家重新輸入。

void place_piece(int row, int col, int player) {
    if (board[row][col] == 0) {
        board[row][col] = player;
    } else {
        printf("該位置已有棋子,請重新輸入!\n");
    }
}

4.2 勝負判斷

每次下棋后,我們需要檢查當前下棋的位置是否形成五子連珠。我們可以從當前下棋的位置向四個方向(橫、豎、斜)進行檢查,判斷是否有連續五個相同的棋子。

int check_win(int row, int col, int player) {
    int directions[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
    for (int i = 0; i < 4; i++) {
        int count = 1;
        int dx = directions[i][0];
        int dy = directions[i][1];
        int x = row + dx;
        int y = col + dy;
        while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
            count++;
            x += dx;
            y += dy;
        }
        x = row - dx;
        y = col - dy;
        while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
            count++;
            x -= dx;
            y -= dy;
        }
        if (count >= 5) {
            return 1;
        }
    }
    return 0;
}

4.3 游戲結束處理

當游戲結束時,我們需要顯示獲勝方或平局信息,并詢問玩家是否繼續游戲。

void game_over(int winner) {
    if (winner == 1) {
        printf("黑棋獲勝!\n");
    } else if (winner == 2) {
        printf("白棋獲勝!\n");
    } else {
        printf("平局!\n");
    }
    printf("是否繼續游戲?(y/n): ");
    char choice;
    scanf(" %c", &choice);
    if (choice == 'y' || choice == 'Y') {
        reset_board();
    } else {
        exit(0);
    }
}

4.4 重置棋盤

在游戲結束后,如果需要繼續游戲,我們需要重置棋盤。

void reset_board() {
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            board[i][j] = 0;
        }
    }
    current_player = 1;
}

5. 用戶交互

5.1 顯示棋盤

我們需要在每次下棋后顯示當前的棋盤狀態,方便玩家查看。

void display_board() {
    printf("   ");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%2d ", i);
    }
    printf("\n");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%2d ", i);
        for (int j = 0; j < BOARD_SIZE; j++) {
            if (board[i][j] == 0) {
                printf(" . ");
            } else if (board[i][j] == 1) {
                printf(" X ");
            } else {
                printf(" O ");
            }
        }
        printf("\n");
    }
}

5.2 玩家輸入

玩家需要輸入下棋的位置,我們需要對輸入進行合法性檢查。

void get_player_input(int *row, int *col) {
    printf("玩家 %d,請輸入下棋位置(行 列):", current_player);
    scanf("%d %d", row, col);
    while (*row < 0 || *row >= BOARD_SIZE || *col < 0 || *col >= BOARD_SIZE || board[*row][*col] != 0) {
        printf("輸入無效,請重新輸入:");
        scanf("%d %d", row, col);
    }
}

6. 主程序邏輯

主程序邏輯包括初始化棋盤、玩家輪流下棋、勝負判斷、游戲結束處理等。

int main() {
    reset_board();
    while (1) {
        display_board();
        int row, col;
        get_player_input(&row, &col);
        place_piece(row, col, current_player);
        if (check_win(row, col, current_player)) {
            display_board();
            game_over(current_player);
        } else {
            current_player = (current_player == 1) ? 2 : 1;
        }
    }
    return 0;
}

7. 完整代碼示例

#include <stdio.h>
#include <stdlib.h>

#define BOARD_SIZE 15

int board[BOARD_SIZE][BOARD_SIZE] = {0};
int current_player = 1; // 1: 黑棋, 2: 白棋

void display_board() {
    printf("   ");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%2d ", i);
    }
    printf("\n");
    for (int i = 0; i < BOARD_SIZE; i++) {
        printf("%2d ", i);
        for (int j = 0; j < BOARD_SIZE; j++) {
            if (board[i][j] == 0) {
                printf(" . ");
            } else if (board[i][j] == 1) {
                printf(" X ");
            } else {
                printf(" O ");
            }
        }
        printf("\n");
    }
}

void place_piece(int row, int col, int player) {
    if (board[row][col] == 0) {
        board[row][col] = player;
    } else {
        printf("該位置已有棋子,請重新輸入!\n");
    }
}

int check_win(int row, int col, int player) {
    int directions[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
    for (int i = 0; i < 4; i++) {
        int count = 1;
        int dx = directions[i][0];
        int dy = directions[i][1];
        int x = row + dx;
        int y = col + dy;
        while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
            count++;
            x += dx;
            y += dy;
        }
        x = row - dx;
        y = col - dy;
        while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
            count++;
            x -= dx;
            y -= dy;
        }
        if (count >= 5) {
            return 1;
        }
    }
    return 0;
}

void game_over(int winner) {
    if (winner == 1) {
        printf("黑棋獲勝!\n");
    } else if (winner == 2) {
        printf("白棋獲勝!\n");
    } else {
        printf("平局!\n");
    }
    printf("是否繼續游戲?(y/n): ");
    char choice;
    scanf(" %c", &choice);
    if (choice == 'y' || choice == 'Y') {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                board[i][j] = 0;
            }
        }
        current_player = 1;
    } else {
        exit(0);
    }
}

void get_player_input(int *row, int *col) {
    printf("玩家 %d,請輸入下棋位置(行 列):", current_player);
    scanf("%d %d", row, col);
    while (*row < 0 || *row >= BOARD_SIZE || *col < 0 || *col >= BOARD_SIZE || board[*row][*col] != 0) {
        printf("輸入無效,請重新輸入:");
        scanf("%d %d", row, col);
    }
}

int main() {
    while (1) {
        display_board();
        int row, col;
        get_player_input(&row, &col);
        place_piece(row, col, current_player);
        if (check_win(row, col, current_player)) {
            display_board();
            game_over(current_player);
        } else {
            current_player = (current_player == 1) ? 2 : 1;
        }
    }
    return 0;
}

8. 總結

通過本文的介紹,我們實現了一個簡單的五子棋小游戲。雖然這個游戲的實現相對簡單,但它涵蓋了C語言中數組、循環、條件判斷、函數等基本語法的使用。通過這個項目,讀者可以加深對C語言的理解,并為后續更復雜的項目打下基礎。

當然,這個五子棋游戲還有很多可以改進的地方,例如:

  1. 圖形界面:可以使用圖形庫(如SDL、OpenGL)為游戲添加圖形界面。
  2. 對手:可以為游戲添加對手,實現人機對戰。
  3. 網絡對戰:可以實現網絡對戰功能,讓玩家通過網絡進行對戰。

希望本文對讀者有所幫助,祝大家在編程的道路上越走越遠!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女