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