Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2338031
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:09:16

#include
#include
using namespace std;
class CGobang//棋子类
{
private:
char chSort;//棋子的类别
int nWin;//赢棋的次数
int nLose;//输棋的次数
static int nDraw;//平局的次数
static char achBoard[9][9];//棋盘
static int nSize;//棋盘的尺寸nSize*nSize
public:
CGobang(char chsort)
{
chSort=chsort;
nWin=nLose=nDraw=0;
}
void PlayTurn(void);//走1步棋
int Judge();//判断是否连成一线,是则返回1,否则返回0
void Win(void);//赢棋
void Lose(void);//输棋
static void Draw(void);//平局
void PrintInfo(void);//输出总体情况
static void PrintBoard(void);//输出棋盘
static int GetFull(void);//判断棋盘是否已布满棋子
static void InitialBoard(void);//初始化棋盘
};
char CGobang::achBoard[9][9];
int CGobang::nSize=9;
int CGobang::nDraw=0;
void CGobang::Draw()
{
cout<<"\n\n\t\t平局!\n\n";
nDraw++;
}
void CGobang::InitialBoard()//初始化棋盘
{
cout<<"输入你想要的棋盘的尺寸(3~9):";
do
{
cin>>nSize;//棋盘的尺寸
if(nSize>9||nSize<3)
cout< else
break;
}while(1);
for(int i=0;i for(int j=0;j achBoard[i][j]=' ';
}
void CGobang::PrintBoard()//输出棋盘
{
for(int i=1;i<=nSize;i++)
cout<<" "< cout< for(i=0;i {
cout< for(int j=0;j cout< cout< cout<<" -";
for(j=2;j<=nSize;j++)
cout<<"|-";
cout< }



}
int CGobang::GetFull()//判断棋盘是否布满棋子,若是则返回1
{
for(int i=0;i for(int j=0;j if(achBoard[i][j]!=' ')
return 0;
return 1;
}
void CGobang::Win()//赢棋
{
cout<<"\n\n\t\t"< nWin++;
}
void CGobang::Lose()//输棋
{
nLose++;
}
void CGobang::PlayTurn(void)//走1步棋
{
int nRow,nCol;
cout<<"现在该"< do
{
cin>>nRow>>nCol;//输入坐标
if(nRow>nSize||nCol>nSize||nRow<1||nCol<1)//判断坐标越界
cout<<"输入的坐标界,x与y的范围应在1至"< else if(achBoard[nRow-1][nCol-1]!=' ')//判断坐标合理
cout<<"棋盘处已有棋子,请重新输入\n";
else
{
achBoard[nRow-1][nCol-1]=chSort;//在坐标处放上棋子
break;
}
}while(1);
}
int CGobang::Judge()
{//以下是各种可能连成一线的情况
for(int i=0;i for(int j=0;j {
if(achBoard[i][j]==chSort && achBoard[i+1][j+1]==chSort && achBoard[i+2][j+2]==chSort)
return 1;
else if(achBoard[i][j]==chSort && achBoard[i][j+1]==chSort && achBoard[i][j+2]==chSort)
return 1;
else if(achBoard[i][j]==chSort && achBoard[i-1][j+1]==chSort && achBoard[i-2][j+2]==chSort)
return 1;
else if(achBoard[i][j]==chSort && achBoard[i+1][j]==chSort && achBoard[i+2][j]==chSort)
return 1;
}
return 0;//没有连成一线则返回0
}
void CGobang::PrintInfo(void)//打印总体情况
{
cout<<"Side"< }
void PrintRule(void)//打印规则
{
cout<<"\t\t欢迎使用三子连珠游戏!"< cout<<"\t游戏规则:"< cout<<"\t1.每1步输入要下棋子的格子的x,y坐标,按Enter键\n";
cout<<"\t2.有1方首先3个棋子迦成一线即判获胜\n";
cout<<"\t3.当棋子布满棋盘但仍无获胜方即为平局\n";
cout<<"\t4.x方为先行方\n";
cout<<"\n\n\t\t请按任意键开始下棋!\n\n";
}
int JudgePlay(CGobang &SideX,CGobang &SideO)//每下1步棋要进行输赢的判断,有结果则返回1
{
if(SideX.Judge())//X方获胜
{
SideX.Win();
SideO.Lose();
return 1;
}
else if(SideO.Judge())//O方获胜
{
SideO.Win();
SideX.Lose();
return 1;
}
else
return 0;
}
void Play(CGobang &SideX,CGobang &SideO)//开始一局游戏
{
while(1)
{
CGobang::PrintBoard();//输出棋盘
SideX.PlayTurn();//X方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break;
if(CGobang::GetFull())//判断是否平局
{
CGobang::Draw();
break;
}
CGobang::PrintBoard();//输出棋盘
SideO.PlayTurn();//O方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break;
if(CGobang::GetFull())//判断是否平局
{
CGobang::Draw();
break;
}
}
}
二楼继续:

--------------------next---------------------

阅读(1540) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~