2021-03-17——C语言实现三子棋

C语言实现三子棋

 以下部分引用他人总结@小一!原文链接:https://blog.csdn.net/qq_49613557/article/details/113172981

目录
一、三子棋游戏介绍
二、c语言实现三子棋
三、演示游戏流程
四、完整c代码

一、三子棋游戏介绍:
三子棋是一种民间传统游戏,又叫九宫棋、井字棋、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

先手:正中间,对面如果走边中间位置,就落子在紧贴对方棋子的角位置。对方必定堵你,然后你就落子在刚才自己角位置棋子的旁边(边中间位置),必赢。
如果对方也会玩,就会先落子在角位置,基本最后就是和棋。
后手:对方中间,你就角位置,然后堵对方就行。只要对方不傻,就是和棋。
例、

二、C语言实现三子棋:
(1)、创建文件
      我们平时写代码时,如果程序比较大,所有模块都在同一个文件中会比较乱,而且不易维护,在这里我们将整个程序文件分开成三个文件,1是“ game.h”文件,用来存放头文件、宏定义及函数声明。2是“game.c”文件,用来存放各个函数的定义。3是”三子棋.c"文件,用来存放main()和菜单。

以下是自己的代码~

声明部分:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row  3   //此处任意值
#define col  3   //此处任意值

1、菜单函数menu()

void menu()
{
    printf("******************************\n");
    printf("******1. play  0. exit********\n");
    printf("******************************\n");
}

输入“1”表示继续玩;

输入“0”表示结束;

输入其他表示输入错误,请重新再输。

2、初始化棋盘(数组)

void InitBoard(char board[row][col])
{
    int i,j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}

3、输出棋盘(数组)

void DisplayBoard(char board[row][col])
{
    /*
         |   |
     --- |---|--- */
    int i = 0;
    for (i = 0; i < row; i++)
    {
        //1.打印一行数据
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col -1)
                printf("|");
        }
        printf("\n");
        //2.打印分隔行
        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 x = 0,y = 0;
    printf ("玩家走:>\n");
    while (1)
    {
        printf ("请输入要下的坐标:>");
        scanf ("%d%d", &x, &y);
        //判断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");
       }
    }
    
}

5、电脑输入函数:

void ComputerMove (char board[row][col])
{
    int x = 0;
    int y = 0;
    printf ("电脑走:>\n");
    while (1)
    {
        /* code */
        x = rand() % row;
        y = rand() % col;
        if (board[x][y] == ' ')
        {
           board[x][y] = '#';
        }
    }
    
}

6、判断胜负函数

char IsWin (char board[row][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][1]!=' ')
        {
            return board[i][1];
        }
    }
    //列三行
    for (i = 0; i < col; i++)
    {
        if (board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i]!=' ')
        {
            return board[1][i];
        }
    }
    //两个对角线
    if (board[0][0]==board[1][i] && board[1][1]==board[2][2] && board[1][1]!=' ')
        return board[1][1];
    if (board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1]!=' ')
        return board[1][1];
    //判断是否平局
    if (1 == IsFull(board))
    {
        return 'Q';
    }
}

7、判断是否平局

int IsFull (char board[row][col])
{
    int i,j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
                return 'Q';
        }
    }
}

8、游戏

void game ()
{
    char ret;
    //数组——存放走出的棋盘信息
    char board[3][3] = {0};//全部空格
    //初始化棋盘
    InitBoard(board);
    //打印棋盘
    DisplayBoard(board);

    while (1)
    {
        //玩家下棋
        PlayerMove (board);
        DisplayBoard (board);
        //判断玩家是否赢
        ret = IsWin (board);
        if (ret !='c')
        {
            break;
        }
        //电脑下棋
        ComputerMove (board);
        DisplayBoard (board);
        //判断电脑是否赢
        ret = IsWin (board);
        if (ret !='c')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("玩家赢\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢\n");
    }
}

9、测试函数

void test ()
{
    int input = 0;
   // srand((unsigned int));
    do
    {
        menu();
        printf ("请输入数字:");
        scanf("%d", &input);
        switch (input)
        {
            case 1:
                printf("C语言实现三子棋\n");
                game();
                break;
            case 0:
                printf("关闭\n");
                break;
            default:
                printf("请重新输入\n");
                break;
        }
    }while (input);
}

10、主函数

int main()
{
    test ();
    return 0;
}


————————————————————————————————————————————————————————————

错误点:每次下一个棋子都得重新开局。

明天改正写错的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值