五子棋程序

来源:互联网 发布:吃鸡游戏新手入门必知 编辑:程序博客网 时间:2024/05/16 12:31

这是个用类写的五子棋程序,第一次用类写大一点的程序,没想到整个程序就一个类构成,感觉程序有点难看,主函数就那么几行,呵呵,就这样了,算法是自己想的,不怎么好,电脑有一点笨笨,由于不会控制鼠标,不会在屏幕上画图,棋盘是用最简单的 —和 | 组成的,并且下棋的时候要输入坐标下棋,代码如下:

#include<iostream>
#include<stdio.h>
#include<time.h>
#include<windows.h>
using namespace std;
class Temp
{
   int num,x,y;//可以下子最大数目num,坐标x,y
public:
   Temp(int x1=5,int y1=8,int n=0):x(x1),y(y1),num(n){}
   void Set(Temp &T){x=T.x;y=T.y;num=T.num;}
   void Set(int x1=3,int y1=3,int n=0){x=x1;y=y1;num=n;}
   int Getnum(void){return num;}
   int Getx(void){return x;}
   int Gety(void){return y;}
};
class Chess
{ int length,width,Mat[20][20];//棋盘的范围和存储矩阵,矩阵中,1表示人的棋子,-1表示电脑的棋子,0表示空位
   int cnumber,pnumber,Flag;////两方棋子的个数,是否结束的标志 Flag
   int cwin,pwin;//计算机落子处为-1,人落子处为1
public:
void Initchess(int l=10,int w=10);
Chess(int l=10,int w=10);
void Printwindow(void);
void Set(int l=10,int w=10);
void Computermove(void);
void Playermove(void);
int Getflag(void){return Flag;}
private:
    void Checkwin(int flag);
void Findplace(int x1,int y1,Temp &T, int flag);
};
void Chess::Initchess(int l,int w)
{ int i,j;
cnumber=0;
pnumber=0;
cwin=-1;
pwin=1;
Flag=0;
for(i=0;i<20;i++)
   for(j=0;j<20;j++)
    Mat[i][j]=0;
}
Chess::Chess(int l,int w)
{ length=l;
width=w;
Initchess(l,w);
}
void Chess::Printwindow(void)
{ int i,j,k,l,m;
    system("cls");
     cout<<" ";
for(j=0,l=0;j<(width-1)*4-12;j++,l++)//输出横行数字
     if(j!=0&&(l=l%3)==0)
{ if(j/3<10)
      cout<<j/3<<' ';
   else cout<<j/3;
}
    else cout<<' ';
cout<<endl;
for(i=0,k=0;i<length*2+1;i++,k++)
     if((k=k%2)==0)
{ cout<<"   ";
   for(m=0;m<(width-1)*4+5;m++)
       cout<<'-';
         cout<<endl;
}
   else
   { if(i/2+1<10)
       cout<<' ';
    cout<<i/2+1<<' ';
    for(j=0,l=0;j<(width-1)*4-12;j++,l++)
    { if((l=l%3)==0)
   cout<<'|';
         if(l==0||l==2) cout<<' ';
          if(l==1&&i/2<length&&j/3<width)////
   { if(Mat[i/2][j/3]==1)
      cout<<'X';
      if(Mat[i/2][j/3]==-1)
      cout<<'O';
      if(Mat[i/2][j/3]==0)
     cout<<' ';
   }
    }
    cout<<endl;
    }
}///////////////////////////////////////////
void Chess::Set(int l,int w)
{ length=l;
width=w;
cnumber=0;
pnumber=0;
Initchess(l,w);
}
void Chess::Checkwin(int flag)
{ for(int i=0;i<length;i++)
   for(int j=0;j<width;j++)
   { if((j+4<width)&&Mat[i][j]==flag&&Mat[i][j+1]==flag&&Mat[i][j+2]==flag&&Mat[i][j+3]==flag&&Mat[i][j+4]==flag)
   { if(flag==-1)
   { cout<<"O(∩_∩)O哈哈~,你输了,继续努力吧!"<<endl;Flag=1;return;}
     if(flag==1)
{ cout<<"恭喜,你赢了!"<<endl;Flag=1;return;}
   }
     if((i+4<length)&&Mat[i][j]==flag&&Mat[i+1][j]==flag&&Mat[i+2][j]==flag&&Mat[i+3][j]==flag&&Mat[i+4][j]==flag)
     { if(flag==-1)
{    cout<<"O(∩_∩)O哈哈~,你输了,继续努力吧!"<<endl;Flag=1;return;}
        if(flag==1)
   { cout<<"恭喜,你赢了!"<<endl;Flag=1;return;}
   }
     if((i+4<length)&&(j-4>=0)&&Mat[i][j]==flag&&Mat[i+1][j-1]==flag&&Mat[i+2][j-2]==flag&&Mat[i+3][j-3]==flag&&Mat[i+4][j-4]==flag)
      { if(flag==-1)
{ cout<<"O(∩_∩)O哈哈~,你输了,继续努力吧!"<<endl;Flag=1;return;}
        if(flag==1)
   { cout<<"恭喜,你赢了!"<<endl;Flag=1;return;}
     }
if((i+4<length)&&(j+4<width)&&Mat[i][j]==flag&&Mat[i+1][j+1]==flag&&Mat[i+2][j+2]==flag&&Mat[i+3][j+3]==flag&&Mat[i+4][j+4]==flag)
      { if(flag==-1)
{ cout<<"O(∩_∩)O哈哈~,你输了,继续努力吧!"<<endl;Flag=1;return;}
        if(flag==1)
   { cout<<"恭喜,你赢了!"<<endl;Flag=1;return;}
}
    if((cnumber+pnumber)>=length*width)
   { cout<<"两方平局~//(≧▽≦)/~啦啦啦!"<<endl;Flag=1;return; }
   }
}
void Chess::Computermove(void)
{ Temp Tc,Tp;
int i,j;
for(i=0;i<length;i++)
   for(j=0;j<width;j++)
    if(Mat[i][j]==cwin)
     Findplace(i,j,Tc,cwin);
     else if(Mat[i][j]==pwin)
    Findplace(i,j,Tp,pwin);
if(Tc.Getnum()<Tp.Getnum()&&Tp.Getnum()>=3)
   Tc.Set(Tp);
Mat[Tc.Getx()][Tc.Gety()]=cwin;
cnumber++;
Printwindow();
Checkwin(cwin);
}
void Chess::Playermove(void)
{ int x,y;
int flag=1;
while(flag)
{  
   cout<<"请输入落子位置:(如:5   5)/n位置=";
      if(scanf("%d %d",&x,&y)!=2)
   { fflush(stdin);
     Printwindow();
     continue;
   }
   x--;
   y--;
     if(x>=0&&y>=0&&x<length&&y<width&&Mat[x][y]==0)
{ Mat[x][y]=pwin;
    break;
}
     Printwindow();
cout<<"此位置 "<<++x<<' '<<++y<<" 不能下子,请重新下子!"<<' ';
}
pnumber++;
Printwindow();
Checkwin(pwin);
}
void Chess::Findplace(int x,int y,Temp &T, int flag)
{ int i,j,num,x1,y1,cflag=-1,pflag=1,space;
if(flag==1)////如果flag为1,则查找对方最大的子数目
{ cflag=1;
    pflag=-1;
}
{/////////////////////////////////////// 第一个方向 右方
for(j=0,num=0,space=0;j<5;j++)
{ if((y+j)<width&&Mat[x][y+j]==pflag)
     break;
    if((y+j)<width&&Mat[x][y+j]==cflag)
num++;
if((y+j)<width&&Mat[x][y+j-1]==cflag&&Mat[x][y+j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x;
     y1=y+j;
     space=1;
   num++;
      }
   if((y+j+1)<width&&Mat[x][y+j+1]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////////
{ /////////////////////////第二个方向 右上方
for(i=0,j=0,num=0,space=0;i<5;i++,j++)
{ if((x-i)>=0&&(y+j)<width&&Mat[x-i][y+j]==pflag)
     break;
    if((x-i)>=0&&(y+j)<width&&Mat[x-i][y+j]==cflag)
     num++;
if((x-i)>=0&&(y+j)<width&&Mat[x-i+1][y+j-1]==cflag&&Mat[x-i][y+j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x-i;
     y1=y+j;
   space=1;
   num++;
   }
   if((x-i-1)>=0&&(y+j+1)<width&&Mat[x-i-1][y+j+1]==0)
    break;
}
   }
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////  
{///////////////////第三个方向 上方
for(i=0,num=0,space=0;i<5;i++)
{ if((x-i)>=0&&Mat[x-i][y]==pflag)
     break;
    if((x-i)>=0&&Mat[x-i][y]==cflag)
num++;
if((x-i)>=0&&Mat[x-i+1][y]==cflag&&Mat[x-i][y]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x-i;
     y1=y;
   space=1;
   num++;
   }
   if((x-i-1)>=0&&Mat[x-i-1][y]==0)
    break;
}
   }
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
} /////////////////
{ /////////////////////////第四个方向 左上方
for(i=0,j=0,num=0,space=0;i<5;i++,j++)
{ if((x-i)>=0&&(y-j)>=0&&Mat[x-i][y-j]==pflag)
     break;
    if((x-i)>=0&&(y-j)>=0&&Mat[x-i][y-j]==cflag)
num++;
if((x-i)>=0&&(y-j)>=0&&Mat[x-i+1][y-j+1]==cflag&&Mat[x-i][y-j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x-i;
     y1=y-j;
   space=1;
   num++;
   }
   if((x-i-1)>=0&&(y-j-1)>=0&&Mat[x-i-1][y-j-1]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////
{/////////////////////////////第五个方向 左方
for(j=0,num=0,space=0;j<5;j++)
{ if((y-j)>=0&&Mat[x][y-j]==pflag)
     break;
    if((y-j)>=0&&Mat[x][y-j]==cflag)
num++;
if((y-j)>=0&&Mat[x][y-j+1]==cflag&&Mat[x][y-j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x;
     y1=y-j;
   space=1;
   num++;
   }
   if((y-j-1)>=0&&Mat[x][y-j-1]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////////
{ /////////////////////////第六个方向 左下方
for(i=0,j=0,num=0,space=0;i<5;i++,j++)
{ if((x+i)<length&&(y-j)>=0&&Mat[x+i][y-j]==pflag)
     break;
    if((x+i)<length&&(y-j)>=0&&Mat[x+i][y-j]==cflag)
num++;
if((x+i)<length&&(y-j)>=0&&Mat[x+i-1][y-j+1]==cflag&&Mat[x+i][y-j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x+i;
     y1=y-j;
   space=1;
   num++;
   }
   if((x+i+1)<length&&(y-j-1)>=0&&Mat[x+i+1][y-j-1]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////
{///////////////////第七个方向 下方
for(i=0,num=0,space=0;i<5;i++)
{ if((x+i)<length&&Mat[x+i][y]==pflag)
     break;
    if((x+i)<length&&Mat[x+i][y]==cflag)
num++;
if((x+i)<length&&Mat[x+i-1][y]==cflag&&Mat[x+i][y]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x+i;
     y1=y;
   space=1;
   num++;
   }
   if((x+i+1)<length&&Mat[x+i+1][y]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
} /////////////////
{ /////////////////////////第八个方向 右下方
for(i=0,j=0,num=0,space=0;i<5;i++,j++)
{ if((x+i)<length&&(y+j)<width&&Mat[x+i][y+j]==pflag)
     break;
    if((x+i)<length&&(y+j)<width&&Mat[x+i][y+j]==cflag)
num++;
if((x+i)<length&&(y+j)<width&&Mat[x+i-1][y+j-1]==cflag&&Mat[x+i][y+j]==0)
{ if(space==1)
    { num++; break;}
   if(space==0)
   { x1=x+i;
     y1=y+j;
   space=1;
   num++;
   }
   if((x+i+1)<length&&(y+j+1)<width&&Mat[x+i][y+j]==0)
    break;
}
}
if(x1>=0&&y1>=0&&num>T.Getnum())
   T.Set(x1,y1,num);
}////////////////////
}
int main(void)
{ clock_t start;
int flag=0;
   const int cwin=-1,pwin=1;
    Chess C(10,18);
start=clock();
C.Printwindow();
while(1)
{
   C.Playermove();
   flag=C.Getflag();
   if(flag==1)
   break;
   C.Computermove();
   flag=C.Getflag();
   if(flag==1)
   break;
}
cout<<"用时"<<((int)(clock()-start)/CLK_TCK)/60<<"分"<<((int)(clock()-start)/CLK_TCK)%60<<"秒"<<endl;
system("pause");
return 1;
}