C语言之中五子棋问题(附代码)

 C语言中五子棋相关问题

为什么五子棋的棋盘有实现绘制棋盘和打印棋盘选择模式后却无法出现?到哪一方下棋时也是无法显示?

img

请问需要怎么解决,谢谢!

#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#define 白色 2
#define 黑色 1
#define 空白 0
#define BOARD_SIZE 15 // 棋盘大小
void draw_menu(void);
void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE]);
void print_chessboard(char chessboard[][BOARD_SIZE]);
void draw_chess(int type, char* tableline);
int is_win(int chessboard[][BOARD_SIZE], int row, int col);
int is_full(int chessboard[][BOARD_SIZE], int row, int col);
void humanVsHuman();
void humanVsAI();
void end_game();
int mune2();
void save_game(char chessboard[][BOARD_SIZE]);
//绘制主菜单
void draw_menu(void)
{
    printf("******************************\n");
    printf("******* 欢迎使用五子棋 *******\n");
    printf("***     请选择对战方式     ***\n");
    printf("*      1.人-人对战           *\n");
    printf("*      2.人-机对战(随机算法) *\n");
    printf("*      3.退出                *\n");
    printf("******************************\n");
    printf("请选择:");
}
int main()
{
    int choice;
    draw_menu();
    while (1)
    {
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            humanVsHuman();
            break;
        case 2:
            humanVsAI();
            break;
        case 3:
            exit(0);
            break;
        default:
            printf("输入错误,请重新选择\n");
        }
    }
    return 0;
}

//绘制棋盘
void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE])
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        if (i == 0)
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("┌");
                else if (j == 14) printf("┐");
                else printf("┬");
            }
            printf("\n");
        }
        else if (i == 14)
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("└");
                else if (j == 14) printf("┘ ");
                else printf("┴ ");
            }
            printf("\n");
        }
        else
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("├ ");
                else if (j == 14) printf("┤ ");
                else printf("┼  ");
            }
            printf("\n");
        }
    }
}
// 打印当前棋盘
void print_chessboard(char chessboard[][BOARD_SIZE])
{
    printf("\n   ");
    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%c ", 'A' + i);
    }
    printf("\n");

    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%2d ", i + 1);
        for (int j = 0; j < BOARD_SIZE; j++)
        {
            printf("%c ", chessboard[i][j]);
        }
        printf("%2d\n", i + 1);
    }

    printf("   ");
    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%c ", 'A' + i);
    }
    printf("\n\n");
}

//定义棋子
void draw_chess(int type, char* tableline)
{
    if (type == 白色)
        printf("●");
    if (type == 黑色)
        printf("○");
    if (type == 空白)
        printf("%s", tableline);
}

