首页 > 编程语言 > 详细

三子棋小游戏(C语言数组实现)

时间:2021-02-05 23:21:40      阅读:37      评论:0      收藏:0      [点我收藏+]
一,游戏效果
技术分享图片
二,游戏规则
1.输入1进入游戏
2.输入0退出游戏
3.玩家先走
4.玩家落子是选择棋盘的坐标位置
5.电脑是随机落子
6.如果电脑连了三子则提示电脑赢了,选择要不要继续游戏
三,实现游戏的代码思路
先构架游戏整体思路

void game()
{
    char ret = 0;
    //数组存放棋盘信息
    char board[ROW][COL] = { 0 };//二维数组的初始化并没有这么简单
    int row = ROW;
    int col = COL;
    //1.初始化棋盘
    //一定要初始化
    InitBoard(board, ROW, COL);
    //2.打印棋盘
    DisplayBoard(board, ROW, COL);
    //3.玩游戏,开始下棋了
    while (1)
    {
        //玩家下棋
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断玩家是否赢了
        ret = Iswin(board, ROW, COL);
        //如果不是游戏继续,那么就直接跳出循环
        if (ret != ‘D‘)
        {
            break;
        }

        //电脑下棋
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断电脑是否赢了
        ret = Iswin(board, ROW, COL);
        //如果不是游戏继续,那么就直接跳出循环
        if (ret != ‘D‘)
        {
            break;
        }
    }
    if (ret == ‘X‘)
        printf("玩家赢了\n");
    else if (ret == ‘O‘)
        printf("电脑赢了\n");
    else
        printf("平局\n");
}

再分步写出相应所需函数
1.菜单函数

void mnue()
{
    printf("-------------------------------\n");
    printf("-------------------------------\n");
    printf("----1.play       0.exit--------\n");
    printf("-------------------------------\n");
    printf("-------------------------------\n");
}

2.初始化棋盘函数

//函数的初始化
//将棋盘所有元素都初始化为空格
//空格为不在屏幕上显示其字符的字符(0也是)
void InitBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            board[i][j] = ‘ ‘;
        }
    }
}

3.打印棋盘函数

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        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");
        }
    }
}

4.用来存储玩家下棋信息的函数

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家走\n");
    while (1)
    {
        printf("请输入要下的坐标:");
        scanf("%d%d", &x, &y);
        if (x >= 1 && y >= 1 && x <= row && y <= col)
        {
            if (board[x - 1][y - 1] == ‘ ‘)
            {
                board[x - 1][y - 1] = ‘X‘;
                break;
            }
            else
                printf("该坐标被占用,请重新输入\n");
        }
        else
            printf("该坐标不存在,请重新输入\n");
    }
}

5.电脑随机下棋的函数

//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("电脑走\n");//三子棋中电脑只要下在空棋盘上即可
    int x = 0;
    int y = 0;
    while (1)
    {
        x = rand() % row;//将电脑走的随机值控制在棋盘中
        y = rand() % col;
        if (x >= 1 && y >= 1 && x <= row && y <= col)
        {
            if (board[x - 1][y - 1] == ‘ ‘)
            {
                board[x - 1][y - 1] = ‘O‘;
                break;
            }
        }
    }
}

6.判断棋盘是否满了的函数

//返回1,表示棋盘满了
//返回0,表示棋盘还没满
int IsFull(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ‘ ‘)
                return 0;//没满
        }
    }
    return 1;//满了
}

7.判断输赢和游戏是否继续的函数

//判断输赢和游戏是否继续
//判断输赢
//4种状态
//1.玩家赢了---‘X‘
//2.电脑赢了---‘O‘
//3.平局----‘C‘
//4.游戏继续---‘D‘

char Iswin(char board[ROW][COL], int row, int col)
{
    int i = 0;

    //横3行
    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][0];//Iswin直接结束
        }
    }

    //列3行
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ‘ ‘)
        {
            return board[0][i];
        }
    }

    //两个对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ‘ ‘)
        return board[1][1];
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ‘ ‘)
        return board[1][1];

    //判断是否平局
    if (1 == IsFull(board, ROW, COL))
        return ‘C‘;

    //继续游戏
    return ‘D‘;
}

8.主函数控制游戏的进程

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));//扩大电脑走的随机值范围
    do
    {
        mnue();
        printf("请输入(0/1):");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("三子棋游戏开始\n");
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        defout:
            printf("输入错误,请重新输入\n");
            break;
        }
    } while (input);
    return 0;
}

四,分文件实现游戏代码
技术分享图片
1.game.c源文件实现与game游戏主体有关的函数代码
初始化棋盘函数
技术分享图片
打印棋盘函数
技术分享图片
用来存储玩家下棋信息的函数
技术分享图片
电脑随机下棋的函数
技术分享图片
判断棋盘是否满了的函数
技术分享图片
判断输赢和游戏是否继续的函数
技术分享图片
2.game.h函数的头文件
函数的声明
#define定义的常量
其他所需要的头文件
技术分享图片
3.test.c函数
游戏的菜单函数
技术分享图片
玩游戏的框架函数
技术分享图片
主函数控制游戏的进程
技术分享图片
注意:如果函数细节srand函数,rand函数,time函数不明白的回到猜数字游戏的那一次博客中,有详细解说

三子棋小游戏(C语言数组实现)

原文:https://blog.51cto.com/15083388/2620470

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!