作者在 2011-10-29 18:18:50 发布以下内容
#include <iostream.h>
#include <stdlib.h>
#include <stdlib.h>
/*
三子连珠游戏
该程序是三子连珠游戏,棋盘为3X3,3个棋子连起来即为赢。输入参数时,若输入的数字超出边界或在已有棋子的地方再输入,则提示出错,要求重新输入。
改进要求:
1、将程序改写成类
2、将棋盘扩充为4X4
3、统计输赢结果并打印输出
4、选做:使游戏更生动。
*/
void PrintBoard(); //打印棋盘
void PrintInof(); //输出游戏提示信息
void PrintStats(int,int,int); //输出统计的胜负信息
void IfError(int&,int&); //判断输入时候有错
void ChoiceOfChar(char&); //询问用户是否再玩一盘
void ProapLTurnO(int&,int&); //选择“O”的玩家下棋(先走)
void ProapLTurnX(int&,int&); //选择“X”的玩家下棋(后走)
char board[4][4]; //棋盘
void Guize();//打印菜单总体情况,说明游戏规则和方法,无返回值
void Dayinqp();//打印棋盘,无返回值
void xiaqi(char*,int&,int &,char);//下棋,无返回值
int Huosheng(int,int,char);//是否再玩,无返回值
void Choice(char &);//重设棋盘,无返回值
void Chongzhi();
class CGobang
{
char board[4][4];
public:
void Guize();
void Dayinqp();
void Xiaqi(char*,int &,int &,char);
int Huosheng(int,int,char);
void Choice(char &);
void Chongzhi();
}
void CGobang::Xiaqi(char*player1,int & x,int & y,char c)
{
cout<<"该"<<player1<<"下棋了,请输入"<<endl;
cout<<"你的棋子所在行:";
cin>>x;
cout<<" "<<" "<<" "<<"棋子所在列:";
cin>>y;
while (x>4||y>4||x<1||' '!=board[x-1][y-1])//输入数字超过边界或在已有的棋子地方再输入
{
cout<<"对不起,你输入的有误,请重新输入!"<<endl;
cout<<"你的棋子所在行:";
cin>>x;
cout<<" "<<" "<<" "<<" 棋子所在列:";
cin>>y;
}
board[x-1][y-1]=c;//在x行,y列处下O成x
}
void main()//主函数
{
CGobang s; //定义一个类对象s
s.Guize(); //通过已定义的类的对象s调用Guize函数,提示玩家如何进行游戏
char player1[20],player2[20]; //定义两个玩家的姓名变量,分别用两量付初值,以待计算赢的结果
char choice='Y';
int FirstWin=0,SecondWin=0,Draws=0,x,y,N;
cin.ignore (20,'\n'); //输入输流,前面如果有输入把输入行所有字符取空,以便后面的输入从新的一行开始
cout<<"请输入第一个玩家姓名:";
cin.getline(player1,20); //连续读取数据,实现对玩家一命名
cout<<"请输入第二个玩家姓名:";
cin.getline(player2,20); //连续读取数据,实现对玩家二命名
while(choice=='Y'||choice=='y') //条件成立,开始下棋
{
s.Chongzhi(); //通过对象s调用Chongzhi函数
int N=0; //对变量付初值,表示已经下在棋盘上的棋子总数
while(N<=16) //在棋盘未满的条件下下棋
{
s.Dayinqp(); //打印棋盘
s.Xiaqi(player1,x,y,'0'); //调用下棋运行的函数
N++;//记录已下棋子数
if(s.Huosheng(x-1,y-1,'0'))//返回值不为0则条件成立
{
cout<<player1<<"赢了。"<<endl;
FirstWin++;
break;
}
s.Dayinqp();
s.Xiaqi(player2,x,y,'X');
N++;
if(s.Huosheng(x-1,y-1,'X'))
{
cout<<player2<<"赢了。"<<endl;
SecondWin++;
break;
}
if(N==16)
{
cout<<"和棋!";
Draws++;
break;
}
}
s.Choice(choice);//让玩家选择是否再玩一次
}
//输出游戏输赢次数
cout<<player1<<"赢了"<<FirstWin<<"次"<<endl;
cout<<player2<<"赢了"<<SecondWin<<"次"<<endl;
cout<<"和"<<Draws<<"次"<<endl;
cout<<"谢谢使用"<<endl;
cout<<"任意键继续"<<endl;
}
void CGobang::Chongzhi()//重置棋盘函数
{
for(int Row=0;Row<4;Row++)
for(int Column=0;Column<4;Column++)
board[Row][Column]=' ';
}
/*{
int FirstWin=0,SecondWin=0,Drass=0,x,y,N;
cout<<player1<<"赢了"<<FirstWin<<"次"<<endl;
cout<<player2<<"赢了"<<SecondWin<<"次"<<endl;
cout<<"谢谢使用。" <<endl;
cout<<"任意键继续"<<endl;
}*/
void PrintBoard()
{
cout << endl;
cout << " 1 2 3 4" << endl;
cout << "1 " << board[0][0] << " | " << board[0][1]<<" | "<< board[0][2]<< " | "<< board[0][3]<<endl;
cout << " ---|---|---" << endl;
cout << "2 " << board[1][0]<< " | " << board[1][1]<< " | " << board[1][2]<<" | "<< board[1][3]<< endl;
cout << " ---|---|---" << endl;
cout << "3 " << board[2][0]<< " | " << board[2][1]<< " | " << board[2][2]<<" | "<< board[2][3]<< endl;
cout << " ---|---|---" << endl;
cout << "4 " << board[3][0]<< " | " << board[3][1]<< " | " << board[3][2]<<" | "<< board[3][3]<< endl;
cout << endl;
cout << endl;
}
int CGobang::Huosheng(int x,int y,char c)
{
int count,a;
//从左斜上方判断是否构成胜利条件
for(a=0,count=0;(x-a>=0)&&(y-a>=0)&&(board[x-a][y-a]==c);a++)
if(++count==3)
return 1;
//从右斜下方判断是否构成胜利条件
for(a=1;(x+a<4)&&(y+a<4)&&(board[x+a][y+a]==c);a++)
if(++count==3)
return 1;
//从上向下方判断是否构成胜利条件
for(a=0,count=0;(x-a>=0)&&(board[x-a][y]==c);a++)
if(++count==3)
return 1;
//从下向上方判断是否构成胜利条件
for(a=1;(x+a<4)&&(board[x+a][y]==c);a++)
if(++count==3)
return 1;
//从左至右方判断是否构成胜利条件
for(a=0,count=0;(y-a>=0)&&(board[x][y-a]==c);a++)
if(++count==3)
return 1;
//从右至左方判断是否构成胜利条件
for(a=1;(x+a<4)&&(board[x][y+a]==c);a++)
if(++count==3)
return 1;
//从右斜上方判断是否构成胜利条件
for(a=0,count=0;(x-a>=0)&&(y+a<4)&&(board[x-a][y+a]==c);a++)
if(++count==3)
return 1;
//从左斜下方判断是否构成胜利条件
for(a=1;(x+a<4)&&(y-a>=0)&&(board[x+a][y-a]==c);a++)
if(++count==3)
return 1;
return 0;
}