//判断输赢的条件
int is_win(int chessboard[][BOARD_SIZE], int row, int col)
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (chessboard[i][j] == 空白)
                continue;

            //  (-)横着连成五子
            if (j < col - 4)
                if (chessboard[i][j] == chessboard[i][j + 1] && chessboard[i][j] ==
                    chessboard[i][j + 2]
                    && chessboard[i][j] == chessboard[i][j + 3] && chessboard[i][j]
                    == chessboard[i][j + 4])
                    return chessboard[i][j];

            //  (|)竖着连成五子
            if (i < row - 4)
                if (chessboard[i][j] == chessboard[i + 1][j] && chessboard[i][j] ==
                    chessboard[i + 2][j]
                    && chessboard[i][j] == chessboard[i + 3][j] && chessboard[i][j]
                    == chessboard[i + 4][j])
                    return chessboard[i][j];

            //  (\)左斜连成五子
            if (i < row - 4 && j < col - 4)
                if (chessboard[i][j] == chessboard[i + 1][j + 1] && chessboard[i][j] == chessboard[i + 2][j] && chessboard[i][j] ==
                    chessboard[i + 3][j + 3] && chessboard[i][j] == chessboard[i + 4][j + 4])
                    return chessboard[i][j];

            //  (/)右斜连成五子 
            if (i < row - 4 && j > 4)
                if (chessboard[i][j] == chessboard[i + 1][j - 1] && chessboard[i][j] ==
                    chessboard[i + 2][j - 2]
                    && chessboard[i][j] == chessboard[i + 3][j - 3] && chessboard[i]
                    [j] == chessboard[i + 4][j - 4])
                    return chessboard[i][j];
        }
    }
    return 空白;
}
//判断是否和局
int is_full(int chessboard[][BOARD_SIZE], int row, int col)
{
    int ret = 1;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (chessboard[i][j] == 空白) {
                ret = 0;
                break;
            }
        }
    }
    return ret;
}
//人人对战
void humanVsHuman()
{
    printf("人人对战模式!你能战胜对方吗?\n");
    void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE]);
    void print_chessboard(char chessboard[][BOARD_SIZE]);
    int chessboard[BOARD_SIZE][BOARD_SIZE] = { 空白 };
    int winner = 0, turn = 1;
    while (winner == 0)
    {
        int X, Y;
        printf("当前是%c方下棋,请输入行号和列号:", turn % 2 == 0 ? 黑色 : 白色);
        scanf("%d%d", &X, &Y);
        X--; Y--;
        if (chessboard[X][Y] == 空白)
        {
            chessboard[X][Y] = turn % 2 == 0 ? 黑色 : 白色;
            if (is_win(chessboard, BOARD_SIZE, BOARD_SIZE))
            {
                void print_chessboard(char chessboard[][BOARD_SIZE]);
                printf("恭喜%c方获得胜利!\n", winner == 1 ? 黑色 : 白色);
                winner = 1;
                break;
            }
            else
            {
                void print_chessboard(char chessboard[][BOARD_SIZE]);
                turn++;
            }
        }
    }
}
//人机对战
void humanVsAI()
{
    printf("人机对绝模式!您是黑子,您先下。\n");
    void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE]);
    void print_chessboard(char chessboard[][BOARD_SIZE]);
    int chessboard[BOARD_SIZE][BOARD_SIZE] = { 空白 };
    int winner=0, turn=1;
    while (winner == 0)
    {
        int X, Y, x=16, y=16;
        if (turn % 2 == 0)
        {
            printf("当前是%c方下棋,请输入行号和列号:", 空白);
            scanf("%d%d", &X, &Y);
            X--; Y--;
            if (chessboard[X][Y] != 空白)
            {
                printf("该位置已有棋子,请重新输入\n");
                continue;
                if (is_win(chessboard, BOARD_SIZE, BOARD_SIZE))
                {
                    void print_chessboard(char chessboard[][BOARD_SIZE]);
                    printf("恭喜您获得胜利!\n");
                    winner = 1;
                    break;
                }
                else
                {
                    void print_chessboard(char chessboard[][BOARD_SIZE]);
                    turn++;
                }
            }
        }
        else
        {
            printf("电脑走:>\n");
            X = rand() % x;
            Y = rand() % y;
            if (chessboard[X][Y] == 空白)
            {
                printf("该位置已有棋子,请重新输入\n");
                continue;
                if (is_win(chessboard, BOARD_SIZE, BOARD_SIZE))
                {
                    void print_chessboard(char chessboard[][BOARD_SIZE]);
                    printf("真遗憾您失败了。\n");
                    winner = 1;
                    break;
                }
                else
                {
                    void print_chessboard(char chessboard[][BOARD_SIZE]);
                    turn++;
                }
            }
        }
    }
}


// 保存对局
void save_game(char chessboard[][BOARD_SIZE])
{
    char filename[40];
    printf("请输入要保存的文件名:");
    scanf("%s", filename);

    FILE* fp;
    fp = fopen(filename, "w");
    if (fp == NULL)
    {
        printf("无法创建文件\n");
        return;
    }

    for (int i = 0; i < BOARD_SIZE; i++)
    {
        for (int j = 0; j < BOARD_SIZE; j++)
        {
            fputc(chessboard[i][j], fp);
        }
        fputc('\n', fp);
    }

    fclose(fp);
    printf("保存成功\n");
}

// 结束对局
void end_game()
{
    printf("游戏结束\n");
    exit(0);
}

