C语言五子棋进阶版(增设玩家对战,大棋盘,棋盘行列对应等)

  经过好多天的编写,五子棋项目总算完成,作为一个学了不是很久的小白,我在编写过程中也遇到了许多困难,但还好都解决了,在此我建议和我一样,是小白的都应该写写五子棋或三子棋,当然,不是全抄别人的代码,也不是一遇到不会的就去找,先思考解决方法,多尝试,即使错了也没关系,实在遇到不会的就进行查询,但查询过后必须要知道原理,怎么写的,为什么这样写,为什么自己想不到,接下来进行代码讲解:

  关于五子棋,其实就是个简单的游戏,那么作为游戏,就应该有个基础的框架,开始或结束,我们先来一个游戏框架:

void moshi()
{
    printf(" ***-- - 2.玩家对战-- - ***\n");
    printf(" ***-- - 3.人机对战-- - ***\n");
    printf("PS:输入2进行两玩家间对决,输入其他整数进行人机对决\n");


}
void menu()
{
    printf("***---1.开始游戏---***\n");
    printf("***---0.退出游戏---***\n");
}
int main()
{
    int input = 0;
    int a = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        scanf("%d", &input);
        if (input == 1)
        {
            printf("请选择模式\n");
            moshi();
            scanf("%d", &a);
            game(a);
            break;
        }
        if (input == 0)
        {
            printf("已退出\n");
            break;
        }
        else
        {
            printf("输入错误请重新输入\n");
        }
    } while (input);
    return 0;
}

  do while循环方便判断游戏是否进行和游戏结束后直接继续,不用再做一次选择

其中的moshi函数是选择模式人机或玩家。

  框架搭好后就是引用头文件还有定义行与列

#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>

  行与列的定义方便修改棋盘,当然我你们也可以让玩家自己输入棋盘大小,将行与列撤出定义用scanf即可实现,下面的两个头文件是电脑走棋用的随机走的头文件,从这其实可以看出这个电脑是个‘傻子’毕竟我修为不够,无法给他设计算法。

  做好这一切后接下来就定义game函数用于游戏地进行

void game(int a)//引a用于判断是人机还是玩家
{
    char board[ROW][COL];
    initboard(board, ROW, COL);//初始化棋盘
    displayboard(board, ROW, COL);//打印棋盘
    if (a == 2)
    {
        while (1)//玩家间对决
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);//每走一步打印一次棋盘才知道走了哪
            full(board, ROW, COL);//平局判定
            char ping = full(board, ROW, COL);
            if (ping =='o');
            break;
            win(board, ROW, COL);//赢家判定
            char winer = win(board, ROW, COL);
            if (winer == 1)//玩家一获胜返回1
                continue;//如果一赢就跳出下半段从while循环开始
            printf("先行后列\n");
            playertwomovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            full(board, ROW, COL);
            if (ping == 'o');
            break;
            win(board, ROW, COL);
            if (winer == 1)
                continue;//同理
        }
    }
    else
    {
        while (1)//人机对决
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            full(board, ROW, COL);
            char ping = full(board, ROW, COL);
            if (ping == 'o');
            break;
            pcwin(board, ROW, COL);
            char pcwiner = pcwin(board, ROW, COL);
            if (pcwiner == 3)
                continue;
            printf("先行后列\n");
            computermovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            full(board, ROW, COL);
            if (ping == 'o');
            break;
            pcwin(board, ROW, COL);
            if (pcwiner == 4)
                continue;//与上述同理
        }
    }


}

  大致以定好,当然不可能第一次就能写出完整步骤,根据自己所写对此函数进行补充,接下来就是棋盘,先初始化棋盘,而后对棋盘进行打印。

