C语言---实现三子棋(超详解版本)

简介: C语言---实现三子棋(超详解版本)
🚀write in front🚀
📝个人主页: 认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏: 鹏哥带我学c带我飞
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️不如沉默去做,看结局怎么去说 ♐
在这里插入图片描述

@TOC

一、🌸问题描述

用c语言实现三子棋游戏
在这里插入图片描述

二、🌷基本流程

1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'Q’表示和棋。
6.电脑落子(随机位置落子) ,'#’表示电脑落子。
7.判定胜负关系

三、🌺具体步骤

1.🎐创建test.c, game.h 源文件和game.h头文件

这样做的目的是为了让我的实现更加简单和简介,思路更加清晰,方便初学者学习。

2.🎐写出主函数和创建菜单

void menu()
{
    printf("***********************\n");
    printf("******* 1. play *******\n");
    printf("******* 0. eixt *******\n");
    printf("***********************\n");
}
void test()
{
    menu();
}
int main()
{
    test();
    return 0;
}

3.🎐搭建游戏逻辑

这里显然就是打印完菜单要开始游戏,所以我应该搭建出来我的游戏逻辑。

void test()
{
    int input;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
            case 1: game();
                break;
            case 0: printf("退出游戏"); 
                break;
            default: printf("选择错误:>");
                break;
        }
    }while(input);
}

输入1我要继续游戏,输入0我就退出我的游戏,其他的就是不符合所以从新输入。
下一步那就是要实现game函数内容来丰富我的游戏。

4.🎐game函数的初步实现

**game函数需要先实现什么呢?
当然是我们的棋盘需要被初始化啦,然后就是打印我的棋盘对吧?**

void game()
{
    char board[ROW][COL];
    //初始化我的棋盘 
    init_board(board,ROW,COL);
    //打印我的棋盘
    print_board(board,ROW,COL);
}

1.初始化我的棋盘:

void init_board(char borad[ROW][COL],int row,int col)
{
    for(int i=0;i<row;i++)
    {
        int j=0;
        for(j=0;j<col;j++)
        {
            borad[i][j] = ' ';
        }
    }
}

2.打印我的棋盘:

简陋版本:

void print_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        if(i<row-1)
            printf("---|---|---\n");
    }
}

美化版本:
美化版本好处就是更加便于我对于代码的操作和改动。

void print_board(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");
        }
    }
}

5.🎐game函数的进一步实现玩家下棋

void game()
{
    char board[ROW][COL];
    //初始化我的棋盘 
    init_board(board,ROW,COL);
    //打印我的棋盘
    print_board(board,ROW,COL);
    while(1)
    {
        player_move(board,ROW,COL);//我下完棋之后就要再次打印我的棋盘然后反复操作
        print_board(board,ROW,COL);
    }    
}

player_move的实现:

void player_move(char board[ROW][COL],int row,int col)
{
    printf("玩家下棋\n");
    while(1)
    {
        printf("请输入要下棋得坐标:>");
        int x,y;
        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");
            }
        }
        else
        {
            printf("坐标非法\n");
        }
    }
}

在这里插入图片描述
所以就是对于我的x,y,坐标,看输入是否合法,不合法就需要我去重新输入,然后还需要思考是否我选择的坐标被占用了,如果没有就下去这个子然后跳出,否则继续!!!

6.🎐game函数的再进一步实现电脑下棋

void game()
{
    //存放玩家或者电脑的落子情况
    char board[ROW][COL];
    char ret = 0;
    //初始化一下棋盘为全空格
    init_board(board, ROW, COL);
    print_board(board, ROW, COL);

    while (1)
    {
        player_move(board, ROW, COL);
        print_board(board, ROW, COL);
        
        computer_move(board, ROW, COL);
        print_board(board, ROW, COL);
    }
}

computer_move函数的实现代码:
这里用到了一个rand函数是生成随机数的一个函数,大家可以去msdn查找学习。

void computer_move(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:\n");
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;

        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

7.🎐对于三子棋游戏规则的思考

其实思考内容就是我出现结局的情况,这里有几种方案:

判断输赢
判断输赢的代码要告诉我:电脑赢了?玩家赢了?玩家赢?游戏继续?
电脑赢:#
玩家赢:*
平局:Q
游戏继续:C

思考了这些其实就可以继续去完善我们的代码了。

8.🎐对于三子棋游戏的最终实现

void game()
{
    //存放玩家或者电脑的落子情况
    char board[ROW][COL];
    char ret = 0;
    //初始化一下棋盘为全空格
    init_board(board, ROW, COL);
    print_board(board, ROW, COL);

    while (1)
    {
        player_move(board, ROW, COL);
        print_board(board, ROW, COL);
        //判断输赢
        ret = is_win(board,ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        computer_move(board, ROW, COL);
        print_board(board, ROW, COL);
        //判断输赢
        ret = is_win(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
    }
    if (ret == '#')
        printf("电脑赢了\n");
    else if (ret == '*')
        printf("玩家赢了\n");
    else if (ret == 'Q')
        printf("平局\n");
}

is_full以及我的is_win函数的实现

//我希望is_full这个函数只是为了支持is_win函数的,只是在is_win函数内部使用
//那我们就没必要在头文件中声明
// 
//判断棋盘是否满了
static int is_full(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] == ' ')
                return 0;
        }
    }
    return 1;
}

