奇怪的bug+1 2022-10-16 23:06 采纳率: 50%
浏览 16

输入错误内容无法进入理想中的语句中(此问题与打印三子棋有关 代码步骤大致为 1.建立开始菜单 2.打印棋盘 3.进行下棋)

创建头文件
game.h


#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//函数声明
void game();
void intputBoard(char board[ROW][COL], int row, int col);
void displayBoadr(char board[ROW][COL], int  row, int col);
void playerBoard(char board[ROW][COL], int row,int col);
**//问题1.menu()后,如果选择例如 "abc"会执行switch 0中的退出游戏,而不是执行switch中的default
//问题2.在选择输入坐标后,如果选择例如 1.2 (非1,2 ),会进入死循环**

创建源文件(main()在这个文件中)
text.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void menu()
{
    printf("**********************\n");
    printf("*****1.play 0.exit****\n");
    printf("**********************\n");
}


void game()
{
    //定义数组
    char board[ROW][COL] = { 0 };
    //数组初始化
    intputBoard(board, ROW, COL);//传参的时候只用写数组名,便把整个数组传过去了
    //打印棋盘
    displayBoadr(board, ROW, COL);
    //进行下棋(玩家下棋,电脑下棋)
    playerBoard(board, ROW, COL);
    
}


int main()
{
    srand((unsigned int)time(NULL));
    int intput = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf_s("%d", &intput);
        switch (intput)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,请重新选择:\n");
            break;
        
        }
    } while (intput!=0);
    return 0;
}

创建源文件
game.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//棋盘初始化
void intputBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}
//打印棋盘
void displayBoadr(char board[ROW][COL], int  row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)//控制打印多少行
    {
        //打印一行
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)
            {
                printf("|");
            }
        }
        printf("\n");
        //打印分割符
        if (i < row - 1)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                {
                    printf("|");
                }
                
            }
            printf("\n");
        }
    }
}


void playerBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;//接收row
    int j = 0;//接收col
    int count = 0;//计算总共下了多少次棋
    int flag = 0;//判断是否成功下棋
    while(1)
    {
        //玩家下棋 **************************
    
        printf("玩家开始下棋\n");
    player:    
        printf("请输入所下点坐标;>");
        scanf_s("%d,%d", &i, &j);
        //判断坐标是否合法(1.row col 要在范围内  2.board[i-1][j-1]!=' ' 所下坐标未被下过)
        if (i <= row && j <= col)
        {
            flag = 0;
            while(flag==0)
            {
                if (board[i - 1][j - 1] == ' ')
                {
                    board[i - 1][j - 1] = '*';
                    count++;
                    flag = 1;
                    printf("********玩家下棋完成*********\n");
                    printf("count=%d \n", count);
                    displayBoadr(board, ROW, COL);//打印棋盘
                }
                else
                {
                    printf("所选坐标已经被下过\n");
                    goto player;
                }
            }
        }
        else
        {
            printf("输入非法坐标\n");
            goto player;
        }
        if (count == row * col)
        {
            printf("游戏结束\n");
            break;
        }
        //电脑下棋 ###################################
        printf("电脑开始下棋\n");
    computer:
        flag = 0;
        i = rand() % row+1;//i 1~row
        j = rand() % col +1;//j 1~col
        if (i <= row && j <= col)
        {
            while(flag==0)
            {
                if (board[i - 1][j - 1] == ' ')
                {
                    board[i - 1][j - 1] = '#';
                    count++;
                    flag = 1;
                    printf("#########电脑下棋完成#########\n");
                    printf("count=%d \n", count);
                    displayBoadr(board, ROW, COL);
                }
                else
                {
                    goto computer;
                }
            }
        }
        else
        {
            goto computer;
        }
        if (count == row * col)
        {
            printf("游戏结束\n");
            break;
        }
        
    }
}

  • 写回答

1条回答 默认 最新

  • honestman_ 2022-10-17 10:24
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 10月16日

悬赏问题

  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥15 关于超局变量获取查询的问题
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能
  • ¥20 关于多单片机模块化的一些问题