C语言控制台五子棋初步实现

写一个五子棋控制台程序,并能让用户轮流输入棋子位置。

棋盘上相应位置的棋子作出改变(成白子或者黑子)

判断胜利条件,当一方胜利时打印结果并结束程序。

其中 @ 代表黑子 0 代表白子 * 代表未走棋的棋盘

如图示意图: 

 

 

 

 

 

 

 

 以下是代码哦 

#include <stdio.h>
#include <windows.h>

void judgeHorizontal(int countTemp, int jTemp, int colorFlag, int chessBoard[14][14], int i) {
    while((++jTemp < 14 )&&( 5 != countTemp ))
    {
        if(colorFlag == chessBoard[i][jTemp])
        {
            countTemp++;
            if(5 == countTemp)
            {
                if(1 == colorFlag)
                {
                    printf("黑方胜利!\n");
                }
                else if(0 == colorFlag)
                {
                    printf("白方胜利!!\n");
                }
                system("pause");
                exit(0) ;
            }
        }
        else
        {
            countTemp = 0;
            break;
        }
    }
}

void judgeVertical(int countTemp, int iTemp, int colorFlag, int chessBoard[14][14], int j) {
    while((++iTemp<14 )&&(5 !=countTemp))
    {
        if(colorFlag == chessBoard[iTemp][j])
        {
            countTemp++;
            if(5 == countTemp)
            {
                if(1 == colorFlag)
                {
                    printf("黑方胜利!\n");
                }
                else if(0 == colorFlag)
                {
                    printf("白方胜利!\n");
                }
                system("pause");
                exit(0) ;
            }
        }
        else
        {
            countTemp= 0;
            break;
        }
    }
}

void judgeLeanRight(int countTemp, int iTemp, int jTemp, int colorFlag, int chessBoard[14][14]) {
    while((++iTemp<14 )&&(++jTemp<14 )&&(5 !=countTemp))
    {
        if(colorFlag == chessBoard[iTemp][jTemp])
        {
            countTemp++;
            if(5 == countTemp)
            {
                if(1 == colorFlag)
                {
                    printf("黑方胜利!\n");
                }
                else if(0 == colorFlag)
                {
                    printf("白方胜利!\n");
                }
                system("pause");
                exit(0);
            }
        }
        else
        {
            countTemp = 0;
            break;
        }
    }
}

void judgeLeanLeft(int countTemp, int iTemp, int jTemp, int colorFlag, int chessBoard[14][14]) {
    while((++iTemp>=0 )&&(--jTemp>=0)&&(5 !=countTemp))
    {
        if(colorFlag == chessBoard[iTemp][jTemp])
        {
            countTemp++;
            if(5 == countTemp)
            {
                if(1 == colorFlag)
                {
                    printf("黑方胜利!\n");
                }
                else if(0 == colorFlag)
                {
                    printf("白方胜利!\n");
                }
                system("pause");
                exit(0);
            }
        }
        else
        {
            countTemp = 0;
            break;
        }
    }            
}

int main(void)
{
    int i, j;
    int chessBoard[14][14];
    int color=0;//0表示黑棋@,1表示白棋0
    int iTemp = 0,jTemp = 0,countTemp = 0;
    int colorFlag = 0;
    char op;


    printf("五子棋小游戏\n\n");
    printf("@代表黑子, 0代表白子, *代表棋盘空白\n");
    printf("-------------------------------------------\n");

    printf("     0  1  2  3  4  5  6  7  8  9  10 11 12 13\n");
    for(i=0;i<14;i++) {
        for(j=0;j<14;j++) {
            if (j == 0 && i < 10) {
                printf("  %d  ", i);
            } else if (j == 0){
                printf(" %d  ", i);
            }
            printf("*  ");
            chessBoard[i][j] = 2;
        }
        printf("\n");
    }

    while(1) {
        if (color == 0) {
            printf("请黑方走棋:");
        } else if (color == 1) {
            printf("请白方走棋:");
        }
        
        printf("请输入所下位置坐标,如1-2\n");
        scanf("%d-%d", &i,&j);

        if(i<0 || i >12 || j<0 || j>12)
        {
            printf("输入的位置超出了棋盘的范围,请重新输入!\n");
            continue;
        }

        if((2 != chessBoard[i][j]))
        {
            printf("提示:该位置已经有棋子了!\n");
            fflush(stdin);
            continue;
        }

        color = (color + 1) % 2;//获取棋盘棋子属性
        chessBoard[i][j] = color;//将该位置棋子属性给棋盘
        printf("     0  1  2  3  4  5  6  7  8  9  10 11 12 13\n");
        //根据棋盘对应位置属性,绘制最新状态的棋盘,一行行绘制,边缘特别处理
        for(i=0;i<=13;i++) {        
            for(j=0;j<=13;j++) {
                if (j == 0 && i < 10) {
                    printf("  %d ", i);
                } else if (j == 0){
                    printf(" %d ", i);
                }
                if(chessBoard[i][j]==1)
                    printf(" @ ");
                if(chessBoard[i][j]==0)
                    printf(" 0 ");
                if(chessBoard[i][j]==2)
                    printf(" * ");
            }
            printf("\n");        
        }

        //判断输赢
        for(i=0;i<=13;i++) {        
            for(j=0;j<=13;j++) {
                //如果检测到该有棋子,则检查与该棋子有关的是否可以赢
                if(2 != chessBoard[i][j] )
                {
                    colorFlag = chessBoard[i][j];
                    countTemp = 1;
                    iTemp = i;
                    jTemp = j;

                    //判断该棋子水平直线上是否可以赢
                    judgeHorizontal(countTemp, jTemp, colorFlag, chessBoard, i);
                    
                    //判断该棋子垂直直线上是否可以赢
                    judgeVertical(countTemp, iTemp, colorFlag, chessBoard, j);

                    //斜向,从左上到右下方向检查是否可以赢
                    judgeLeanRight(countTemp, iTemp, jTemp, colorFlag, chessBoard);

                    //斜向,从右上到左下方向检查是否可以赢
                    judgeLeanLeft(countTemp, iTemp, jTemp, colorFlag, chessBoard);
                    
                }
            }
        }
    }

    system("pause");
    return 0;
}

 

posted @ 2022-01-08 16:31  茗智溪  阅读(197)  评论(0)    收藏  举报
/* 看板娘 */