char is_win(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][0]!=' ')
        {
            return board[i][0];
        }
    }
    //判断三列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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 (is_full(board, row, col) == 1)
    {
        return 'Q';
    }

    //继续
    //没有玩家或者电脑赢,也没有平局,游戏继续
    return 'C';
}

四、🌻玩法演示

玩家赢:
在这里插入图片描述
电脑赢:
在这里插入图片描述

五、🍀源代码

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void menu()
{
    printf("***********************\n");
    printf("******* 1. play *******\n");
    printf("******* 0. eixt *******\n");
    printf("***********************\n");
}

void init_board(char borad[ROW][COL],int row,int col)
{
    for(int i=0;i<row;i++)
    {
        int j=0;
        for(j=0;j<col;j++)
        {
            borad[i][j] = ' ';
        }
    }
}


void print_board(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");
        }
    }
}
void player_move(char board[ROW][COL],int row,int col)
{
    printf("玩家下棋\n");
    while(1)
    {
        printf("请输入要下棋得坐标:>");
        int x,y;
        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");
            }
        }
        else
        {
            printf("坐标非法\n");
        }
    }
}

void computer_move(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:\n");
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;

        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

int is_full(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] == ' ')
                return 0;
        }
    }
    return 1;
}

char is_win(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][0]!=' ')
            return board[i][0];
    }
    //判断三列
    for(i=0;i<col;i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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 (is_full(board, row, col) == 1)
    {
        return 'Q';
    }
    
    //继续
    //没有玩家或者电脑赢,也没有平局,游戏继续
    return 'C';
}

void game()
{
    char board[ROW][COL];
    char ret=0;
    //初始化我的棋盘 
    init_board(board,ROW,COL);
    //打印我的棋盘
    print_board(board,ROW,COL);
    
    while(1)
    {
        player_move(board,ROW,COL);
        print_board(board,ROW,COL);
        ret=is_win(board,ROW,COL);
        if(ret!='C')
        {
            break;
        }
        computer_move(board,ROW,COL);
        print_board(board,ROW,COL);
        ret=is_win(board,ROW,COL);
        if(ret!='C')
        {
            break;
        }
    }
    if(ret=='#')
         printf("电脑赢了\n");
    else if(ret=='*')
        printf("玩家赢了\n");
    else if(ret=='Q')
        printf("平局\n");
}
//判断输赢
//判断输赢的代码要告诉我:电脑赢了?玩家赢了?玩家赢?游戏继续?
//电脑赢:#
//玩家赢:*
//平局:Q
//游戏继续:C
void test()
{
    int input;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
            case 1: game();
                break;
            case 0: printf("退出游戏"); 
                break;
            default: printf("选择错误:>");
                break;
        }
    }while(input);
}
int main()
{
    test();
    return 0;
}

🦋总结

三子棋游戏:

1.三子棋实现,先去想逻辑和游戏规则,然后搭建这些逻辑框架,最后写出代码去实现它,逐步思考和代码推进。
2.多去想怎么可以优化我的代码,这样才会使得自己进步。

个人对于近期学习感想:

1.学习一定要稳重,不能图快而使得自己学的不够精,最后基础不牢,又从头开始学习。
2.认准一个老师,就踏踏实实跟着学就行,多去做老师反复强调你需要做的,少说便会得到答案
3.坚持不断地学习和规律的作息其实这样的学习效果真的非常好,希望你我都不是三分热度,坚持自己的学习计划,慢慢去做吧,加油!

相关文章
|
3月前
|
前端开发 C语言
C语言04---第一个HelloWorld(vc版本)
C语言04---第一个HelloWorld(vc版本)
|
4月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
26 1
|
5月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
54 1
|
5月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
56 1
|
4月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
5月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
45 0
【C语言入门小游戏】三子棋
|
4月前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)
|
5月前
|
人工智能 算法 数据可视化
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
|
5月前
|
存储 C语言
C语言实现三子棋
C语言实现三子棋
32 0
|
5月前
|
C语言
C语言实现三子棋
C语言实现三子棋
31 0