int mune2()
{
    char chessboard[BOARD_SIZE][BOARD_SIZE]; // 棋盘
    int choice;
    do {
        // 显示菜单
        printf("1. 保存对局\n2. 结束对局\n");
        printf("请输入您的选择:");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            save_game(chessboard);
            break;
        case 2:
            end_game();
            break;
        default:
            printf("无效选择,请重新选择\n");
            break;
        }
    } while (choice != 2);

    return 0;
}

1-94行看作第一段,95-223行看作第二段,223到最后一行看作第三段:

第一段代码中有一个问题:在 draw_chessboard 函数中,您没有将棋盘中的具体棋子打印出来。在 else 分支的循环中,您只打印了棋盘的框架,但没有打印棋子本身。

为了解决这个问题,您需要将棋盘的内容也打印出来。以下是修改后的 draw_chessboard 函数的代码:

void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE])
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        if (i == 0)
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("┌");
                else if (j == 14) printf("┐");
                else printf("┬");
            }
            printf("\n");
        }
        else if (i == 14)
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("└");
                else if (j == 14) printf("┘ ");
                else printf("┴ ");
            }
            printf("\n");
        }
        else
        {
            for (j = 0; j < 14; j++)
            {
                if (j == 0) printf("├ ");
                else if (j == 14) printf("┤ ");
                else printf("┼ ");
                
                if (j % 2 == 1)
                {
                    int x = i / 2;
                    int y = j / 2;
                    switch (chessboard[x][y])
                    {
                    case 白色:
                        printf("○");
                        break;
                    case 黑色:
                        printf("●");
                        break;
                    case 空白:
                    default:
                        printf(" ");
                        break;
                    }
                }
            }
            printf("\n");
        }
    }
}

这样,棋盘的框架和具体的棋子就会被打印出来了。在 else 分支的内部循环中,我们添加了对棋盘上每个位置的检查,并根据棋盘数组中的值打印相应的棋子。白色棋子用 "○" 表示,黑色棋子用 "●" 表示,空白位置用空格表示。

请测试一下看看是否能正确地绘制棋盘并打印出棋子。

--------------------------------------------------------------分隔符---------------------------------------------------------------------

第二段代码中也存在一些问题。

  1. 在函数 print_chessboard 中,您使用了字符数组 chessboard 来存储棋盘的内容。然而,您在打印棋盘时,直接使用 %c 格式化符打印数组中的元素,这会导致打印的是字符的 ASCII 值而不是棋子本身。为了正确打印棋子,您需要将棋子的整数值转换为相应的字符表示。

以下是修改后的 print_chessboard 函数的代码:

void print_chessboard(char chessboard[][BOARD_SIZE])
{
    printf("\n   ");
    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%c ", 'A' + i);
    }
    printf("\n");

    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%2d ", i + 1);
        for (int j = 0; j < BOARD_SIZE; j++)
        {
            char chessPiece;
            switch (chessboard[i][j])
            {
            case 白色:
                chessPiece = '●';
                break;
            case 黑色:
                chessPiece = '○';
                break;
            case 空白:
            default:
                chessPiece = ' ';
                break;
            }
            printf("%c ", chessPiece);
        }
        printf("%2d\n", i + 1);
    }

    printf("   ");
    for (int i = 0; i < BOARD_SIZE; i++)
    {
        printf("%c ", 'A' + i);
    }
    printf("\n\n");
}

在修改后的代码中,我们根据棋盘数组中的值,将整数值转换为相应的字符表示。

  1. 在函数 draw_chess 中,您使用 printf 函数直接打印棋子。然而,在绘制棋盘时,我们应该使用 printf 打印整行字符串,而不是单个字符。为了在绘制棋盘时正确处理棋子,您需要将棋子字符存储在一个字符串中,并在需要时打印该字符串。

以下是修改后的 draw_chess 函数的代码:

void draw_chess(int type, char* tableline)
{
    char chessPiece;
    switch (type)
    {
    case 白色:
        chessPiece = '●';
        break;
    case 黑色:
        chessPiece = '○';
        break;
    case 空白:
    default:
        chessPiece = *tableline;
        break;
    }
    printf("%c", chessPiece);
}

