C语言实现三子棋!!!

文章介绍了如何使用C语言实现一个简单的三子棋游戏。游戏棋盘由二维数组表示,初始化为空格。玩家和电脑轮流在3*3的棋盘上下棋,当行、列或对角线出现三个连续相同棋子时,游戏结束。代码包括棋盘初始化、打印、玩家与电脑的移动以及判断输赢的函数。最后,文章提供了游戏的主函数流程和头文件内容。

规则

  • 玩家和电脑在3*3的九宫格里面下棋

  • 当行或列或对角线有三个连续相同的棋子、或者棋盘满的时候,游戏结束


游戏实现

棋盘

棋盘的实现的实现是一个二维数组,这个跟扫雷那里不一样,我们只需要限定玩家和电脑只能在9*9的格子里下棋就可以了。

看一下效果:

初始化棋盘

初始化其实很简单,因为我们棋盘实际上是一个二维数组,给它赋值,如上图所示,需要下棋的位置最开始我们赋值成空格,方便棋盘的展示。

代码如下

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

打印棋盘

棋盘的打印,我们需要加上一些分割符,将棋盘展现出来,方便下棋。

  • 看左边的棋盘,它有数字标识行和列,中间格与格中间有 | 、---分割。

  • 二维数组元素中的空格刚好在中间,如右图所示,棋子的两边是空格,后边是分隔符。

  • 这一行是这样打印的,然后下一行,打印的是 ---|。

  • 同时,在打印棋盘前先加上列标,打印每一行之前,先加上行标。

代码如下

void BoradDisplay(char board[ROW][COL], int row, int col)
{
    for (int i = 0; i <= col;i++)//打印行标
    {
        if (i == 0)
            printf("  ");//开头空出两个空格
        else
        {
            printf("%d   ", i);//打印一个数字然后是两个空格

        }
    }
    printf("\n");//记得换行
    for (int i = 0; i < row; i++)
    {
        printf("%d", i + 1);//打印每一行之前,打印行标
        for (int j = 0; j < col;j++)
        {
            printf(" %c ", board[i][j]);//数组中的元素
            if (j < col - 1)//小于col-1的意思是每行只用打印两次,最后一个格子后边不用打印了
                printf("|");//打印分隔符
        }
        printf("\n");//换行
        for (int j = 0; j < col; j++)
        {
            if (i < row - 1)
            {
                if (j==0)
                {
                    printf(" ---");//空格加上三个-
                            //原因是,上一行的格子那里是, 空格棋子空格分隔符,是四个字符
                            //别忘了前面还有一个行标让整体后移了一个字符,这个空格的作用就是为了
                            //保证分隔符和上一行的对齐
                }
                else
                {
                    printf("---");//正常打印分隔符
                }
                if (j < col - 1)//正常打印分隔符
                    printf("|");
            }
        }
        printf("\n");//棋盘打印后打一个换行
    }
}

棋盘的打印工作只是为了方便展示,这些空格啊,分隔符啊,慢慢研究一下,对齐即可,可以看一下代码中的注释,方便理解。


下棋

玩家下棋

玩家输入一个坐标,在该位置落子

注意:

  • 保证输入的坐标只能在九个格子内部

  • 已落子的格子不能重复下棋

代码如下

void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    while (1)
    {
        printf("玩家下棋\n");
        printf("请输入坐标:>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//坐标合法
        {
            if (board[x - 1][y - 1] == ' ')//该位置没有棋子
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else//该位置已经有棋子了
            {
                printf("该位置已落子,请重新输入坐标!!\n");
            }
        }
        else//坐标不合法
        {
            printf("坐标输入错误,请重新输入!!\n");
        }
    }
}

注意,玩家看到的是行列都是1到3,但实际上数组的下标是从0开始,所以落子的时候,我们要对玩家输入坐标的行和列减去1,才能找到正确的位置。


电脑下棋

电脑的下棋很简单,只需要生成一个合理的坐标即可。

代码如下

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x = 0; 
    int y = 0;
    //产生合法坐标
    printf("电脑下棋\n");
    while (1)
    {
        x = rand() % 3;//产生0~2的数字
        y = rand() % 3;//产生0~2的数字
        if (board[x][y] == ' ')//该位置没有棋子
        {
            board[x][y] = '#';
            break;//下完之后,退出循环
        }
    }
}

判断输赢

判断输赢后,有四种状态,对于不同状态我们给出不同的返回值

  • 玩家赢------------------‘*’

  • 电脑赢------------------‘#’

  • 平局 ------------------‘Q’

  • 继续游戏----------------‘C’

  1. 输赢的判断

根据三子棋的规则,我们只需要判断三行、三列和两条对角线上是否有三个连续相同的棋子(不能是三个连续的空格哦)即可

  1. 平局的判断

我们只需要判断棋盘是否已经满了

  1. 继续游戏的判断

排除上面三种情况,就是继续游戏

代码如下

三子棋的棋盘比较小,所以我们直接依次判断就好了。

char  IsWin(char board[ROW][COL], int row, int col) 
{
    
    int i = 0;
    int j = 0;
    //判断三行
    for (i = 0; i < col; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][2]!=' ')
            return board[i][0];
    }
    //判断三列
    for (j = 0; j < row; j++)
    {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j]&&board[2][j]!=' ')
            return board[0][j];
    }
    //判断对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[2][2]!=' ')
        return board[0][0];
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&&board[2][0]!=' ')
        return board[0][2];
    //判断是否平局
    if (IsFull(board, row, col))
        return 'Q';//平局
    else
        return 'C';//继续
}


以上就是三子棋相关函数的代码,接下来看一下头文件和主函数内部的内容吧

总结

头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void BoardInit(char board[ROW][COL], int row, int col);
void BoradDisplay(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);

主函数


#include"game.h"
void menu()
{
    printf("*************************\n");
    printf("*********  1.play  ******\n");
    printf("*********  0.exit  ******\n");
    printf("*************************\n");
}
void game()
{
    char board[ROW][COL];//棋盘
    BoardInit(board, ROW, COL);//初始化棋盘
    BoradDisplay(board, ROW, COL);//打印棋盘
    char temp;
        while (1)
        {
            PlayerMove(board, ROW, COL);//玩家下棋
            temp=IsWin(board, ROW, COL);//判断输赢
            if (temp != 'C')
                break;
            system("cls");//玩家下完棋后把之前打印的棋盘清理掉
            BoradDisplay(board, ROW, COL);//打印棋盘
            ComputerMove(board, ROW, COL);//电脑下棋
            temp = IsWin(board, ROW, COL);//判断输赢
            if (temp != 'C')
                break;
            BoradDisplay(board, ROW, COL);//打印棋盘
        }
        BoradDisplay(board, ROW, COL);//打印棋盘
        if (temp == '*')
            printf("玩家赢\n");
        else if (temp == '#')
            printf("电脑赢\n");
        else
            printf("平局\n");
}
int main()
{
    int input=0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("\n退出游戏\n");
            break;
        default:
            printf("选择错误,请重新输入选项\n");
            break;
        }
    } while (input);

    return 0;
}

以上就是这个三子棋小游戏的全部实现了,整体来讲是比较简单的,但代码还是要自己敲一敲才能更好理解其中的逻辑、熟悉知识点的。

需要源文件的家人们,可以关注一下博主的Gitee仓库,自取哦~~

仓库链接:(点一下就找到了哦~)

game1_三子棋_1_14/game1_三子棋_1_14 · 琦琦爱敲代码/C语言练习 - 码云 - 开源中国 (gitee.com)

我们下一期再见~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值