C语言:三子棋

三子棋本该在扫雷之前完成,但是做的时候觉得扫雷比较炫酷就先完成了扫雷,然后发现三子棋和扫雷实现过程还是有一定不同的.
与扫雷一样,三子棋也有几个步骤.
1.创建二维数组作为棋盘,三子棋只有九个格子所以创建3*3的棋盘就好了.
2.初始化棋盘,将棋盘全部初始化为’ '.
3.玩家输入坐标落子,这一步当中要判断坐标是否越界以及想要落子的坐标是否以及有子.
4.判断玩家落子后游戏是否结束.
5.电脑落子.这里要注意我们让电脑落子的方式是srand生成随机坐标,所以电脑下的每一个子之间是没有什么逻辑关联的,纯乱下,想让电脑获胜显得比让我们获胜更难.所以这种方式要是放在五子棋游戏中就会显得天花乱坠.
6.判断游戏是否结束
7.循环3至6步

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_ROW 3
#define MAX_COL 3

void Init(char board[MAX_ROW][MAX_COL]){
    for (int row = 0; row < MAX_ROW; ++row){
        for (int col = 0; col < MAX_COL; ++col){
            board[row][col] = ' ';
        }
    }
    srand(time(NULL));
}

void Print(char board[MAX_ROW][MAX_COL]){
    printf(" ---|---|---\n");
    for (int row = 0; row < MAX_ROW; ++row){
        printf("| %c | %c | %c |\n",
               board[row][0], board[row][1], board[row][2]);
        printf(" ---|---|---\n");
    }
}

void PlayMove(char board[MAX_ROW][MAX_COL]){
    while (1){
        printf("请输入坐标(row col):\n");
        int row = 0;
        int col = 0;
        scanf("%d %d", &row, &col);
        if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
            printf("您的输入有误!\n");
            continue;
        }
        if (board[row][col]!=' '){
            printf("这个位置已经有子了,请重新落子!\n");
            continue;
        }
        board[row][col] = 'x';
        break;
    }
}

void ComputerMove(char board[MAX_ROW][MAX_COL]){
    while (1){
        int row = rand() % MAX_ROW;
        int col = rand() % MAX_COL;
        if (board[row][col] != ' '){
            continue;
        }
        board[row][col] = 'o';
        break;
    }
}
int IsFull(char board[MAX_ROW][MAX_COL]){
    for (int row = 0; row < MAX_ROW; ++row){
        for (int col = 0; col < MAX_COL; ++col){
            if (board[row][col] == ' '){
                return 0;
            }//棋盘没有满返回0
        }
    }
    return 1;
}

char IsWin(char board[MAX_ROW][MAX_COL]){
    for (int row = 0; row < MAX_ROW; ++row){
        if (board[row][0] == board[row][1]
            && board[row][0] == board[row][2]
            && board[row][0] != ' '){
            return board[row][0];
        }
    }
    for (int col = 0; col < MAX_COL; ++col){
        if (board[0][col] == board[1][col]
            && board[0][col] == board[2][col]
            && board[0][col] != ' '){
            return board[0][col];
        }
    }
    if (board[0][0]==board[1][1]
        &&board[0][0]==board[2][2]
        &&board[0][0]!=' '){
        return board[0][0];
    }
    if (board[0][2] == board[1][1]
        && board[0][2] == board[2][0]
        &&board[0][2] != ' '){
        return board[0][2];
    }
    if (IsFull(board)){
        return '=';
    }
    return ' ';
}

int main(){

    char chess_board[MAX_ROW][MAX_COL];
    Init(chess_board);
    char result = ' ';
    while (1){
        Print(chess_board);
        PlayMove(chess_board);
        result = IsWin(chess_board);
        if (result != ' '){
            break;
        }
        ComputerMove(chess_board);
        result = IsWin(chess_board);//判定游戏是否结束
        if (result != ' '){
            break;
        }
    }
    if (result == 'x'){
        Print(chess_board);
        printf("Winner!\n");
    }
    else if (result == 'o'){
        Print(chess_board);
        printf("Loser!\n");
    }
    else{
        Print(chess_board);
        printf("卢本伟牛逼!\n");
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值