在修改后的代码中,我们将棋子字符存储在 chessPiece 变量中,并使用 printf 打印该变量的值。

请测试一下看看是否能正确打印棋盘和棋子。

--------------------------------------------------------------分隔符---------------------------------------------------------------------

第三段代码存在一些问题:

  1. 在函数 humanVsAI 中,局部变量 xy 没有被初始化。你可能需要根据棋盘的大小来设置它们的值。
  2. 在函数 humanVsAI 中,如果玩家输入的位置已经有棋子,程序会提示重新输入,但是在重新输入后,代码没有重新判断是否获胜或者切换玩家,而是直接继续下一轮循环。这会导致程序无法正确判断胜负和轮换玩家。
  3. 在函数 humanVsAI 中,当玩家下棋后没有进行棋盘状态的更新,即没有将玩家下的棋子放入棋盘数组中。
  4. 在函数 humanVsAI 中,当电脑下棋时,它随机选择一个位置,并且没有进行棋盘状态的更新,即没有将电脑下的棋子放入棋盘数组中。
  5. 在函数 save_game 中,fputc('\n', fp) 语句应该在外层循环的末尾,而不是内层循环的末尾,以确保每行之间有一个换行符。
  6. 在函数 end_game 中,调用 exit(0) 可能会导致程序突然终止,而不是正常结束。你可以使用 return 语句来结束函数并返回到调用它的地方。

此外,你的代码中还缺少一些函数的声明,例如 draw_chessboardprint_chessboard 函数。你需要在代码的开头或其他适当的位置进行函数声明。

void humanVsHuman() 里面
void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE]);
void print_chessboard(char chessboard[][BOARD_SIZE]);
这里是定义,不是调用

调用函数时候,不要加返回值:void print_chessboard(char chessboard[][BOARD_SIZE]);
改为print_chessboard(char chessboard[][BOARD_SIZE]);

试试这样呢

#include <stdio.h>
#include <stdlib.h>
#define MAX_ROW 15
#define MAX_COL 15
#define WHITE -1
#define BLACK 1
#define BLANK 0
 
void draw_chessboardn(int row, int col, int chessboard[][MAX_COL]);
void draw_chessman(int type, char *tableline);
int random_create_point(void);
void draw_menu(void);
void person_person(void);
void person_computer_random(void);
int is_full(int chessboard[][MAX_COL], int row, int col);
int is_win(int chessboard[][MAX_COL], int row, int col);
void save_chess(int chessboard[][MAX_COL], int row, int col);
void replay_chess(void);
int  ChooseArrow(int chessboard[][MAX_COL], int row, int col);
 
