QWQ167 2022-12-18 11:36 采纳率: 0%
浏览 170
已结题

编写一个C语言小程序

编写一个小程序,实现五子棋游戏功能。
相关知识
为了完成本关任务,你需要掌握:1.如何定义一个二维数组,2.如何通过下标访问数组元素 3. 注意要把格局检测设计为一个函数。
棋盘样式
棋盘的样式如下:
由 A-O 作为行坐标,1-15作为列坐标,对棋盘的各个点位进行标识。如上图中,棋子O(大写字母O)的坐标为H8,棋子X的坐标为G7,每一次通过输入棋子坐标完成落子。本测试规定一盘的开始格局是 ‘O’ 先落子在H8, 随后由等待用户输入‘X’的坐标,如输入 G7 后回车,棋子X将落在G7位置,如此交替落子。
赢棋规则
率先出现5个及以上棋子连成一条直线的一方获胜。

img

img

  • 写回答

7条回答 默认 最新

  • |__WhoAmI__| 2022-12-18 11:52
    关注
    获得0.15元问题酬金
    #include <stdio.h>
    #include <string.h>
    
    #define ROW 15
    #define COL 15
    #define NUM 5
    
    char board[ROW][COL];  // 棋盘
    char current_player;  // 当前玩家
    
    // 初始化棋盘
    void init_board() {
        memset(board, ' ', sizeof(board));  // 将棋盘全部赋值为空格
        board[ROW / 2][COL / 2] = 'O';  // 初始时白子先落子
        current_player = 'X';  // 初始时黑子先落子
    }
    
    // 输入落子坐标
    void input_pos(int *row, int *col) {
        char c1, c2;
        printf("%c's turn, please input a position: ", current_player);
        scanf(" %c%c", &c1, &c2);  // 输入棋子坐标
        *row = c1 - 'A';  // 行坐标
        *col = c2 - '1';  // 列坐标
    }
    
    // 检查输赢
    int check_win(int row, int col) {
        int i, j;
        char c = board[row][col];  // 当前棋子
    
        // 检查横向连续的棋子数
        i = row;
        j = col;
        while (j > 0 && board[i][j - 1] == c) j--;  // 向左搜索
        int count = 0;
        while (j < COL && board[i][j] == c) {
            j++;
            count++;
        }
    
        if (count >= NUM) return 1;  // 如果横向连续的棋子数大于等于 NUM,则当前玩家获胜
    
    // 检查纵向连续的棋子数
    i = row;
    j = col;
    while (i > 0 && board[i - 1][j] == c) i--;  // 向上搜索
    count = 0;
    while (i < ROW && board[i][j] == c) {
            i++;
            count++;
    }
    
    if (count >= NUM) return 1;  // 如果纵向连续的棋子数大于等于 NUM,则当前玩家获胜
    
    // 检查左上到右下的对角线上连续的棋子数
    i = row;
    j = col;
    while (i > 0 && j > 0 && board[i - 1][j - 1] == c) {
            i--;
            j--;
    }
    count = 0;
    while (i < ROW && j < COL && board[i][j] == c) {
            i++;
            j++;
            count++;
    }
    
    if (count >= NUM) return 1;  // 如果左上到右下的对角线上连续的棋子数大于等于 NUM,则当前玩家获胜
    
    // 检查右上到左下的对角线上连续的棋子数
    i = row;
    j = col;
    while (i > 0 && j < COL && board[i - 1][j + 1] == c) {
            i--;
            j++;
    }
    count = 0;
    while (i < ROW && j >= 0 && board[i][j] == c) {
            i++;
            j--;
            count++;
    }
    
    if (count >= NUM) return 1;  // 如果右上到左下的对角线上连续的棋子数大于等于 NUM,则当前玩家获胜
    
    return 0;  // 如果以上四种情况都不满足,则没有玩家获胜
    }
    
    // 输出棋盘格局
    void print_board() {
    int i, j;
    printf(" ");
    for (i = 0; i < COL; i++) {
    printf("%c ", '1' + i); // 输出列坐标
    }
    printf("\n");
    for (i = 0; i < ROW; i++) {
    printf("%c ", 'A' + i); // 输出行坐标
    for (j = 0; j < COL; j++) {
    printf("%c ", board[i][j]); // 输出棋子
    }
    printf("\n");
    }
    }
    
    int main() {
    int row, col;
    init_board(); // 初始化棋盘
    
    while (1) {
        print_board();  // 输出棋盘格局
        input_pos(&row, &col);  // 输入落子坐标
        board[row][col] = current_player;  // 落子
    
        if (check_win(row, col)) {  // 检查输赢
            printf("%c wins!\n", current_player);
            break;
        }
    
        // 交换玩家
        if (current_player == 'X') {
            current_player = 'O';
        } else {
            current_player = 'X';
        }
    }
    
    return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 12月26日
  • 请提交代码 12月18日
  • 创建了问题 12月18日