C——五子棋小游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cl_Daisy/article/details/78129775

这个是五子棋,可以直接运行的,但是这个只是单机的,而且你得自己算出行和列….

#include <stdio.h>


//定义一个宏,表示棋盘大小
#define SIZE 20
//表示黑色的棋子
#define BLACK "●"
//表示白色的棋子
#define WHITE "○" 


//定义一个全局的二维数组,用于表示棋盘 

char* board[SIZE][SIZE];

// 定义一个枚举类型,表示玩家
typedef enum{
    PlayerOne,
    PlayerTwo
}Player; 

//定义一个枚举类型,表示输入正确与否 
typedef enum{
    false,
    true
}BOOL; 

//函数,用于初始化棋盘 
void initBoard()
{   
    int i;
    for(i=0;i<SIZE;i++)  //i表示行的下标 
    {   
        int j;
        for(j=0;j<SIZE;j++)   //j表示列的下标 
        {
            if(i==0 && j==0)   //左上角
            {
                board[i][j]="┏";
             } 
             else if(i==0 && j==SIZE-1)  //右上角 
             {
                board[i][j]="┓";
             }
             else if(i==SIZE-1 && j==0)//左下角 
             {
                board[i][j]="┗";
             }
             else if(i==SIZE-1 && j==SIZE-1)//右下角 
             {
                board[i][j]="┛";
             }
             else if(i==0)//第一行
             {
                board[i][j]="┳";
             }

             else if(i==SIZE-1)//最后一列行 
             {
                board[i][j]="┻";
              } 
              else if(j==0)//第一列
             {
                board[i][j]="┣";
              } 
              else if(j==SIZE-1)//最后一列 
             {
                board[i][j]="┫";
              } 
              else//其它 
              {
                board[i][j]="╋";
              }
        }
    } 
}



//函数,打印棋盘
void printboard()
{
    int i,j;
    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            printf("%s",board[i][j]);
        }
        printf("\n");
    }

} 

//函数,判断下棋的坐标正确与否
BOOL PlayCorrect(int rightNum,int x,int y)
{
    //如果输入数据类型不对
    if(rightNum!=2)
        return false;
    //越界
    if(x>SIZE || x<0 || y>=SIZE || y<0) 
        return false;
    //重复
    if(strcmp(board[x][y],BLACK)==0 || strcmp(board[x][y],WHITE)==0 ) 
        return false;

    return true;
} 



//获胜函数1-横线函数
BOOL horizationWin(int x)
{
    //遍历当前行,看此行中有没有5个连续的黑子或白子
    int i;   //i表示列的下标
    for(i=0;i<=SIZE-5;i++)
    {
        //查看i和后面4个连续的棋子是不是都是黑或者白
        int blackNum = 0; //表示连续的黑子的个数 
        int whiteNum = 0; //表示连续的白子的个数
        int j; //表示与i子间隔的距离
        for(j=0;j<5;j++) 
        { 
            blackNum += strcmp ( board[x][i+j],BLACK )==0 ? 1 : 0 ;
            whiteNum += strcmp ( board[x][i+j],WHITE )==0 ? 1 : 0 ; 
        }
        if( blackNum == 5 || whiteNum == 5)
        {
            return true;
        }
     } 
     return false;
} 

//获胜函数2-竖线函数
BOOL verticalWin(int y)
{
    //查看i和后面4个连续的棋子是不是都是黑或者白
            int i;   //i表示列的下标
    for(i=0;i<=SIZE-5;i++)
    {
        int blackNum = 0; //表示连续的黑子的个数 
        int whiteNum = 0; //表示连续的白子的个数
        int j; //表示与i子间隔的距离
        for(j=0;j<5;j++) 
        {
            blackNum += strcmp ( board[i+j][y],BLACK )==0 ? 1 : 0 ;
            whiteNum += strcmp ( board[i+j][y],WHITE )==0 ? 1 : 0 ; 
        }
            if( blackNum == 5 || whiteNum == 5)
        {
            return true;
        }
     } 
    return false;
}
//获胜函数3-反斜线函数
BOOL reverseDiagonalWin()
{
    int i; //表示行的下标 
    for(i=0;i<=SIZE-5;i++)
    {
        int j; //表示列的下标 
        for(j=0;j<=SIZE-5;j++)
        {
            int numWhite = 0; //表示5个棋子中白子的个数
            int numBlack = 0; //表示5个棋子中黑子的个数
            int k; //表示与上一个棋子的坐标的距离
            for(k=0;k<5;k++)
            {
                numBlack += strcmp ( board[i+k][j+k],BLACK )==0 ? 1 : 0 ;
                numWhite += strcmp ( board[i+k][j+k],WHITE )==0 ? 1 : 0 ; 
             } 
             if( numBlack == 5 || numWhite == 5)
             {
                return true;
             }
        }
    }
    return false;
} 
//获胜函数4-正斜线函数
BOOL diagonalWin()
{
    int i;//表示行的下标
    for(i=0;i<SIZE-5;i++)
    {
        int j;
        for(j=4;j<=SIZE;j++)
        {
            int k;
            int numWhite = 0; //表示5个棋子中白子的个数
            int numBlack = 0; //表示5个棋子中黑子的个数
        for(k=0;k<5;k++) //表示与上一个棋子的坐标的距离
        {
            numBlack += strcmp (board[i+k][j-k],BLACK) == 0 ? 1 : 0 ;
            numWhite += strcmp (board[i+k][j-k],WHITE) == 0 ? 1 : 0 ;
        }
        if( numBlack == 5 || numWhite == 5)
        {
            return true;
        }
        }
    }
    return false;
} 



//函数,判断下棋获胜的函数
BOOL win(int x,int y)
{
    if( horizationWin(x) || verticalWin(y) || reverseDiagonalWin() || diagonalWin() )
        return true;
    return false;
 } 



//开始下棋 
BOOL play(Player* p)
{
    int x,y;//表示下棋的坐标
    //定义变量,表示输入正确与否
    BOOL intputright;
    do{
        char *name = (*p==PlayerOne) ? "玩家1" :"玩家2";
        printf("请%s输入旗子下标,样式:(5,6): ",name);
        int flag = scanf("%d,%d",&x,&y);
        //判断输入正确与否,赋值给变量inputRight
        intputright = PlayCorrect(flag,x,y);
        //提示用户
        if(!intputright)
        {
            printf("输入的下标有误,请重新输入!\n");
            //清空缓存
            fflush(stdin); 
        } 
    }while(!intputright); 

    if(*p == PlayerOne)
    {
        board[x][y] =BLACK;
    } 
    else
    {
        board[x][y] =WHITE;              
    }
    printboard();

    //判断游戏是否结束(即判断有没有玩家获胜) 
    if( win(x,y) )    //如果获胜了,return一个值
    {
        return  true;
    } 
     else
     {
        //切换玩家
        *p = *p==PlayerOne ? PlayerTwo : PlayerOne; 
        //没有获胜,返回另一个值
        return  false; 
     }
}


int main()
{
     initBoard();
     printboard(); 
     Player gamer = PlayerOne;

     //定义一个表示游戏结束的变量
     BOOL gameOver;

     do{
        gameOver =  play(&gamer);
     }while(!gameOver);

     printf("%s获胜!\n",gamer==PlayerOne?"玩家1":"玩家2"); 

     printf("游戏结束!\n");  
    return 0;
} 

五子棋

猜你喜欢

转载自blog.csdn.net/Cl_Daisy/article/details/78129775