int main () {
    int choice;
    draw_menu();
    while (1) {
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                person_person();
                break;
            case 2:
                person_computer_random();
                break;
            case 3:
                replay_chess();
                break;
            case 4:
                exit(0);
                break;
            default:
                printf("输入错误,请重新选择\n");
        }
    }
    return 0;
}
//绘制棋盘
void draw_chessboardn(int row, int col, int chessboard[][MAX_COL]) {
    for (int i = 0; i < row ; i++) {
        if (i == 0) {
            for (int j = 0; j < col; j++) {
                if (j == 0)
                    draw_chessman(chessboard[i][j], "┌ ");
                else if (j == 14)
                    draw_chessman(chessboard[i][j], "┐");
                else
                    draw_chessman(chessboard[i][j], "┬ ");
            }
            printf("\n");
        } else if (i == 14) {
            for (int j = 0; j < col; j++) {
                if (j == 0)
                    draw_chessman(chessboard[i][j], "└ ");
                else if (j == 14)
                    draw_chessman(chessboard[i][j], "┘ ");
                else
                    draw_chessman(chessboard[i][j], "┴ ");
            }
            printf("\n");
        } else {
            for (int j = 0; j < col; j++) {
                if (j == 0)
                    draw_chessman(chessboard[i][j], "├ ");
                else if (j == 14)
                    draw_chessman(chessboard[i][j], "┤");
                else
                    draw_chessman(chessboard[i][j], "┼ ");
            }
            printf("\n");
        }
    }
}
//绘制棋子
void draw_chessman(int type, char *tableline) {
    if (type == WHITE)
        printf("●");
    if (type == BLACK)
        printf("○");
    if (type == BLANK)
        printf("%s", tableline);
}
//随机算法获取棋子的坐标
int random_create_point(void) {
    int point;
    point = rand() % MAX_ROW;
    return point;
}
//绘制主菜单
void draw_menu(void) {
    printf("******************************\n");
    printf("******* 欢迎使用五子棋 *******\n");
    printf("***     研发者:Hiya(a     ***\n");
    printf("***     请选择对战方式     ***\n");
    printf("*      1.人-人对战           *\n");
    printf("*      2.人-机对战(随机算法) *\n");
    printf("*      3.复盘                *\n");
    printf("*      4.退出                *\n");
    printf("******************************\n");
    printf("请选择:");
}
//人人对战
void person_person(void) {
    int chessboard[MAX_ROW][MAX_COL] = {BLANK};
    int i, j;
    char key;
    draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
    for (int step = 1; step <= MAX_ROW * MAX_COL; step++) {    //黑子先行,然后双方轮流下棋
        if (step % 2 == 1) {                                   //当前步数为单数,黑棋落子。
            printf("请黑棋落子:");
            while (1) {
                scanf("%d %d", &i, &j);
                if (chessboard[i][j] != BLANK) {
                    printf("该位置已有棋子,请重新输入\n");        //棋子只能落在空白处
                    continue;
                }
                if (i >= MAX_ROW || j >= MAX_COL || i < 0 || j < 0) {
                    printf("输入超出棋盘范围,请重新输入\n");      //棋子坐标不可超出棋盘
                    continue;
                }
                break;
            }
            chessboard[i][j] = BLACK;
            draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
            if (is_win(chessboard, MAX_ROW, MAX_COL) == BLACK) {
                printf("黑棋胜");
                exit(0);
            }
            save_chess(chessboard, MAX_ROW, MAX_COL);
        } else if (step % 2 == 0) {                            //当前步数为双数,则白棋落子
            printf("请白棋落子:");
            while (1) {
                scanf("%d %d", &i, &j);
                if (chessboard[i][j] != BLANK) {
                    printf("该位置已有棋子,请重新输入\n");        //棋子只能落在空白处
                    continue;
                }
                if (i >= MAX_ROW || j >= MAX_COL || i < 0 || j < 0) {
                    printf("输入超出棋盘范围,请重新输入\n");     //棋子坐标不可超出棋盘
                    continue;
                }
                break;
            }
            chessboard[i][j] = WHITE;
            draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
            if (is_win(chessboard, MAX_ROW,  MAX_COL) == WHITE) {
                printf("白棋胜");
                exit(0);
            }
            save_chess(chessboard, MAX_ROW, MAX_COL);
        }
    }
    if (is_full(chessboard, MAX_ROW, MAX_COL) == 1)
        printf("棋盘已满");
}
//判断棋盘是否已满
int is_full(int chessboard[][MAX_COL], int row, int col) {
    int ret = 1;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (chessboard[i][j] == BLANK) {        //遍历数组,当有一个位置为空,则棋盘不满
                ret = 0;
                break;
            }
        }
    }
    return ret;
}
//判断胜负
int is_win(int chessboard[][MAX_COL], int row, int col) {
    int i, j;
    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            if (chessboard[i][j] == BLANK)
                continue;
            if (j < col - 4)
                if (chessboard[i][j] == chessboard[i][j + 1] && chessboard[i][j] == chessboard[i][j + 2]
                        && chessboard[i][j] == chessboard[i][j + 3] && chessboard[i][j] == chessboard[i][j + 4])
                    return chessboard[i][j];
            if (i < row - 4)
                if (chessboard[i][j] == chessboard[i + 1][j] && chessboard[i][j] == chessboard[i + 2][j]
                        && chessboard[i][j] == chessboard[i + 3][j] && chessboard[i][j] == chessboard[i + 4][j])
                    return chessboard[i][j];
            if (i < row - 4 && j < col - 4)
                if (chessboard[i][j] == chessboard[i + 1][j + 1] && chessboard[i][j] == chessboard[i + 2][j + 2]
                        && chessboard[i][j] == chessboard[i + 3][j + 3] && chessboard[i][j] == chessboard[i + 4][j + 4])
                    return chessboard[i][j];
            if (i < row - 4 && j > 4)
                if (chessboard[i][j] == chessboard[i + 1][j - 1] && chessboard[i][j] == chessboard[i + 2][j - 2]
                        && chessboard[i][j] == chessboard[i + 3][j - 3] && chessboard[i][j] == chessboard[i + 4][j - 4])
                    return chessboard[i][j];
        }
    }
    return BLANK;
}
//人机对战
void person_computer_random(void) {
    int chessboard[MAX_ROW][MAX_COL] = {BLANK};
    int i, j;
    draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
    for (int step = 1; step <= MAX_ROW * MAX_COL; step++) {
        if (step % 2 == 1) {
            printf("请黑棋落子:");
            while (1) {
                scanf("%d %d", &i, &j);
                if (chessboard[i][j] != BLANK) {
                    printf("该位置已有棋子,请重新输入\n");
                    continue;
                }
                if (i >= MAX_ROW || j >= MAX_COL || i < 0 || j < 0) {
                    printf("输入超出棋盘范围,请重新输入\n");
                    continue;
                }
                break;
            }
            chessboard[i][j] = BLACK;
            draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
            if (is_win(chessboard, MAX_ROW, MAX_COL) == BLACK) {
                printf("黑棋胜");
                exit(0);
            }
            save_chess(chessboard, MAX_ROW, MAX_COL);
        } else if (step % 2 == 0) {
            while (1) {
                i = random_create_point();
                j = random_create_point();
                if (chessboard[i][j] == BLANK)
                    break;
            }
            chessboard[i][j] = WHITE;
            draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
            if (is_win(chessboard, MAX_ROW,  MAX_COL) == WHITE) {
                printf("白棋胜");
                exit(0);
            }
            save_chess(chessboard, MAX_ROW, MAX_COL);
        }
    }
    if (is_full(chessboard, MAX_ROW, MAX_COL) == 1)
        printf("棋盘已满");
}
//存盘
void  save_chess(int chessboard[][MAX_COL], int row, int col) {
    int choice ;
    FILE *fp;
    printf("是否选择结束游戏,并保存当前棋局\n");
    printf("*********1.存盘并退出***********\n");
    printf("*********2.继续游戏*************\n");
    printf("请选择 :");
    while (1) {
        scanf("%d", &choice);
        if (choice > 2) {
            printf("输入错误,请重新选择\n");
            continue;
        }
        break;
    }
    if (choice == 1) {
        if ( ( fp = fopen( "Save_chess.txt", "w" ) ) == NULL ) {
            printf(" 保存失败\n");
        } else {
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    fprintf(fp, "%d", chessboard[i][j]);
                }
            }
            fclose(fp);
            printf("恭喜您,保存成功");
        }
        exit(0);
    }
}
//复盘
void replay_chess(void) {
    int  chessboard[MAX_ROW][MAX_COL] = {BLANK};
    FILE *fp;
    char ch;
    if ((fp = fopen("Save_chess.txt", "w")) == NULL) {
        printf("复盘失败");
    } else {
        for (int i = 0; i < MAX_ROW; i++) {
            for (int j = 0; j < MAX_COL; j++) {
                fscanf(fp, "%d", chessboard[i][j]);
            }
        }
        fclose(fp);
        draw_chessboardn(MAX_ROW, MAX_COL, chessboard);
    }
}

