C语言三子棋

发布于:2022-07-29 ⋅ 阅读:(227) ⋅ 点赞:(0)

使用工具:vs2022

第一步,创建三个文件:game.c(游戏函数的具体实现),game.h(游戏函数的声明),test.c(主函数)

当以上三个文件都创建好以后,进入test.c源文件中编写代码,代码如下 >:

#define _CRT_SECURE_NO_WARNINGS


//引用自己编写的函数声明
#include "game.h"

int main()
{
    int i = 1;
    //随机数
    srand((unsigned int )time(NULL));

    while (i)
    {
        //打印菜单
        game_menu();
        //选择 游戏/退出
        scanf("%d", &i);
        //进入switch循环,开始游戏
        switch (i)
        {
        case 1:
            //开始游戏
            game_play();
            break;
        case 0:
            i = 0;
            printf("退出成功!");
            break;
        default:
            printf("输入错误,请重新输入:>\n");
            break;
        }
    }

    return 0;
}

以上是主函数的逻辑,游戏函数全部写在game.c中,声明全部写在game.h中

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二步:

进入game.h,代码如下>:

//以下所有函数都在game.c中实现

#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//数组大小
#define ROW 3
#define COL 3

//游戏菜单
void game_menu();

//数组初始化
void init_arr(char arr[ROW][COL], int row, int col);

//打印棋盘
void game_che(char arr[ROW][COL], int row, int col);

//玩家下棋
void game_player(char arr[ROW][COL], int row, int col);

//电脑下棋
void game_npc(char arr[ROW][COL], int row, int col);

//判断输赢
char game_yes_no(char arr[ROW][COL], int row, int col);

//开始游戏
void game_play();

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第三步:

进入game.c,代码如下 >:

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//游戏菜单
void game_menu()
{
    printf("**************************\n");
    printf("*** 1,开始游戏(Play)  ***\n");
    printf("*** 0,退出游戏(Exit)  ***\n");
    printf("**************************\n");

}

//数组初始化
void init_arr(char arr[ROW][COL], int row, int col)
{
    //把每个数组元素都初始化为空格
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';
        }
    }
}

//打印棋盘
void game_che(char arr[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 ",arr[i][j]);
            //打印到最后已列,不打印 |
            if (j < col - 1)
            {
                printf("|");
            }
        }
        printf("\n");
        int k = 0;

        //打印到最后一行,不再打印分割线
        if (i < row - 1)
        {
            for (k = 0; k < row; k++)
            {

                printf("---");

                if (k < row - 1)
                {
                    printf("|");
                }

            }
        }
        
        printf("\n");
    }
}

//玩家下棋
void game_player(char arr[ROW][COL], int row, int col)
{

    //由于是在命令提示符中玩游戏,所以只能输入数组下标实现落子功能

    //下标和数组元素下标一致
    //玩家输入坐标,然后将坐标元素改成 *
    //玩家输入坐标不能越界,
    //已经落子的坐标不能再次落子
    int i = 0;
    int j = 0;

    while (1)
    {
        printf("请输入坐标:>\n");
        scanf("%d %d", &i, &j);

        //判断玩家输入的坐标是否越界
        if (i < row && j < col)
        {
            //判断玩家输入的坐标是否已经落子
            if (arr[i][j] == ' ')
            {
                arr[i][j] = '*';
                break;
            }
            else
            {
                printf("此坐标已被落子,请重新输入坐标\n");
            }
        }
        else
        {
            printf("坐标越界,请重新输入坐标\n");
        }
    }

}

//电脑下棋
void game_npc(char arr[ROW][COL], int row, int col)
{
    printf("\n电脑落子>:");

    while (1)
    {
        //电脑生成随机数

        //在使用rand函数之前,要先使用srand函数,srand函数在test.c中使用一次即可
        int i = rand() % row;
        int j = rand() % col;

        //判断坐标是否落子,如果随机生成的坐标被落子,那么继续循环
        //直到生成没有被落子的下标
        if (arr[i][j] == ' ')
        {
            //电脑落子为 # 
            arr[i][j] = '#';
            printf("%d %d\n",i,j);
            break;
        }
    }
}


//判断输赢
char game_yes_no(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;

    //判断每行的字符是否一致,如果一致,跳出游戏循环
    for (i = 0; i < col; i++)
    {
        if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
        {
            return arr[i][0];
        }
    }

    //判断每列的字符是否一致,如果一致,跳出游戏循环
    for (i = 0; i < row; i++)
    {
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ')
        {
            return arr[0][i];
        }
    }

    //判断两个对角线
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] != ' ')
    {
        return arr[0][0];
    }

    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
    {
        return arr[0][2];
    }

    //判断棋盘是否下满
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //如果有任意一个数组元素为 空格,说明棋盘还没有下满
            if (arr[i][j] == ' ')
            {
                return 'y';
            }
        }
    }

    //否则,以上条件都不满足,和局
    return 'c';
    
}

//开始游戏
void game_play()
{
    //棋盘是3 * 3 的,所以我们创建一个二维数组
    char arr[ROW][COL];

    //初始化二维数组
    init_arr(arr, ROW, COL);

    //打印棋盘
    game_che(arr, ROW, COL);

    char ch = ' ';

    while (1)
    {
        
        //玩家下棋
        game_player(arr, ROW, COL);
        //打印棋盘
        game_che(arr, ROW, COL);
        //判断输赢和平局
        ch = game_yes_no(arr,ROW, COL);
        //只要ch 不等于 y ,说明游戏已经分出胜负,不然就是平局,此时跳出循环
        //到下方判断
        if (ch != 'y')
        {
            break;
        }


        

        //电脑下棋
        game_npc(arr, ROW, COL);
        //不论输赢,最后一次打印棋盘
        game_che(arr, ROW, COL);
        //判断输赢和平局
        ch = game_yes_no(arr, ROW, COL);
        if (ch != 'y')
        {
            break;
        }

    }

    // * 玩家赢
    // # 电脑赢
    // c 平局

    if (ch == '*')
    {
        printf("玩家赢!\n");
    }
    else if (ch == '#')
    {
        printf("电脑赢!\n");
    }
    else if (ch == 'c')
    {
        printf("平局!\n");
    }

}

本文含有隐藏内容,请 开通VIP 后查看