void initboard(char board[ROW][COL], int row, int clo)//棋盘初始化,防止打印的棋盘空格处出现乱码
{

    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            board[i][j] = ' ';
        }

    }
}
void displayboard(char board[ROW][COL], int row, int col)//打印棋盘,先了解棋盘结构,采用for循环嵌套打印,嵌套两个小的for循环(两个小的for循环共同构成了棋盘中的一行
{
    int lie = 0;
    int hang = 0;
    int i = 0;
    int j = 0;
    printf("0");
    for (lie = 1; lie <= col; lie++)//打印每一列的序号
    {
        if (lie + 1 < 10)
            printf("  %d ", lie);//此处为空格空格%d空格(依据棋盘每个格子占四列)
        if (lie + 1 > 9)
            printf("  %d", lie);//大于10时一个数占两格
    }
    printf("\n");//对以上整体进行换行,是它能在棋盘上方
    for (i = 0; i < row; i++)
    {
        if (i + 1 < 10)
            printf("0%d", i + 1);//打印每行序号因为大于10会出现格子错乱所以用01 02 这类形式
        if (i + 1 > 9)
            printf("%d", i + 1);
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);//初始化起作用,能准确定位,方便棋盘的打印
            //if(j<col-1)
            printf("|");//打印出棋盘第一行的一半
        }
        printf("\n");//此处换行是为在行的下标仍为0的情况下能使其与第一行的下一半组合,否则会全在这一行中
        printf("  ");
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf("---");
            //if(j<col-1) //两个if语句可有可无,主要看棋盘设计,无if更顺眼
            printf("|");//打印出棋盘第一行的下半部分,棋盘第一行完成 且行下标为0,因为仍处于大for循环中i=0中
        }
        printf("\n");//继续换行,防止大的for循环进行下一次循环时与此次成一行
    }
}

 

  此处打印出的棋盘有行列对应的数字,但我的棋盘仅限于1-99,实际可以更多,但要对棋盘的行进行改动,如果非要防止这种改动,可以把行对应数打印在表格右侧,这样便能实现,我就不改了,要改的话就留给你们自己练习了,其实我一开始是考虑在整个棋盘不变的情况下做行对应数,但并未成功,所以在函数内部进行修改,知道怎么弄的大佬可以在评论区留下方法。

  接下来就是玩家一,玩家二与电脑的移动了,玩家一我们用'*',玩家二与电脑我们用‘#’

void playeronemovie(char board[ROW][COL], int row, int col)
{
    printf("玩家一请下");
    int x = 0;
    int y = 0;
    while (1)
    {
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
        {
            if (board[x - 1][y - 1] == ' ')//说明此点未下棋
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("被占用,请重输\n");
            }
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
    printf("玩家二请下");
    int x = 0;
    int y = 0;
    while (1)
    {
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
        {
            if (board[x - 1][y - 1] == ' ')//说明此点未下棋,减一是因为是下标,很容易忽略
            {
                board[x - 1][y - 1] = '#';
                break;
            }
            else
            {
                printf("被占用,请重输\n");
            }
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }
}
void computermovie(char board[ROW][COL],int row,int col)
{
    printf("电脑下\n");
    int x = rand()%10;
    int y = rand()%10;//余数只能取到一到九,此处也是不会算法的锅
    while (1)
    {
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

电脑下棋相比玩家要简单,只要棋盘有空处就会随机下,不会下到无空处或者是棋盘外。

  判断输赢,我个人写的这个步骤较为繁琐,因为有两个模式(人机与玩家间),所以输赢写两个函数,但实际写一个就行,另一个照着第一个修改局部就行

char win(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] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                        //一列五个
                board[i][j] == board[i+1][j]
                && board[i+1][j] == board[i+2][j]
                && board[i+2][j] == board[i+3][j]
                && board[i+3][j] == board[i+4][j]
                && board[i+4][j] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                       //斜五个
                board[i][j] == board[i+1][j + 1]
                && board[i+1][j + 1] == board[i+2][j + 2]
                && board[i+2][j + 2] == board[i+3][j + 3]
                && board[i+3][j + 3] == board[i+4][j + 4]
                && board[i+4][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }//玩家一获胜情况结束,玩家二也是如此 修改符号即可

        }

    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (                                       //一行五个
                board[i][j] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }//玩家二获胜情况结束

        }

    }
}
char pcwin(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] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }//玩家一获胜情况结束,玩家二也是如此 修改符号即可

        }

    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (                                       //一行五个
                board[i][j] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }//电脑获胜情况结束

        }

    }
 
}

  一方胜后要初始化棋盘,否则任然会在获胜的棋盘中进行下一轮,这个判断输赢的方法很繁琐,但很明显,因为暂时没想到其他方法。

  有输有赢当然也有平局啦,所以我们要写一个判断平局的函数。