void humanVsHuman() 里面
void draw_chessboard(int row, int col, int chessboard[][BOARD_SIZE]);
void print_chessboard(char chessboard[][BOARD_SIZE]);
这里是定义,不是调用

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7658162
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:c语言学习-自定义函数并调用将一个字符串中的小写字母改为大写字母(数组元素和数组名作函数参数)
  • 除此之外, 这篇博客: 【C语言】图书登记及学生信息登记作业代码中的 有一批图书,每本图书要登记作者姓名、书名、出版社、出版年月、价格等信息,试编写一个程序完成下列任务: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • ⑴ 读入每本书的信息存入数组中。
    ⑵ 输出价格在19.80元以下的书名及出版社名。
    ⑶ 输出2006年以后出版的图书具体信息。
    
    #include<stdio.h>
    #define N 99
    struct date				//出版日期
    {
    	int year;
    	int month;
    	int day;
    };
    struct xinxi
    {
    	char author[N];		//作者
    	char bookname[N];	//书名
    	char publisher[N];	//出版社
    	struct date publish_date;		//结构体嵌套
    	float price;		//价格
    }xx[N];
    void main()
    {
    	int n;
    	printf("要登记书的数量:");
    	scanf("%d",&n);
    	int i,j;
    	struct xinxi t;
    	printf("分别输入%d本书的作者、书名、出版社、出版年月、价格:\n",n);
    	for(i=0; i<n; i++)
    	{
    		scanf("%s %s %s %d-%d-%d %f",xx[i].author,xx[i].bookname,xx[i].publisher,
    				&xx[i].publish_date.year,&xx[i].publish_date.month,&xx[i].publish_date.day,&xx[i].price);
    
    	}
    	for(i=0; i<n; i++)
    	{
    		if(xx[i].price < 19.80)
    			printf("价格在19.80元以下的书名及出版社名:%s  %s\n",xx[i].bookname,xx[i].publisher);
    		if(xx[i].publish_date.year > 2006)
    			printf("2006年以后出版的图书具体信息:%s %s %s %d-%d-%d %.2f\n",xx[i].author,xx[i].bookname,xx[i].publisher,
    				xx[i].publish_date.year,xx[i].publish_date.month,xx[i].publish_date.day,xx[i].price);
    	}
    	
    }
    
    
  • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商视觉设计配色技巧课程中的 电商视觉设计中子栏目频道图标的视觉配色方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对你的问题,我们可以考虑以下几个方向进行排除:

    1.检查绘制棋盘的代码是否有误,并确认是否调用了该函数。

    2.检查选择模式后是否有适当的流程和条件判断语句。

    3.检查显示棋盘的代码是否有误,比如是否使用了正确的输出函数等等。

    下面是一个简单的C语言实现五子棋游戏的例子,供您参考和对比:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define BOARD_SIZE 15
    
    char board[BOARD_SIZE][BOARD_SIZE];
    
    void init_board()
    {
        int i, j;
        for (i = 0; i < BOARD_SIZE; i++) {
            for (j = 0; j < BOARD_SIZE; j++) {
                board[i][j] = '+';
            }
        }
    }
    
    void print_board()
    {
        int i, j;
        printf("   ");
        for (i = 0; i < BOARD_SIZE; i++) {
            printf("%2d ", i + 1);
        }
        printf("\n");
        printf("  +");
        for (i = 0; i < BOARD_SIZE; i++) {
            printf("--+");
        }
        printf("\n");
        for (i = 0; i < BOARD_SIZE; i++) {
            printf("%2d|", i + 1);
            for (j = 0; j < BOARD_SIZE; j++) {
                printf("%c |", board[i][j]);
            }
            printf("\n");
            printf("  +");
            for (j = 0; j < BOARD_SIZE; j++) {
                printf("--+");
            }
            printf("\n");
        }
        printf("\n");
    }
    
    int main()
    {
        init_board();
        print_board();
        return 0;
    }
    

    该示例代码中首先定义了五子棋盘的大小,然后实现了初始化棋盘和打印棋盘的函数。在主函数中,我们首先对棋盘进行了初始化,然后调用了打印棋盘的函数。运行该程序后,你应该可以看到一个大小为15x15的棋盘被成功打印出来。

    如果你的代码实现方式不同,可以考虑参考以上示例代码,或者将你的代码片段发出来进行更详细的分析和解决方案共享。