简单的 三子棋 程序

声明:我把每个步骤用main函数重新写一遍,方便读者进行验证,完整程序我会放在最后。


三子棋是一个大程序,需要用函数模块化,将问题拆分成小问题解决。

三子棋的组成
1.生成棋盘
2.玩家落子 保存棋盘
3.电脑落子 保存棋盘
4.胜,负,和棋,的判断

  1. 生成棋盘

我们需要打印一个这样的棋盘

   |   |
___|___|___
   |   |
___|___|___
   |   |
   |   |

但是,要保证棋盘能落子就必须在棋盘里加入二维数组,并用空格表示二维数组,后续落子时用落子替换空格。

所以我们仔细观察棋盘可以发现第一行是 空格+二位数组+空格+”|“ 这样循环3次,最后一次不用加“|”。

第二行是 “_"+"_"+"_"+"|" 这样循环3次,最后一次不用加”|“。

棋盘的基本逻辑就这样形成了。

#include<stdio.h>
#define ROW 3 //定义常量  行数 
#define COL 3 //定义常量  列数 

int main()
{
    int i,j;
    char board[ROW][COL];
    
    //初始化二维数组 
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            board[i][j]=' ';
        }
    }
    
    //打印棋盘
    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!=ROW-1)//最后一次的限制条件
        {
            for(j=0;j<COL;j++)
        {
            printf("___");
            if(j!=COL-1)//最后一次的限制条件
            {
                printf("|");
            }
        } 
        printf("\n");
        }
        else
        {
               for(j=0;j<COL;j++)
            {
                printf("   ");
                if(j!=COL-1)//最后一次的限制条件
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    } 
}

  1. 玩家落子

这个就比较简单了。

#include<stdio.h>
#define ROW 3 //定义常量  行数 
#define COL 3 //定义常量  列数 

void display_board(char board[ROW][COL]);//打印棋盘 
void player_input(char board[ROW][COL]);//玩家落子 


int main()
{
    int i,j;
    char board[ROW][COL];
    
    //初始化二维数组 
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            board[i][j]=' ';
        }
    }
    display_board(board);
    printf("---------------------------------------------------\n");
    
    while(1)
    {
        player_input(board);
    }
    return 0;
}


//打印棋盘
void display_board(char board[ROW][COL])
{
    int i,j;
    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!=ROW-1)
        {
            for(j=0;j<COL;j++)
        {
            printf("___");
            if(j!=COL-1)
            {
                printf("|");
            }
        } 
        printf("\n");
        }
        else
        {
               for(j=0;j<COL;j++)
            {
                printf(" %c ",board[i][j]);
                if(j!=COL-1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    } 
}

//玩家落子 
void player_input(char board[ROW][COL])
{
    int x,y;
    scanf("%d %d",&x,&y);//输入坐标 
    board[x-1][y-1]='#';
    display_board(board);//保存棋盘 
    printf("-------------------------------------------\n"); 
    
}
  1. 电脑落子

这里需用到随机数,第二点就是限制电脑落子,只能在空格的格子里落子。

#include<stdio.h>
#include<stdlib.h> //随机数生成 
#include<time.h> 

#define ROW 3 //定义常量  行数 
#define COL 3 //定义常量  列数 

void display_board(char board[ROW][COL]);//打印棋盘 
void player_input(char board[ROW][COL]);//玩家落子 
void computer_input(char board[ROW][COL]);//电脑落子 

int main()
{
    int i,j;
    char board[ROW][COL];
    
    //初始化二维数组 
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            board[i][j]=' ';
        }
    }
    display_board(board);
    printf("---------------------------------------------------\n");
    
    while(1)
    {
        player_input(board);
        computer_input(board);
    }
    return 0;
}


