五子棋判断胜负代码有问题,求大佬帮个忙看看,急急急!

数组p[][]==1的时候为黑子,p[][]==2的时候为白子,黑子没啥问题,但是白子总是四连外加一个黑子的时候赢,但是我检查不出来问题在哪。

#include<iostream>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#define N 15
using namespace std;
class Chess
{
public:
    void Init();
    int Play();
    void Print();
    int Put();
    int Judge();
    int Attack();
    int Defend();
    int aiPut();
    void Test();
    int Winner();
private:
    int p[N][N];
    int score1[N][N];
    int score2[N][N];
    int X; int Y;
    int Gamer;
    int count;
};
int main()
{
    Chess che;
    che.Test();
    che.Init();
    return 0;
}
int Chess::Play()
{
    Init();
    count = 0;
    while (1)
    {
        Print();
        char ch = _getch();
        switch (ch)
        {
        case 32:
            if (1 == Put())
            {
                Attack();
                Defend();
                aiPut();
                Judge();
                Winner();
            };
            break;
        case 72:
            X--; if (X < 0)X = 14;
            break;
        case 80:
            X++; if (X > 14)X = 0;
            break;
        case 75:
            Y--; if (Y < 0)Y = 14;
            break;
        case 77:
            Y++; if (Y > 14)Y = 0;
            break;
        }
    }
    return 0;
}
void Chess::Init()
{
    memset(p, 0, sizeof(p));
    memset(score1, 0, sizeof(score1));
    memset(score2, 0, sizeof(score2));
    X = Y = 7;
}
void Chess::Print()                    //此处省略,博客上打不出来。
{
}
int Chess::Put()
{
    if (p[X][Y] == 0)
    {
        p[X][Y] = 1;
        return 1;
    }
    else
        return 0;
}
int Chess::Judge()
{
    int h_b = 1; int v_b = 1; int ps_b = 1; int sd_b = 1;
    int h_w = 1; int v_w = 1; int ps_w = 1; int sd_w = 1;
    for (int i = 1; i < 5; i++)
    {
        if (Y + i < 15 && p[X][Y + i] == 1)
            h_b++;
        if (Y + i < 15 && p[X][Y + i] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (Y - i > 0 && p[X][Y - i] == 1)
            h_b++;
        if (Y - i > 0 && p[X][Y - i] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && p[X + i][Y] == 1)
            v_b++;
        if (X + i < 15 && p[X + i][Y] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && p[X - i][Y] == 1)
            v_b++;
        if (X - i > 0 && p[X - i][Y] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
            ps_b++;
        if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
            ps_b++;
        if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
            sd_b++;
        if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
            sd_b++;
        if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
            break;
    }
    if (h_b == 5 || v_b == 5 || ps_b == 5 || sd_b == 5)
    {
        return 1;
    }

    //白子胜利判断
    for (int i = 1; i < 5; i++)
    {
        if (Y + i < 15 && p[X][Y + i] == 2)
            h_w++;
        if (Y + i < 15 && p[X][Y + i] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (Y - i > 0 && p[X][Y - i] == 2)
            h_w++;
        if (Y - i > 0 && p[X][Y - i] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && p[X + i][Y] == 2)
            v_w++;
        if (X + i < 15 && p[X + i][Y] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && p[X - i][Y] == 2)
            v_w++;
        if (X - i > 0 && p[X - i][Y] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
            ps_w++;
        if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
            ps_w++;
        if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
            sd_w++;
        if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
            break;
    }
    for (int i = 1; i < 5; i++)
    {
        if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
            sd_w++;
        if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
            break;
    }
    if (h_w == 5 || v_w == 5 || ps_w == 5 || sd_w == 5)
    {
        return 2;
    }
}
int Chess::Winner()
{
    int winner = Judge();
    if (winner == 1)
    {
        count = 0;
        system("cls");
        MessageBox(NULL, L"黑子赢了", L"提示", MB_OK);
        return 0;
    }
    else if (winner == 2)
    {
        count = 0;
        system("cls");
        MessageBox(NULL, L"白子赢了", L"提示", MB_OK);
        return 0;
    }
    else if (count == 225)
    {
        count = 0;
        system("cls");
        MessageBox(NULL, L"平局", L"提示", MB_OK);
        return 0;
    }
}
void Chess::Test()
{
    SetConsoleTitleA("五子棋人机对战");
    system("mode con cols=50 lines=20");
    system("color 70");
    while (1)
    {
        Play();
    }
}
int Chess::Attack()
{
    int i1, j1;
    int k1, k2, k;
    for (int i = 0; i < 15; i++)
    {
        for (int j = 0; j < 15; j++)
        {
            if (p[i][j])
                score1[i][j] = 0;
            if (p[i][j] == 0)
            {
                k1 = k2 = 0;
                for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k1++;
                    else
                        break;
                }
                for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k2++;
                    else
                        break;
                }
                k = k1 > k2 ? k1 : k2;
                k1 = k2 = 0;
                for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k1++;
                    else
                        break;
                }
                for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                k1 = k2 = 0;
                for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k1++;
                    else
                        break;
                }
                for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                k1 = k2 = 0;
                for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k1++;
                    else
                        break;
                }
                for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找电脑棋子数
                {
                    if (p[i1][j1] == 2)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                switch (k)    //根据连子数赋予权值
                {
                case 1:
                    score1[i][j] = 15; break;
                case 2:
                    score1[i][j] = 60; break;
                case 3:
                    score1[i][j] = 240; break;
                case 4:
                    score1[i][j] = 3000; break;
                default:
                    score1[i][j] = 0; break;
                }
            }
        }
    }
    return 0;
}
int Chess::Defend()                     //电脑在棋盘各个位置的防守权值 
{
    int i1, j1;
    int k1, k2, k;
    for (int i = 0; i < 15; i++)
    {
        for (int j = 0; j < 15; j++)
        {
            if (p[i][j])
                score2[i][j] = 0;
            if (p[i][j] == 0)
            {
                k1 = k2 = 0;
                for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k1++;
                    else
                        break;
                }
                for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k2++;
                    else
                        break;
                }
                k = k1 > k2 ? k1 : k2;
                k1 = k2 = 0;
                for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k1++;
                    else
                        break;
                }
                for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                k1 = k2 = 0;
                for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k1++;
                    else
                        break;
                }
                for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                k1 = k2 = 0;
                for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k1++;
                    else
                        break;
                }
                for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找玩家棋子数
                {
                    if (p[i1][j1] == 1)
                        k2++;
                    else
                        break;
                }
                k1 = k1 > k2 ? k1 : k2;
                k = k > k1 ? k : k1;
                switch (k)   //根据连子数赋予权值
                {
                case 1:
                    score2[i][j] = 10; break;
                case 2:
                    score2[i][j] = 40; break;
                case 3:
                    score2[i][j] = 160; break;
                case 4:
                    score2[i][j] = 4000; break;
                default:
                    score2[i][j] = 0; break;
                }
            }
        }
    }
    return 0;
}
int Chess::aiPut()
{
    int k1 = 0, k2 = 0;
    int i, j, max = 0;
    for (i = 0; i < 15; i++)
    {
        for (j = 0; j < 15; j++)
        {
            if (max <= score1[i][j])
            {
                max = score1[i][j];
                k1 = i;
                k2 = j;
            }
        }
    }
    for (i = 0; i < 15; i ++)
    {
        for (j = 0; j < 15; j++)
        {
            if (max <= score2[i][j])
            {
                max = score2[i][j];
                k1 = i;
                k2 = j;
            }
        }
    }
    p[k1][k2] = 2;
    if (p[k1][k2] == 2)
    {
        cout << "  (这里是白子符号)";
        count++;
    }
    return 0;
}

这个代码不全,看不出什么来,我的博客地址有一个五子棋的源码,你可以去看看:https://blog.csdn.net/lynnlovemin/article/details/11133953?spm=1001.2014.3001.5502

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html