void game(int a)
{
    char board[ROW][COL];
    initboard(board, ROW, COL);
    displayboard(board, ROW, COL);
    int ping = 0;
    if (a == 2)
    {
        while (1)
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            win(board, ROW, COL);
            char winer = win(board, ROW, COL);
            if (winer == 1)
                continue;
            printf("先行后列\n");
            playertwomovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            win(board, ROW, COL);
            if (winer == 1)
                continue;
             ping++;
            if (ping == ROW * COL / 2)
            {
                printf("平局");
                break;
            }
        }
    }
    else
    {
        while (1)
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            pcwin(board, ROW, COL);
            char pcwiner = pcwin(board, ROW, COL);
            if (pcwiner == 3)
                continue;
            printf("先行后列\n");
            computermovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            pcwin(board, ROW, COL);
            if (pcwiner == 4)
                continue;
             ping++;
            if (ping ==ROW*COL/2)
            {
                printf("平局");
                break; 
            }
        }
    }


}

  将平局套用进去棋盘中的棋格必定为偶数,所以双方下一轮判定一次,当到棋盘棋格数的一半轮数时棋盘下满。

  所有的小部分都在这,接下来发整体。

#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void initboard(char board[ROW][COL], int row, int clo)//棋盘初始化,防止打印的棋盘空格处出现乱码
{

    int i = 0;
    int j = 0;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            board[i][j] = ' ';
        }

    }
}
void displayboard(char board[ROW][COL], int row, int col)//打印棋盘,先了解棋盘结构,采用for循环嵌套打印,嵌套两个小的for循环(两个小的for循环共同构成了棋盘中的一行
{
    int lie = 0;
    int hang = 0;
    int i = 0;
    int j = 0;
    printf("0");
    for (lie = 1; lie <= col; lie++)//打印每一列的序号
    {
        if (lie + 1 < 10)
            printf("  %d ", lie);//此处为空格空格%d空格(依据棋盘每个格子占四列)
        if (lie + 1 > 9)
            printf("  %d", lie);//大于10时一个数占两格
    }
    printf("\n");//对以上整体进行换行,是它能在棋盘上方
    for (i = 0; i < row; i++)
    {
        if (i + 1 < 10)
            printf("0%d", i + 1);//打印每行序号因为大于10会出现格子错乱所以用01 02 这类形式
        if (i + 1 > 9)
            printf("%d", i + 1);
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);//初始化起作用,能准确定位,方便棋盘的打印
            //if(j<col-1)
            printf("|");//打印出棋盘第一行的一半
        }
        printf("\n");//此处换行是为在行的下标仍为0的情况下能使其与第一行的下一半组合,否则会全在这一行中
        printf("  ");
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf("---");
            //if(j<col-1) //两个if语句可有可无,主要看棋盘设计,无if更顺眼
            printf("|");//打印出棋盘第一行的下半部分,棋盘第一行完成 且行下标为0,因为仍处于大for循环中i=0中
        }
        printf("\n");//继续换行,防止大的for循环进行下一次循环时与此次成一行
    }
}

