C语言实现井字棋(网课学习成果)

终于用C语言实现了井字棋游戏。代码是学习网络讲师鹏哥的课程跟着写的。

怕忘,就发上来留着,自用。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define ROW 3
#define COL 3

//棋盘格式化函数
void displayBoard(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 InitBoard(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 playerMove(char board[ROW][COL], int row, int col){
    int x=0;
    int y=0;
    printf("-[玩家行动回合]-\n");
    while (1)
    {
        printf("[请输入坐标]\n");
        scanf("%d%d", &x, &y);
        // 判断坐标合法性
        if (x>=1 && x<= row && y>=1 && y<= col)
        {
            if (board[x-1][y-1]==' ')
            {
                board[x-1][y-1]='*';
                break;
            }
        }
        else
        {
            printf("[坐标范围超限][请重新输入]\n");
        }
    }
}

// 电脑行动
void computerMove(char board[ROW][COL], int row, int col){
    int x=0;
    int y=0;
    printf("-[电脑行动回合]-\n");
    while (1)
    {
        // 随机数
        x = rand()%row;
        y = rand()%col;
        if (board[x][y]==' ')
        {
            board[x][y]='#';
            break;
        }
    }
}

// 判断平局函数
int IsFull(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++)
        {
            if (board[i][j]==' ')
                // 找到空值返回0
                return 0;
        }
    }
    // 棋盘全满返回1
    return 1;
}

// 判断输赢函数
char Iswin(char board[ROW][COL], int row, int col){
    int i=0;
    // 盘算横行
    for (i=0;i<row;i++)
    {
        if (board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1] != ' ')
            return board[i][1];
    }
    // 判断竖列
    for (i=0;i<col;i++)
    {
        if (board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i] != ' ')
            return board[1][i];
    }
    // 对角线1
    if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1] != ' ')
        return board[1][1];
    // 对角线2
    if (board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ')
        return board[1][1];
    // 判断平局
    if (1==IsFull(board, ROW, COL))
    {
        return 'q';
    }
    // 继续游戏
    return 'c';
}

// 游戏运行函数
void gameZone(){
    int ret=0; // 输赢参数
    char board[ROW][COL]={0};
    // 初始化棋盘函数
    InitBoard(board, ROW, COL);
    // 显示棋盘函数
    displayBoard(board, ROW, COL);
    // 开始下棋
    while (1)
    {
        // 玩家行动
        playerMove(board, ROW, COL);
        displayBoard(board, ROW, COL);
        ret = Iswin(board, ROW, COL);
        if (ret != 'c')
            break;
        sleep(1);
        // 电脑行动
        computerMove(board, ROW, COL);
        displayBoard(board, ROW, COL);
        ret = Iswin(board, ROW, COL);
        if (ret != 'c')
            break;
    }
    if (ret == '*')
        printf("[玩家胜利]\n\n");
    else if (ret == '#')
        printf("[电脑胜利]\n\n");
    else if (ret == 'q')
        printf("[双方平局]\n\n");
    sleep(1);
}

// 开始界面
void startMenu(){
    printf("[井字棋游戏]\n");
    printf("[1.开始游戏]\n");
    printf("[0.退出游戏]\n");
}

// 主函数
int main(){
    int select=0;
    // 利用时间戳设置随机种子
    srand((unsigned int)time(NULL));
    do
    {
        startMenu();
        printf("[请选择:]");
        select=scanf("%d", &select);
        switch (select)
        {
            case 1:
            {
                gameZone();
                break;
            }
            default:
            {
                printf("[输入错误]\n");
                break;
            }
        }
    } while (select);
    
    return 0;
}

Windows系统需将<unistd.h>改为<windows.h>

同时sleep(1)改为Sleep(1000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值