//打印棋盘
void display_board(char board[ROW][COL])
{
    int i,j;
    srand((unsigned int)time(NULL));//随机数生成 
    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!=ROW-1)
        {
            for(j=0;j<COL;j++)
        {
            printf("___");
            if(j!=COL-1)
            {
                printf("|");
            }
        } 
        printf("\n");
        }
        else
        {
               for(j=0;j<COL;j++)
            {
                printf("   ");
                if(j!=COL-1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    } 
}

//玩家落子 
void player_input(char board[ROW][COL])
{
    int x,y;
    scanf("%d %d",&x,&y);//输入坐标 
    board[x-1][y-1]='#';
    display_board(board);//保存棋盘 
    printf("-------------------------------------------\n"); 
    
}

//电脑落子
void computer_input(char board[ROW][COL])
{
    int x;
    int y;
    while(1)
    {
        x=rand()%ROW; //将数限制在0,1,2这三个数内 
        y=rand()%COL;
        if(board[x][y]==' ')
        {
            board[x][y]='&'; 
            display_board(board);
            printf("--------------------------------------------\n");
            break;
        }
    }
} 

  1. 胜,负,和棋,的判断

胜利有三种情况:横着三个,竖着三个,斜着三个

#include<stdio.h>
#include<stdlib.h> //随机数生成 
#include<time.h> 

#define ROW 3 //定义常量  行数 
#define COL 3 //定义常量  列数 

void display_board(char board[ROW][COL]);//打印棋盘 
void player_input(char board[ROW][COL]);//玩家落子 
void computer_input(char board[ROW][COL]);//电脑落子 
char win_game(char board[ROW][COL]);//胜负判断 

int main()
{
    int i,j;
    char board[ROW][COL];
    char re;
    
    //初始化二维数组 
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            board[i][j]=' ';
        }
    }
    display_board(board);
    printf("---------------------------------------------------\n");
    
    while(1)
    {
        player_input(board);
        re=win_game(board);
        if(re!='q')
        {
            break;
        }
        computer_input(board);
        re=win_game(board);
        if(re!='q')
        {
            break;
        }
    }
    if(re=='#')
    {
        printf("YOU WIN!!!");
    }
    else if(re=='&')
    {
        printf("YOU LOSE!"); 
    }
    else if(re=='p')
    {
        printf("PEASE!!");
    }
    return 0;
}


//打印棋盘
void display_board(char board[ROW][COL])
{
    int i,j;
    srand((unsigned int)time(NULL));//随机数生成 
    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!=ROW-1)
        {
            for(j=0;j<COL;j++)
        {
            printf("___");
            if(j!=COL-1)
            {
                printf("|");
            }
        } 
        printf("\n");
        }
        else
        {
               for(j=0;j<COL;j++)
            {
                printf("   ");
                if(j!=COL-1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    } 
}

//玩家落子 
void player_input(char board[ROW][COL])
{
    int x,y;
    while(1)
    {
        scanf("%d %d",&x,&y);//输入坐标 
        if(board[x-1][y-1]==' ')
        {
            board[x-1][y-1]='#';
            display_board(board);//保存棋盘 
            printf("-------------------------------------------\n"); 
            break;
        }
        else
        {
            printf("请重新落子\n"); 
        }
    }
    
}

//电脑落子
void computer_input(char board[ROW][COL])
{
    int x;
    int y;
    while(1)
    {
        x=rand()%ROW; //将数限制在0,1,2这三个数内 
        y=rand()%COL;
        if(board[x][y]==' ')
        {
            board[x][y]='&'; 
            display_board(board);
            printf("--------------------------------------------\n");
            break;
        }
    }
} 

char win_game(char board[ROW][COL])
{
    int i,j;
    int player=0;   //标志,为后面三个一样的情况做判断条件 
    int computer=0;
    int peace=0;
    
    //横着三个 
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            if(board[i][j]=='#')
            {
                player++;
            }
            else if(board[i][j]=='&')
            {
                computer++;
            }
        }
        
        if(player==3)
        {
            return '#';
        }
        else if(computer==3)
        {
            return '&';
        }
        
        player=0;//进行下一行判断 
        computer=0;
    } 
    
    //竖着三个
    for(j=0;j<COL;j++)
    {
        for(i=0;i<ROW;i++)
        {
            if(board[i][j]=='#')
            {
                player++;
            }
            else if(board[i][j]=='&')
            {
                computer++;
            }
        }
        
        if(player==3)
        {
            return '#';
        }
        else if(computer==3)
        {
            return '&';
        }
        
        player=0;//进行下一行判断 
        computer=0;
    } 
    
    //斜线"\"三个
    for(i=0;i<ROW;i++)
    {
        if(board[i][i]=='#')
        {
            player++;
        }
        else if(board[i][i]=='&')
        {
            computer++;
        }
        
        if(player==3)
        {
            return '#';
        }
        else if(computer==3)
        {
            return '&';
        }
    } 
    player=0;//重新赋值,进行下一轮判断 
    computer=0;
    
    //斜线“/ “三个
    for(i=0;i<ROW;i++)
    {
        if(board[i][ROW-1-i]=='#')
        {
            player++;
        }
        else if(board[i][ROW-1-i]=='&')
        {
            computer++;
        }
        if(player==3)
        {
            return '#';
        }
        else if(computer==3)
        {
            return '&';
        }
    } 
    player=0;//重新赋值,进行下一轮判断 
    computer=0;
    
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            if(board[i][j]!=' ')
            {
                peace++;
            }
        }
    }
    if(peace==9)
    {
        return 'p';
    }
    return 'q';
}