void playeronemovie(char board[ROW][COL], int row, int col)
{
    printf("玩家一请下");
    int x = 0;
    int y = 0;
    while (1)
    {
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
        {
            if (board[x - 1][y - 1] == ' ')//说明此点未下棋
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("被占用,请重输\n");
            }
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
    printf("玩家二请下");
    int x = 0;
    int y = 0;
    while (1)
    {
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
        {
            if (board[x - 1][y - 1] == ' ')//说明此点未下棋,减一是因为是下标,很容易忽略
            {
                board[x - 1][y - 1] = '#';
                break;
            }
            else
            {
                printf("被占用,请重输\n");
            }
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
    }
}
void computermovie(char board[ROW][COL],int row,int col)
{
    printf("电脑下\n");
    int x = rand()%10;
    int y = rand()%10;
    while (1)
    {
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
char win(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] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                        //一列五个
                board[i][j] == board[i+1][j]
                && board[i+1][j] == board[i+2][j]
                && board[i+2][j] == board[i+3][j]
                && board[i+3][j] == board[i+4][j]
                && board[i+4][j] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                       //斜五个
                board[i][j] == board[i+1][j + 1]
                && board[i+1][j + 1] == board[i+2][j + 2]
                && board[i+2][j + 2] == board[i+3][j + 3]
                && board[i+3][j + 3] == board[i+4][j + 4]
                && board[i+4][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 1;

            }//玩家一获胜情况结束,玩家二也是如此 修改符号即可

        }

    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (                                       //一行五个
                board[i][j] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }
            if (                                      //斜五个
                board[i][j] == board[i - 1][j - 1]
                && board[i - 1][j - 1] == board[i - 2][j - 2]
                && board[i - 2][j - 2] == board[i - 3][j - 3]
                && board[i - 3][j - 3] == board[i - 4][j - 4]
                && board[i - 4][j - 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 2;

            }//玩家二获胜情况结束

        }

    }
}
char pcwin(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] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }
            if (                                      //斜五个
                board[i][j + 4] == board[i + 1][j + 3]
                && board[i + 1][j + 3] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 1]
                && board[i + 3][j + 1] == board[i + 4][j]
                && board[i + 4][j] == '*'
                )
            {
                printf("玩家一获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 3;

            }//玩家一获胜情况结束,玩家二也是如此 修改符号即可

        }

    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (                                       //一行五个
                board[i][j] == board[i][i + 1]
                && board[i][j + 1] == board[i][j + 2]
                && board[i][j + 2] == board[i][j + 3]
                && board[i][j + 3] == board[i][j + 4]
                && board[i][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                        //一列五个
                board[i][j] == board[i + 1][j]
                && board[i + 1][j] == board[i + 2][j]
                && board[i + 2][j] == board[i + 3][j]
                && board[i + 3][j] == board[i + 4][j]
                && board[i + 4][j] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                       //斜五个
                board[i][j] == board[i + 1][j + 1]
                && board[i + 1][j + 1] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j + 3]
                && board[i + 3][j + 3] == board[i + 4][j + 4]
                && board[i + 4][j + 4] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }
            if (                                      //斜五个
                board[i][j+4] == board[i +1][j + 3]
                && board[i + 1][j - 3] == board[i + 2][j + 2]
                && board[i + 2][j + 2] == board[i + 3][j +1]
                && board[i + 3][j + 1] == board[i + 4][j ]
                && board[i + 4][j] == '#'
                )
            {
                printf("玩家二获胜\n");
                initboard(board, ROW, COL);
                displayboard(board, ROW, COL);
                return 4;

            }//电脑获胜情况结束

        }

    }
 
}
void game(int a)
{
    char board[ROW][COL];
    initboard(board, ROW, COL);
    displayboard(board, ROW, COL);
    int ping = 0;
    if (a == 2)
    {
        while (1)
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            win(board, ROW, COL);
            char winer = win(board, ROW, COL);
            if (winer == 1)
                continue;
            printf("先行后列\n");
            playertwomovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            win(board, ROW, COL);
            if (winer == 1)
                continue;
             ping++;
            if (ping == ROW * COL / 2)
            {
                printf("平局");
                break;
            }
        }
    }
    else
    {
        while (1)
        {
            printf("先行后列\n");
            playeronemovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            pcwin(board, ROW, COL);
            char pcwiner = pcwin(board, ROW, COL);
            if (pcwiner == 3)
                continue;
            printf("先行后列\n");
            computermovie(board, ROW, COL);
            displayboard(board, ROW, COL);
            pcwin(board, ROW, COL);
            if (pcwiner == 4)
                continue;
             ping++;
            if (ping ==ROW*COL/2)
            {
                printf("平局");
                break; 
            }
        }
    }


}
void moshi()
{
    printf(" ***-- - 2.玩家对战-- - ***\n");
    printf(" ***-- - 3.人机对战-- - ***\n");
    printf("PS:输入2进行两玩家间对决,输入其他整数进行人机对决\n");


}
void menu()
{
    printf("***---1.开始游戏---***\n");
    printf("***---0.退出游戏---***\n");
}
int main()
{
    int input = 0;
    int a = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        scanf("%d", &input);
        if (input == 1)
        {
            printf("请选择模式\n");
            moshi();
            scanf("%d", &a);
            game(a);
            break;
        }
        if (input == 0)
        {
            printf("已退出\n");
            break;
        }
        else
        {
            printf("输入错误请重新输入\n");
        }
    } while (input);
    return 0;
}

此代码共509行,由于技术不够,只能行数来凑,对于目前的我是个大工程,耗时也长,但做出来还是挺开心的,都看到这了,来个三连吧,求求了,后面可能还会写个扫雷,当然耗时也会很长。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shany-Ming

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

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

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

打赏作者

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

抵扣说明:

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

余额充值