C语言五子棋小游戏实现代码怎么写

发布时间:2022-08-05 15:53:56 作者:iii
来源:亿速云 阅读:179

C语言五子棋小游戏实现代码怎么写

五子棋是一种经典的策略性棋类游戏,因其规则简单、趣味性强而广受欢迎。本文将详细介绍如何使用C语言实现一个简单的五子棋小游戏。我们将从游戏的基本规则、数据结构设计、核心算法实现、用户交互等方面进行讲解,并提供完整的代码示例。

1. 五子棋游戏规则简介

五子棋的规则非常简单:两名玩家轮流在棋盘上下棋,一方使用黑棋,另一方使用白棋。当某一方的棋子在某一条直线上(横、竖、斜)连续出现五个时,该方获胜。如果棋盘被填满且没有一方获胜,则游戏以平局告终。

2. 游戏设计思路

在实现五子棋游戏时,我们需要考虑以下几个方面:

  1. 棋盘表示:使用二维数组来表示棋盘,数组中的每个元素代表棋盘上的一个位置。
  2. 玩家轮流下棋:通过循环实现玩家轮流下棋的功能。
  3. 胜负判断:每次下棋后,检查当前下棋的位置是否形成五子连珠。
  4. 用户交互:通过命令行与用户进行交互,提示玩家输入下棋位置。
  5. 游戏结束处理:当游戏结束时,显示获胜方或平局信息,并询问玩家是否继续游戏。

3. 数据结构设计

3.1 棋盘表示

我们使用一个15x15的二维数组来表示棋盘,数组中的每个元素可以取以下值:

#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. 网络对战:可以实现网络对战功能,让玩家通过网络进行对战。

希望本文对读者有所帮助,祝大家在编程的道路上越走越远!

推荐阅读:
  1. C语言代码如何实现扫雷小游戏
  2. C语言实现扫雷小游戏代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:Python中super(XXXX, self).__init__()的作用是什么

下一篇:mysql中union和union all如何使用及注意事项是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》