C语言实现三子棋

C语言简单实现三子棋

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

#define ROWS 3
#define COLS 3


void menu()//菜单函数,输出可供选择的菜单
{
    printf("**************************\n");
    printf("***** 1.PLAY  0.EXIT *****\n");
    printf("**************************\n");
}
void init_board(char arr[ROWS][COLS], int x, int y)//初始化函数
{
    int i = 0;
    int j = 0;
    for (i = 0; i < x; i++)
    {
        for (j = 0; j < y; j++)
        {
            arr[i][j] = ' ';//将一个二维数组全部初始化成空格
        }
    }
}
void display_board(char arr[ROWS][COLS])//显示棋盘函数
{
    int i = 0;
    for (i = 0; i < ROWS; i++)
    {
        if (i < 2)//在前两行输出下方的棋盘
        {
            printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
            printf("---|---|---\n");
        }
        else
        {
            printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
        }
    }
}

void player_move(char arr[ROWS][COLS])//玩家的下棋函数
{
    int i = 0;
    int j = 0;
    printf("请输入坐标:\n");
    while (1)
    {
        scanf("%d%d", &i, &j);
        if ((i >= 1 && i <= ROWS) && (j >= 1 && j <= ROWS))
            //判断坐标输入的正确性
        {
            i--; j--;
        }
        if (arr[i][j] == ' ')
        {
            arr[i][j] = 'x'; 
            break;
        }
        else//如果输入错误,则一直循环,直到输入正确
        {
            printf("请重新输入坐标:");
        }
    }
}

int full(char arr[ROWS][COLS])//检查棋盘是否输入满
{
    int i = 0; int j = 0;
    int count = 0;
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            if (arr[i][j] != ' ')
            {
                count++;
            }
        }
    }
    return count;
}

void com_move(char arr[ROWS][COLS])//电脑行走函数
{
    int a = 0, b = 0;
    while (1)
    {
        a = rand() % 3;//对a去一个[0,2]的随机数
        b = rand() % 3;//对b去一个[0,2]的随机数
        if (arr[a][b] == ' ')//如果期盼中这个位置没有下过的棋
        {
            arr[a][b] = 'c';
            break;
        }
    }
}

int check_win(char arr[ROWS][COLS], int c)//判断输赢函数,将之前判满函数的返回值传入
{

    int i = 0; int j;
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS;j++)
        if ((arr[i][0] == 'x' && arr[i][1] == 'x' && arr[i][2] == 'x'&& arr[i][1] != ' ') || (arr[0][2] == 'x' && arr[1][1] == 'x' && arr[3][1] == 'x'&& arr[1][1] != ' ') || (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x'&&arr[1][1] != ' '))
            return 1;
        else if (arr[0][j] == 'x' && arr[1][j] == 'x'&& arr[2][j] == 'x' &&arr[1][j] != ' ')
            return 1;
    }
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        if ((arr[i][0] == 'c' && arr[i][1] == 'c' && arr[i][2] == 'c'&& arr[i][1] != ' ') || (arr[0][2] == 'c' && arr[1][1] == 'c' && arr[3][1] == 'c'&& arr[1][1] != ' ') || (arr[0][0] == 'c' && arr[1][1] == 'c' && arr[2][2] == 'x'&&arr[1][1] != ' '))
            return 2;
        else if (arr[0][j] == 'c' && arr[1][j] == 'c'&& arr[2][j] == 'c' &&arr[1][j] != ' ')
            return 2;
    }
    if (full == 9)
        return 'q';
    return ' ';
}

void game()
{
    char board[ROWS][COLS];//创建一个符合条件的二维数组
    int i = 0;
    int j = 0;
    int m = 0;
    int ret = 0;
    init_board(board, ROWS, COLS);//初始化这个二维数组
    display_board(board);//显示一次初始化好的棋盘
    while (1)

    {
        player_move(board);//玩家走
        printf("\n");
        display_board(board);//玩家走完,显示一次棋盘
        ret = full(board);//判棋盘是否已满,传回参数给ret
        m = check_win(board, ret);//判数赢
        if (m == 1)//返回1,玩家赢
        {
            printf("你赢了!\n\n");
            break;
        }
        else
        {
            if (ret == 9)
            {
                printf("平局\n");
                break;//跳出循环
            }
            else
            {
                printf("电脑下:\n\n");
                srand((unsigned)time(NULL));//随机数需要的一个条件
                com_move(board);//电脑走
                m = check_win(board, ret);//判数赢
                display_board(board);
                if (m == 2)
                {
                    printf("你输了!\n\n");
                    break;
                }
                else if (ret)
                {
                    if (ret == 9)
                    {
                        printf("平局\n");
                        break;//跳出循环
                    }
                }
                else
                    continue;
            }
        }
    }
}

int main()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择->:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            exit(0);
        default:
            break;
        }
    } while (input);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值