从零开始写代码 2023-06-09 21:53 采纳率: 69.2%
浏览 32
已结题

模块化编程——五子棋游戏

关于下棋后无法打印棋盘的问题

img

代码如下:
main.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "include\game.h"
#define SIZE 15

int main()
{
    int input = 0;
    do
    {
        srand((unsigned int)time(NULL));
        menu();
        printf("请选择(1—play/0—exit):>");
        scanf("%d", &input);
        switch (input)
        { 
        case 1:
            printf("五子棋游戏\n");
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误,重新输入\n");
            break;
        }
    } while (input);
    return 0;
}

game.c


```c
#include "game.h"
#define SIZE 15
int board[SIZE][SIZE];
int player = 1;
int game_over = 0;
int i,j;
void menu()
{
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    printf("=+= Wellcome to Five-in-a-Row! =+=\n");
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
}
void init_game() {
    for ( i = 0; i < SIZE; i++) {
        for ( j = 0; j < SIZE; j++) {
            board[i][j] = 0;
        }
    }
    player = 1;
    game_over = 0;
}
void draw_board() {
    printf("\n");
    for ( i = 0; i <= SIZE; i++) {
        printf("%2d", i);
        if (i == 0) {
            printf(" ");
        } else {
            printf("|");
        }
        for ( j = 1; j <= SIZE; j++) {
            if (i == 0) {
                printf("%2d", j);
            } 
            else {
                if (board[i-1][j-1] == 0) {
                    printf("%2c", ' ');
                } 
                else {
                    printf("%2c", board[i-1][j-1] == 1 ? 'X' : 'O');
                }
            }
            printf("|");
        }
        printf("\n");
        if (i == 0) {
            for (j = 0; j <= SIZE; j++) {
                printf("---");
            }
            printf("\n");
        }
    }
    printf("\n");
}
int check_pos(int x, int y) {
    if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) {
        return -1;
    } else {
        return board[x][y];
    }
}
int check_line(int x, int y, int dx, int dy) {
    for ( i = 0; i < 5; i++) {
        if (check_pos(x + i*dx, y + i*dy) != player) {
            return 0;
        }
    }
    return 1;
}
int check_win() {
    for ( i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            if (check_line(i, j, 1, 0) || check_line(i, j, 0, 1) || check_line(i, j, 1, 1) || check_line(i, j, 1, -1)) {
                return 1;
            }
        }
    }
    return 0;
}
void game_loop() {
    int x, y;
    draw_board();
    while (!game_over) {
        printf("Player %d's turn.\n", player);
        printf("Enter X coordinate: ");
        scanf("%d", &x);
        printf("Enter Y coordinate: ");
        scanf("%d", &y);
        if (board[x-1][y-1] != 0) {
            printf("Invalid move. Please try again.\n");
            continue;
        }
        board[x-1][y-1] = player;
        if (check_win()) {
            printf("Player %d wins!\n", player);
            game_over = 1;
        } else if (player == 1) {
            player = 2;
        } else {
            player = 1;
        }
        draw_board();
    }
}
void game()
{
    init_game();
    game_loop();
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    printf("=+= Thank you for playing Five-in-a-Row! =+=\n");
    printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
}

game.h


```c
#ifndef _GAME_H
#define _GAME_H
void menu();
void game();
void init_game();
void draw_board();
int check_pos(int x, int y);
int check_line(int x, int y, int dx, int dy);
int check_win();
void game_loop();


#endif

这是项目里的情况

img

img

img

resouce文件夹里是空的

如果有知道请帮忙发一下修改后的源码。

  • 写回答

3条回答 默认 最新

  • 卡拉肖克·小黑 2023-06-10 11:21
    关注

    把定义为全局变量的x和y改为局部变量,你的x和y定义的全局变量,下面好多函数又对x和y进行赋值,程序会死在check_win() 这个函数上,这个函数出现死循环。

    #include "game.h"
    #define SIZE 15
    int board[SIZE][SIZE];
    int player = 1;
    int game_over = 0;
    void menu()
    {
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
        printf("=+= Wellcome to Five-in-a-Row! =+=\n");
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    }
    void init_game() 
    {
        int i, j;
        for (i = 0; i < SIZE; i++) 
        {
            for (j = 0; j < SIZE; j++) 
            {
                board[i][j] = 0;
            }
        }
        player = 1;
        game_over = 0;
    }
    void draw_board() 
    {
        int i, j;
        printf("\n");
        for (i = 0; i <= SIZE; i++) 
        {
            printf("%2d", i);
            if (i == 0) 
            {
                printf(" ");
            }
            else {
                printf("|");
            }
            for (j = 1; j <= SIZE; j++) 
            {
                if (i == 0) 
                {
                    printf("%2d", j);
                }
                else 
                {
                    if (board[i - 1][j - 1] == 0) 
                    {
                        printf("%2c", ' ');
                    }
                    else 
                    {
                        printf("%2c", board[i - 1][j - 1] == 1 ? 'X' : 'O');
                    }
                }
                printf("|");
            }
            printf("\n");
            if (i == 0) 
            {
                for (j = 0; j <= SIZE; j++) 
                {
                    printf("---");
                }
                printf("\n");
            }
        }
        printf("\n");
    }
    int check_pos(int x, int y) 
    {
        int i, j;
        if (x < 0 || x >= SIZE || y < 0 || y >= SIZE)
        {
            return -1;
        }
        else {
            return board[x][y];
        }
    }
    int check_line(int x, int y, int dx, int dy) 
    {
        int i, j;
        for (i = 0; i < 5; i++) 
        {
            if (check_pos(x + i * dx, y + i * dy) != player) 
            {
                return 0;
            }
        }
        return 1;
    }
    int check_win() 
    {
        int i, j;
        for (i = 0; i < SIZE; i++) 
        {
            for (j = 0; j < SIZE; j++) 
            {
                if (check_line(i, j, 1, 0) || check_line(i, j, 0, 1) || check_line(i, j, 1, 1) || check_line(i, j, 1, -1))
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    void game_loop()
    {
        int x, y;//
        draw_board();
        while (!game_over) 
        {
            printf("Player %d's turn.\n", player);
            printf("Enter X coordinate: ");
            scanf("%d", &x);
            printf("Enter Y coordinate: ");
            scanf("%d", &y);
            if (board[x - 1][y - 1] != 0)
            {
                printf("Invalid move. Please try again.\n");
                continue;
            }
            board[x - 1][y - 1] = player;
            if (check_win()) 
            {
                printf("Player %d wins!\n", player);
                game_over = 1;
            }
            else if (player == 1)
            {
                player = 2;
            }
            else 
            {
                player = 1;
            }
            draw_board();
        }
    }
    void game()
    {
        init_game();
        game_loop();
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
        printf("=+= Thank you for playing Five-in-a-Row! =+=\n");
        printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n");
    }
    

    改完之后的结果:

    img


    我只改了你说的无法打印棋盘问题,其他的还没看检查。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 创建了问题 6月9日