C语言,关于三子棋的简单实现。

文章介绍了如何使用C语言编写一个简单的三子棋游戏程序。程序包括打印棋盘、用户和电脑交替下棋、显示棋盘状态以及判断游戏结果(胜利或平局)。游戏逻辑中,通过二维数组表示棋盘,并利用函数处理用户输入和电脑随机走棋。
摘要由CSDN通过智能技术生成

 三子棋是两人在九个格子里分别摆放属于自己的棋子,只要三个自己的棋子连成一线,即可获胜。根据三子棋的条件,要使用C语言实现可以分为这几步,1.打印棋盘,2.双方下棋,3.打印所下棋子,4.判断谁赢或者平局(如果都不成立则双方又继续下棋至到一方胜出或者双方平局)

1.打印棋盘                                                                                                                                              首先先打印游戏开始菜单,使用do-while让用户可以选择开始游戏和离开游戏。                                                    

 当输入1时,进入游戏,输入0时打印退出游戏,并跳出循环,且input为0跳到return 0,输入其他数字时,打印提示信息,因为input非0,所以继续进入循环,重新输入信息。

  因为三子棋是在九宫格里下棋,所以可以采用二维数组来存储棋子,对于棋盘可以这样子设计

 其中%c就是二维数组里的字符,一开始先对二维数组进行初始化,将每一个数据都打印成空格然后再打印出棋盘和棋子。其中ROW和COL代表行和列都为3

 打印结果:

2.双方下棋

  首先用户下棋,接着电脑下棋,下棋就是对二维数组录入数据,再将棋子打印在棋盘上。

用户下棋 

电脑下棋 

 3.打印双方所下棋子

  使用一开始打印棋盘和棋子的函数,来打印棋子。

每下完一步后就直接打印。

4.判断输赢或者平局

  判断游戏获胜的条件是三行或者三列,或者对角线上三个字符相等即获胜。 平局的判断,若棋盘下满,即是平局。

棋盘是否下满的判断

全部代码:

main.c:

#include<stdio.h>
#include"game.h"
void meau();
void game()
{
    char get = 0;
    char arr[ROW][COL] = { 0 };
    BoardInit(arr, ROW, COL);
    BoardDisplay(arr,ROW,COL);
    while (1)
    {
        Playermove(arr, ROW, COL);
        BoardDisplay(arr, ROW, COL);
        get=Iswin(arr, ROW, COL);
        if (get != 'C')
        {
            break;
        }
        Computermove(arr, ROW, COL);
        BoardDisplay(arr, ROW, COL);
        get=Iswin(arr, ROW, COL);
        if (get != 'C')
        {
            break;
        }
    }
    if (get == '*')
    {
        printf("玩家胜利!\n");
    }
    else if (get == '#')
    {
        printf("电脑胜利!\n");
    }
    else 
    {
        printf("和局\n");
    }
}
int main()
{
    srand((unsigned int) time(NULL));
    int input = 0;
    do
    {
        meau();
        scanf_s("%d", &input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入错误,请重新输入!\n");
                break;
        }
    } while (input);
    return 0;
}
void meau()
{
    printf("********三子棋*********\n");
    printf("****1.play    0.exit***\n");
    printf("***********************\n");
}

game.h:

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void BoardInit(char arr[ROW][COL], int row, int col);
void BoardDisplay(char arr[ROW][COL], int row, int col);
void Playermove(char arr[ROW][COL], int row, int col);
void Computermove(char arr[ROW][COL], int row, int col);
char Iswin(char arr[ROW][COL], int row, int col);

game.c

#include"game.h"
void BoardInit(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 BoardDisplay(char arr[ROW][COL], int row, int col)
{
    for (int i = 0; i < ROW; i++)
    {
        if (i < ROW - 1)
        {
            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 Playermove(char arr[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家走:>\n");
    while (1)
    {
        printf("请玩家输入坐标:>");
        scanf_s("%d %d", &x, &y);
        if (1 <= x && x <= ROW && 1 <= y && y <= COL)//判断坐标的合法性
        {
            if (arr[x-1][y-1] == ' ')//判断坐标是否被占用,x和y都减一是因为数组的下标是从0开始。
            {
                arr[x-1][y-1] = '*';
                break;
            }
            else
            {
                printf("该坐标被占用!\n");
            }
        }
        else
        {
            printf("坐标非法,请重新输入!\n");
        }
    }
}
//提醒信息 输入棋子 判断棋子是否合法 1.写入数组 0.提醒重新输入
void Computermove(char arr[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑走:>\n");
    while(1)
    {
        x = rand()%3;//调用rand函数,并对其取3的模,保证x和y的范围在0-2
        y = rand()%3;
        if (arr[ x ][ y ] == ' ')
        {
            arr[ x ][ y ] = '#';
            break;
        }
    }
}
//全满返回1 不满返回0
int Fullboard(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++)
        {
            if (arr[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}
//'*'代表玩家胜利,'#'代表电脑胜利,'$'平局,'C'继续
char Iswin(char arr[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    //先判断三行
    for (x = 0; x < ROW; x++)
    {
        if (arr[x][0] == arr[x][1] && arr[x][0] == arr[x][2] && arr[x][1] !=' ')
        {
            return arr[x][1];
        }
    }
    //三列
    for (y = 0; y < COL; y++)
    {
        if (arr[0][y] == arr[1][y] && arr[0][y] == arr[2][y] && arr[1][y] != ' ')
        {
            return arr[1][y];
        }
    }
    //交叉
    if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[1][1] != ' ')
    {
        return arr[1][1];
    }
    if (arr[2][0] == arr[1][1] && arr[0][2] == arr[2][0] && arr[1][1] !=  ' ')
    {
        return arr[1][1];
    }
    if (1 == Fullboard(arr, ROW, COL))
    {
        return '$';
    }
    return 'C';

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值