完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void display_board(char board[ROW][COL]);//打印棋盘
void computer_input(char board[ROW][COL]);//电脑下棋
void player_input(char board[ROW][COL]);//玩家下棋
char win_game(char board[ROW][COL]);//胜利条件


int main()
{
    srand((unsigned int)time(NULL));//生成随机数
    int i, j;
    char re;
    char board[ROW][COL];
    //初始化二维数组
    for (i = 0; i < ROW; i++)//二位数组的下标最好从0开始,否则会导致未定义行为或崩溃
    {
        for (j = 0; j < COL; j++)
        {
            board[i][j] = ' ';
        }
    }

    display_board(board);//为什么是传递指针而不是数组borad[ROW][COL]
    printf("--------------------------------------------------------------------\n");
    while (1)
    {
        player_input(board);
        printf("--------------------------------------------------------------------\n");
        re=win_game(board);
        if(re!='q')
        {
            break;
        }
        computer_input(board);
        printf("--------------------------------------------------------------------\n");
        re=win_game(board);
        if (re != 'q')
        {
            break;
        }
    }
    if (re == '#')
    {
        printf("YOU WIN!!!");
    }
    else if (re == '&')
    {
        printf("YOU LOSE!");
    }
    else if(re=='p')
    {
        printf("PEACE!!");
    }
    return 0;
}

//打印棋盘
void display_board(char board[ROW][COL])
{
    int i, j;

    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 != ROW - 1)
        {
            for (j = 0; j < COL; j++)
            {
                printf("___");
                if (j != COL - 1)
                    printf("|");
            }
            printf("\n");
        }
        else
        {
            for (j = 0; j < COL; j++)
            {
                if (j != COL - 1)
                    printf("   |");
            }
            printf("\n");
        }
    }
}

//电脑落子
void computer_input(char board[ROW][COL])
{
    int x, y;
    while (1)
    {
        x= rand() % ROW;
        y = rand() % COL;
        if (board[x ][y ] == ' ')
        {
            board[x ][y] = '&';
            break;
        }
    }
    display_board(board);
}

//玩家落子
void player_input(char board[ROW][COL])
{
    int x, y;
    scanf("%d %d", &x, &y);
    while (1)
    {
        if (board[x-1][y-1] == ' ')
        {
            board[x-1][y-1] = '#';
            break;
        }
        else
        {
            printf("请输入正确的行列数\n");
            scanf("%d %d", &x, &y);
        }
        
    }
    display_board(board);
}

char win_game(char board[ROW][COL])
{
    int i, j;
    int player = 0;
    int computer = 0;
    int peace = 0;

    //每行的判断
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            if (board[i][j] == '#')
            {
                player++;
            }
            else if (board[i][j] == '&')
            {
                computer++;
            }
        }
        if (player == 3)
        {
            return '#';
        }
        else if (computer == 3)
        {
            return '&';
        }
        player = 0;
        computer = 0;
    }

    //每列的判断
    for (j = 0; j < COL; j++)
    {
        for (i = 0; i < ROW; i++)
        {
            if (board[i][j] == '#')
            {
                player++;
            }
            else if (board[i][j] == '&')
            {
                computer++;
            }
        }
        if (player == 3)
        {
            return '#';
        }
        else if (computer == 3)
        {
            return '&';
        }
        player = 0;
        computer = 0;
    }

    //  斜线"\"的判断
    for (i = 0; i < ROW; i++)
    {
        if (board[i][i] == '#')
        {
            player++;
        }
        else if (board[i][i] == '&')
        {
            computer++;
        }
        if (player == 3)
        {
            return '#';
        }
        else if (computer == 3)
        {
            return '&';
        }
        
    }
    player = 0;
    computer = 0;
    //斜线"/"的判断
    for (i = ROW - 1;i>=0; i--)
    {
        if (board[ROW-i-1][i] == '#')
        {
            player++;
        }
        else if (board[ROW-i-1][i] == '&')
        {
            computer++;
        }
        if (player == 3)
        {
            return '#';
        }
        else if (computer == 3)
        {
            return '&';
        }
    }

    //和棋
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            if (board[i][j] != ' ')
            {
                peace++;
            }
        }
    }
    if (peace == ROW * COL)
    {
        return 'p';
    }
    return 'q';
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值