五子棋代码来了

#include<iostream>
#include<vector>
#include<string>
#include<windows.h>
using namespace std;

void color(int x){   
if(x>=0 & x<=15)
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
    else{
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);

    }
}


class qipan{
public:
int  a[15][15];
qipan();
void paint1();
 void play();
 int  AI();
 int  player(int,int,int);
 int max1(int a1[4]);
 int get1(int a1[4]);
 int s;
 int s1[2];
};

qipan::qipan(){ //棋盘类的构造函数
for(int i=0;i<15;i++)
{
    for(int j=0;j<15;j++)
    {
      a[i][j]=0;
    }
}
s=0;
s1[0]=-1;
s1[1]=-1;
}

int qipan::max1(int a1[4])
  {
      int temp=a1[0];
    for(int i=1;i<4;i++)
        if(a1[i]>temp)
         {
           temp=a1[i];
         }
    return temp;
  }

  int qipan::get1(int a1[4])
   {
       int temp=a1[0];
       int tp1=1;
       for(int i=1;i<4;i++)
        if(a1[i]>temp)
         {
             temp=a1[i];
             tp1=i+1;
         }
     return tp1;
   }


void qipan::paint1()  //绘制棋盘的函数
{
  cout<<"   ";
  for(int i=0;i<15;i++)
  {
      if(i<=9){
    cout<<i<<" ";
      }
      else
        cout<<i<<"";
  }
  cout<<endl;
  for(int i=0;i<15;i++)
  {  if(i<=9){
      cout<<i<<"  ";
     }
     else
        cout<<i<<" ";
    for(int j=0;j<15;j++)
    {
       if(a[i][j]==0){
             color(7);
            cout<<"十";
       }
        else if(a[i][j]==1){
                color(12); //显示红色棋子
            cout<<"红";
        }
        else if(a[i][j]==2){
            color(2); //显示蓝色棋子
            cout<<"蓝";
        }
    }
    cout<<endl;
  }
}

