C语言实现三子棋思路详解(含项目链接)【保姆级】【适合0项目基础者】

本文是使用C语言实现三子棋过程中的的思路详解,阅读代码时结合本文可以对代码起到答疑的作用,加快理解。

项目链接三子棋项目链接

一、功能介绍

本三子棋项目实现了最基础的三子棋功能,详细功能如下:
1、可以改变棋盘的大小(通过宏定义改变)
2、可以连续进行游戏
3、人先下棋,电脑后下棋
4、电脑下棋无智能性,为随机下棋

二、整体流程

整体流程图如下,其中云朵气泡中为函数名称:
三子棋流程图

三、函数详解
1、PrintChessboard

棋盘打印函数,功能:在初始时打印空棋盘、在玩家和电脑每一步下棋后打印当前棋盘。
想要达成的棋盘格式如下:
棋盘格式
它是由符号‘_’和符号‘|’组成的。最后一列无‘|’,最后一行无‘_ _ _’。实现代码如下所示:

//打印棋盘格
void PrintChessboard(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++){
            printf(" %c ",board[i][j]);
            if(j!=col-1) printf("|");//最后一列不打印‘|’
        }
        printf("\n");
        if(i!=col-1){//最后一行不打印‘_ _ _’
        	for(j=0;j<col;j++){
        		printf("---");
            	if(j!=col-1) printf("|");//最后一列不打印‘|’
            	else printf("\n"); 
        	}	
		}
        
    }
    printf("\n");
}

同时,在每一局开始时都要对棋盘格中的内容进行初始化。将棋盘每一个格子中的内容都初始化为’ '。
InitChessboard函数如下:
初始化棋盘,功能,在每一局游戏结束后/开始前将期盼中每一个格子的元素都更改为空格。代码如下:

//初始化棋盘格
void InitChessboard(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++){
            board[i][j]=' ';//将每一行每一列的内容都更改为' '
        }
    }
}
2、PlayerPlay

人下棋函数,功能:在玩家输入的指定坐标处的内容更改为‘*’。
想要达成的下棋效果如下:

人下棋效果
实现代码如下:

//玩家下棋
void PlayerPlay(char board[ROW][COL],int row,int col){
    int i=0;
    int j=0;
    while(1){
        printf("请输入你要下的位置坐标(格式:x y):");
        scanf("%d %d",&i,&j);
        printf("\n");
        if(board[i-1][j-1]==' '){//数组中的横坐标为0~COL-1,纵坐标为0~ROW-1
            board[i-1][j-1]='*';//而人们常用的坐标为从1开始
            break;//即我们输入的坐标(1,1)与实际存储的坐标(0,0)相差1.此处-1
        }
        else printf("输入有误,请重新输入\n");//若此处已有棋子,输入有误
    } 
}
3、RobotPlay

电脑下棋函数,功能:实现电脑在棋盘中的随机下棋,棋子内容为‘#’。
想要得到的下棋效果如下:
电脑下棋效果
实现代码:

//电脑下棋
void RobotPlay(char board[ROW][COL],int row,int col){
    int i=0;
    int j=0;
    while(1){
        i=rand()%row;//电脑下棋的横坐标在0~ROW-1随机
        j=rand()%col;//电脑下棋的纵坐标在0~COL-1随机
        if(board[i][j]==' '){
            board[i][j]='#';
            break;
        }
    } 
}
4、IfWin

判断比赛结果,功能:比赛共可能有3种结果——人赢、电脑赢或平局,本函数对比赛的结果进行判断。
以下情况为人赢:
1、一行有三个’*’
一行
2、一列有三个‘*’
一列都是
3、斜线方向有三个‘*’
斜线方向方向

同理,以下情况为机器赢:
在这里插入图片描述

若棋盘下满却没有人赢,则为平局。
实现代码如下:

//判断棋盘是否满
int IsFull(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;
}
//判断是否赢
int IfWin(char board[ROW][COL],int row,int col){
    int i=0;
    int j=0;
    int ret=0;
    //一列有三个相同
    for(i=0;i<row;i++){
        for(j=0;j<col-2;j++){
            if(board[i][j]==board[i][j+1]&&board[i][j+1]==board[i][j+2]&&board[i][j+2]=='*'){
                ret=1;
                return ret;
            }
            else if(board[i][j]==board[i][j+1]&&board[i][j+1]==board[i][j+2]&&board[i][j+2]=='#'){
                ret=1;
                return ret;
            }
        }
    }
    //一行有三个相同
    for(i=0;i<row-2;i++){
        for(j=0;j<col;j++){
            if(board[i][j]==board[i+1][j]&&board[i+1][j]==board[i+2][j]&&board[i+2][j]=='*'){
                ret=1;
                return ret;
            }
            else if(board[i][j]==board[i+1][j]&&board[i+1][j]==board[i+2][j]&&board[i+2][j]=='#'){
                ret=2;
                return ret;
            }
        }
    }
    //右斜线方向有三个相同
    for(i=0;i<row-2;i++){
        for(j=0;j<col-2;j++){
            if(board[i][j]==board[i+1][j+1]&&board[i+1][j+1]==board[i+2][j+2]&&board[i+2][j+2]=='*'){
                ret=1;
                return ret;
            }
            else if(board[i][j]==board[i+1][j+1]&&board[i+1][j+1]==board[i+2][j+2]&&board[i+2][j+2]=='#'){
                ret=2;
                return ret;
            }
        }
    }
    //左斜线方向有三个相同
    for(i=2;i<row;i++){
        for(j=2;j<col;j++){
            if(board[i][j]==board[i-1][j-1]&&board[i-1][j-1]==board[i-2][j-2]&&board[i-2][j-2]=='*'){
                ret=1;
                return ret;
            }
            else if(board[i][j]==board[i-1][j-1]&&board[i-1][j-1]==board[i-2][j-2]&&board[i-2][j-2]=='#'){
                ret=2;
                return ret;
            }
        }
    }
    int full=0;
    //棋盘已满,仍无三个相连位置元素相同,则为平局
    full=IsFull(board,row,col);
    if(full==1){
        ret=3;
        return ret;
    }
    return ret;
} 
5、main函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

int main(){
    int begin=0;
    int ret=0;

    char board[ROW][COL]={0};
    int row=ROW;
    int col=COL;

    srand((unsigned int)time(NULL));
    do{
    	printf("------      ------\n");
        printf("Hello sanzi chess!\n");
        printf("------      ------\n");
        printf("\n");
        printf("@@@@@                          @@@@@\n");
        printf("           1.play 0.exit            \n");
        printf("@@@@@                          @@@@@\n");
        printf("\n");
        printf("开始游戏?>");
        scanf("%d",&begin);
        printf("\n");

        //判断是否开始游戏
        if(!begin) break;
        //初始化棋盘格
        InitChessboard(board,row,col);
        //打印棋盘格
        PrintChessboard(board,row,col);
        while(1){
            //人下棋
            PlayerPlay(board,row,col);
            //打印棋盘格
            PrintChessboard(board,row,col);
            //判断是否赢
            //int ret=0;//写在这不行?为什么
            ret=IfWin(board,row,col);
            if(ret==1){
                printf("本局游戏结束,您已获胜\n");
                printf("\n");
                break;
            }
            if(ret==3){
                printf("本局游戏结束,平局\n");
                printf("\n");
                break;
            }
            //电脑下棋
            RobotPlay(board,row,col);
            //打印棋盘格
            PrintChessboard(board,row,col);
            //判断是否赢
            ret=IfWin(board,row,col);
            if(ret==2){
                printf("本局游戏结束,电脑已获胜\n");
                printf("\n");
                break;
            }
            if(ret==3){
                printf("本局游戏结束,平局\n");
                printf("\n");
                break;
            }
        }

    }while(1);
    return 0;
}
四、实现效果

实现效果
本文为个人学习所总结,如有问题欢迎指正。
你的点赞收藏将给我很大的鼓励。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HePingxxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值