int  qipan::player(int x1,int y1,int z)
 {
   if(a[x1][y1]!=0){
    cout<<"落子无效";
    return 1;
   }
   a[x1][y1]=z;


   //判断同一直线上位置是否有五子
   int total=0;
   for(int i=y1-1;i>=0;i--)
   {
       if(a[x1][i]==z)
          total++;
       else
        break;

   }

   for(int i=y1+1;i<15;i++){
     if(a[x1][i]==z)
        total++;
     else
        break;
   }
   if(total>=4)
     return 5; //获胜

   //判断同一竖线上是否有五子

   total=0;
   for(int i=x1-1;i>=0;i--){
     if(a[i][y1]==z)
        total++;
     else
        break;

   }
   for(int i=x1+1;i<15;i++)
   {
       if(a[i][y1]==z)
         total++;
       else
        break;
   }
    if(total>=4)
        return 5; //获胜

    //判断左斜线是否有五子
    total=0;
    for(int i=1;i<5;i++)
    {
      if(x1-i<0 || y1-i<0)
            break;
      if(a[x1-i][y1-i]==z)
        total++;
      else
        break;
    }

    for(int i=1;i<5;i++){
       if(x1+i>=15 || y1+i >=15)
            break;
       if(a[x1+i][y1+i]==z)
          total++;
       else
        break;

    }
    if(total>=4)
        return 5; //获胜

  //判断右斜线是否有五子;
     total=0;
     for(int i=1;i<5;i++)
     {
        if(x1-i<0 || y1+i>=15)
            break;
        if(a[x1-i][y1+i]==z)
            total++;
        else
            break;
     }

     for(int i=1;i<5;i++)
     {
         if(x1+i>=15 || y1-i<0)
            break;
         if(a[x1+i][y1-i]==z)
            total++;
         else
            break;

     }
     if(total>=4)
        return 5; //获胜
     return 2; //落子有效,但未获胜
 }

 int  qipan::AI(){
     int t1=0;
    // 判断自己有没有四子的情况


     for(int i=0;i<15;i++)
 {
     for(int j=0;j<15;j++)
     {
         int total1=0;
         int total2=0;
         int total3=0;
         int total4=0;
         if(a[i][j]!=0)
            continue;
         for(int a1=1;a1<5;a1++) //判断水平线
         {
           if(j-a1<0)
                break;
           if(a[i][j-a1]==2)
             total1++;
           else
            break;
         }

         for(int a1=1;a1<5;a1++)
         {
            if(j+a1>=15)
                break;
            if(a[i][j+a1]==2)
                total1++;
            else
                break;
         }

         for(int a1=1;a1<5;a1++)  //判断竖直部分
          {
             if(i-a1<0)
               break;
             if(a[i-a1][j]==2)
                total2++;
             else
                break;
          }

          for(int a1=1;a1<5;a1++)
          {
              if(i+a1>=15)
                break;
              if(a[i+a1][j]==2)
                total2++;
              else
                break;
          }

          for(int a1=1;a1<5;a1++)  //判断左斜线
            {
               if(i-a1<0 || j-a1<0)
                 break;
                if(a[i-a1][j-a1]==2)
                    total3++;
                else
                    break;

            }

        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j+a1>=15)
             break;
          if(a[i+a1][j+a1]==2)
            total3++;
          else
            break;
        }

        for(int a1=1;a1<5;a1++)  //判断右斜线
          {
            if(i-a1<0 || j+a1>=15)
                break;
            if(a[i-a1][j+a1]==2)
                total4++;
            else
                break;
          }
        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j-a1<0)
            break;
          if(a[i+a1][j-a1]==2)
            total4++;
          else
            break;
        }
        int a1[4]={total1,total2,total3,total4};
        int temp=max1(a1);
        if(temp>=4)
        {
         a[i][j]=2;
                     // cout<<"AI已获胜";
         return -1;
        }

     }
 }



     for(int i=0;i<15;i++)  //判断对手是否有大于三子的情况
     {
        for(int j=0;j<15;j++)
        {
            int total1=0;
            int total2=0;
            int total3=0;
            int total4=0;
         if(a[i][j]==1 || a[i][j]==2)
            continue;
          for(int a1=1;a1<5;a1++)  //判断水平线
              {if(j-a1<0)
                break;

                if(a[i][j-a1]==1)
                    total1++;
                else
                   break;

              }

         for(int a1=1;a1<5;a1++)
         {
           if(j+a1>=15)
             break;
           if(a[i][j+a1]==1)
             total1++;
           else
            break;
         }

         for(int a1=1;a1<5;a1++)  //判断竖直线
           {
              if(i-a1<0)
                break;
              if(a[i-a1][j]==1)
                total2++;
              else
                break;
           }

         for(int a1=1;a1<5;a1++)
         {
             if(i+a1>=15)
                break;
             if(a[i+a1][j]==1)
                total2++;
             else
                break;
         }

         for(int a1=1;a1<5;a1++)  //判断左斜线
           {
            if(i-a1<0 || j-a1<0)
                break;
            if(a[i-a1][j-a1]==1)
                total3++;
            else
                break;
           }

        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j+a1>=15)
                break;
          if(a[i+a1][j+a1]==1)
            total3++;
          else
            break;
        }

        for(int a1=1;a1<5;a1++)  //判断右斜线
           {
             if(i-a1<0 || j+a1>=15)
                break;
             if(a[i-a1][j+a1]==1)
                total4++;
             else
                break;
           }

        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j-a1<0)
                break;
          if(a[i+a1][j-a1]==1)
            total4++;
          else
            break;
        }
        int a1[4]={total1,total2,total3,total4};
        int temp=max1(a1);
        int tp1=get1(a1); //获取哪个方向上连子最多,1表示水平线,2代表竖直线,3代表左斜线,4代表右斜线
        if(temp==3)   //对手已经三子,此时要分情况,有边界的三子不用堵,没有边界的三子需要堵
          {
            if(tp1==1)  //水平线有三子
              {
                 int a1;
                 int tpx1=0;
                 for(a1=1;a1<=3;a1++)
                 {
                   //  tpx1=0;
                   if(j-a1<0)
                      break;
                   if(a[i][j-a1]==1)
                     tpx1++;
                   else
                     break;

                 }

                 if(tpx1==3)
                 {
                   if(j-a1==0)
                   {

                   }
                   else if(j-a1-1>=0)
                   {
                     if(a[i][j-a1-1]==0)
                     {
                       a[i][j]=2;
                       return 0;
                     }
                   }
                 }

                 else if(tpx1==2)
                 {
                   a[i][j]=2;
                   return 0;
                 }
                 else if(tpx1==1)
                 {
                     a[i][j]=2;
                     return 0;
                 }
                 else if(tpx1==0)
                 {
                     if(j+a1==14)
                     {

                     }
                     else if(j+a1<14)
                     {
                         if(a[i][j+a1+1]==0)
                         {
                           a[i][j]=2;
                           return 0;
                         }
                     }
                 }

                } //水平线三子情况判断结束


            else if(tp1==2) //竖直线有三子的情况
               {

                    int a1;
                 int tpx1=0;
                 for(a1=1;a1<=3;a1++)
                 {
                   //  tpx1=0;
                   if(i-a1<0)
                      break;
                   if(a[i-a1][j]==1)
                     tpx1++;
                   else
                     break;

                 }

                 if(tpx1==3)
                 {
                   if(i-a1==0)
                   {

                   }
                   else if(i-a1-1>=0)
                   {
                     if(a[i-a1-1][j]==0)
                     {
                       a[i][j]=2;
                       return 0;
                     }
                   }
                 }

                 else if(tpx1==2)
                 {
                   a[i][j]=2;
                   return 0;
                 }
                 else if(tpx1==1)
                 {
                     a[i][j]=2;
                     return 0;
                 }
                 else if(tpx1==0)
                 {
                     if(i+a1==14)
                     {

                     }
                     else if(i+a1<14)
                     {
                         if(a[i+a1+1][j]==0)
                         {
                           a[i][j]=2;
                           return 0;
                         }
                     }
                 }


               }  //竖直线有三子情况判断结束


          else if(tp1==3)  //左斜线有三子的情况
             {

                 int a1;
                 int tpx1=0;
                 for(a1=1;a1<=3;a1++)
                 {
                   //  tpx1=0;
                   if(i-a1<0 || j-a1<0)
                      break;
                   if(a[i-a1][j-a1]==1)
                     tpx1++;
                   else
                     break;

                 }

                 if(tpx1==3)
                 {
                   if(i-a1==0 || j-a1==0)
                   {

                   }
                   else if(i-a1-1>=0 and j-a1-1>=0)
                   {
                     if(a[i-a1-1][j-a1-1]==0)
                     {
                       a[i][j]=2;
                       return 0;
                     }
                   }
                 }

                 else if(tpx1==2)
                 {
                   a[i][j]=2;
                   return 0;
                 }
                 else if(tpx1==1)
                 {
                     a[i][j]=2;
                     return 0;
                 }
                 else if(tpx1==0)
                 {
                     if(i+a1==14 || j+a1==14)
                     {

                     }
                     else if(i+a1<14 and j+a1<14)
                     {
                         if(a[i+a1+1][j+a1+1]==0)
                         {
                           a[i][j]=2;
                           return 0;
                         }
                     }
                 }



             }  //左斜线三子情况判断结束


          else if(tp1==4) //判断右斜线有三子的情况
          {

              int a1;
                 int tpx1=0;
                 for(a1=1;a1<=3;a1++)
                 {
                   //  tpx1=0;
                   if(i-a1<0 || j+a1 >14)
                     break;
                   if(a[i-a1][j+a1]==1)
                     tpx1++;
                   else
                     break;

                 }

                 if(tpx1==3)
                 {
                   if(i-a1==0 || j+a1==14)
                   {

                   }
                   else if(i-a1-1>=0 and j+a1+1<=14)
                   {
                     if(a[i-a1-1][j+a1+1]==0)
                     {
                       a[i][j]=2;
                       return 0;
                     }
                   }
                 }

                 else if(tpx1==2)
                 {
                   a[i][j]=2;
                   return 0;
                 }
                 else if(tpx1==1)
                 {
                     a[i][j]=2;
                     return 0;
                 }
                 else if(tpx1==0)
                 {
                     if(i+a1==14 || j-a1==0)
                     {

                     }
                     else if(i+a1<14 and j-a1>0)
                     {
                         if(a[i+a1+1][j-a1-1]==0)
                         {
                           a[i][j]=2;
                           return 0;
                         }
                     }
                 }



          } //右斜线三子情况判断结束



          }  //对手有三子的情况 (if的括号)


    else if(temp==4 || temp==5)    //对手有四子或五子,一定要堵
    {
       a[i][j]=2;
       return 0;
    }



        }
     }




     //判断对手连子情况结束,开始连自己五子



     for(int i=0;i<15;i++)
     {
       for(int j=0;j<15;j++)
       {
         if(a[i][j]==2)
            t1++;
       }
     }

     if(t1==0)
     {
       a[7][7]=2;
       return 0;
     }
 for(int i=0;i<15;i++)
 {
     for(int j=0;j<15;j++)
     {
         int total1=0;
         int total2=0;
         int total3=0;
         int total4=0;
         if(a[i][j]!=0)
            continue;
         for(int a1=1;a1<5;a1++) //判断水平线
         {
           if(j-a1<0)
                break;
           if(a[i][j-a1]==2)
             total1++;
           else
            break;
         }

         for(int a1=1;a1<5;a1++)
         {
            if(j+a1>=15)
                break;
            if(a[i][j+a1]==2)
                total1++;
            else
                break;
         }

         for(int a1=1;a1<5;a1++)  //判断竖直部分
          {
             if(i-a1<0)
               break;
             if(a[i-a1][j]==2)
                total2++;
             else
                break;
          }

          for(int a1=1;a1<5;a1++)
          {
              if(i+a1>=15)
                break;
              if(a[i+a1][j]==2)
                total2++;
              else
                break;
          }

          for(int a1=1;a1<5;a1++)  //判断左斜线
            {
               if(i-a1<0 || j-a1<0)
                 break;
                if(a[i-a1][j-a1]==2)
                    total3++;
                else
                    break;

            }

        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j+a1>=15)
             break;
          if(a[i+a1][j+a1]==2)
            total3++;
          else
            break;
        }

        for(int a1=1;a1<5;a1++)  //判断右斜线
          {
            if(i-a1<0 || j+a1>=15)
                break;
            if(a[i-a1][j+a1]==2)
                total4++;
            else
                break;
          }
        for(int a1=1;a1<5;a1++)
        {
          if(i+a1>=15 || j-a1<0)
            break;
          if(a[i+a1][j-a1]==2)
            total4++;
          else
            break;
        }
        int a1[4]={total1,total2,total3,total4};
        int temp=max1(a1);
        if(temp>=4)
        {
         a[i][j]=2;
                     // cout<<"AI已获胜";
         return -1;
        }
        if(temp>s)
        {
          s=temp;
          s1[0]=i;
          s1[1]=j;
        }

     }
 }

 s=0;
 a[s1[0]][s1[1]]=2;
 s1[0]=-1;
 s1[1]=-1;
return 0;
 }


 void qipan::play()
  {
    while(1)
    {   int x1,y1;

     int temp= AI();
        paint1();
        cout<<endl;
        if(temp==-1)
        {
          cout<<"AI已获胜";
          Sleep(20000);
          return ;
        }
        cout<<"AI已经落子"<<endl;


        cout<<"请红方落子"<<endl;
        cin>>x1>>y1;
         temp=player(x1,y1,1);
         cout<<endl;
        if(temp==1){
            while(temp==1){
                paint1();
                cout<<"红方落子无效,请重新落子";
                cin>>x1>>y1;
                temp=player(x1,y1,1);
                cout<<endl;
            }

        }

          if(temp==5){
                paint1();
            cout<<"恭喜红方获胜"<<endl;
            Sleep(20000);
            return ;
        }
        paint1();
        cout<<endl;



    }

  }

int main()
{
 qipan a;
 a.paint1();
 a.play();
}

亲测有效,输入数对下棋!!!!!!!!!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值