学习c++也有一段日子了,从毫无头绪到现在刚刚入门已经过去将近一年了。不知是学校老师太差还是自己不够积极,总觉得毫无长进!常在网上加些同样不想在学校仅仅是混个毕业的朋友,没事讨论讨论(身边大多都是想混混日子的)。
井字游戏其实原理相当简单,九个格子,不管横竖还对角线上的三个子全是一方的,这方九赢的game。
#include<iostream>
using namespace std;
class line{
private:
char box[9];
public:
int step,pps,temp; //标志量控制条件
int setline(){ //构造函数用于下棋过程中显示每个位置的数字,方便弈者选择
for(int i=0;i<9;++i)
box[i]=i+'1'; //将数字的ascii码放入数组,这样解决了char类型数组中放数字的矛盾
return(0);
}
int check(int);
int showTable();
int showChange();
int winLost();
int continueAbort();
};
//用于每次开盘时显示棋盘
int line::showTable(){
cout<<" *************"<<endl;
cout<<" | 1 | 2 | 3 |"<<endl;
cout<<" -------------"<<endl;
cout<<" | 4 | 5 | 6 |"<<endl;
cout<<" -------------"<<endl;
cout<<" | 7 | 8 | 9 |"<<endl;
cout<<" *************"<<endl;
return(0);
}
//每步棋盘上棋子的变化
int line::showChange(){
int num=0;
cin>>num;
--num;
while(box[num]=='a'||box[num]=='b'||num<0||num>8){
cout<<"\nThis number have been chosen!please take another one: ";
cin>>num;
--num;
}
if(step==1)box[num]='a';
else box[num]='b';
cout<<"\n *************"<<endl;
for(int i=0,j=0;j<3;++j){
cout<<" | "<<box[i]<<" | "<<box[i+1]<<" | "<<box[i+2]<<" |"<<endl;
i=i+3;
cout<<" *************"<<endl;}
winLost(); // 每次棋盘变化判断一下输赢
return(0);
}
//判断输赢条件
int line::check(int ch){
return((box[0]+box[1]+box[2]==ch||
box[0]+box[3]+box[6]==ch||
box[0]+box[4]+box[8]==ch||
box[3]+box[4]+box[5]==ch||
box[7]+box[8]+box[6]==ch||
box[2]+box[4]+box[6]==ch||
box[1]+box[4]+box[7]==ch||
box[2]+box[8]+box[5]==ch));
}
// 显示输赢结果,设置pps跳出单次下棋过程,即有一方赢了就结束该轮比赛
int line::winLost(){
if(check(3*'a')){
pps=1;
cout<<"player a win the game"<<endl;
}
else if(check(3*'b')){
pps=1;
cout<<"player b win the game"<<endl;
}
return(0);
}
// 再来一盘
int line::continueAbort(){
char pos;
cout<<"press c to continue_press anykey to abort"<<endl;
cin>>pos;
if(pos=='c'){
pps=0;
temp=0;
showTable();
setline();
return (1);
}
else return(0);
}
int main(){
line player;
player.setline();
cout<<"let us play the game"<<endl;
player.showTable();
do
{
for( int i=0;i<9;++i){
if(i%2==0){
player.step=1;
cout<<"\nplayer a,please choose the number you fit: ";
}
else{
player.step=0;
cout<<"\nplayer b,please choose the number you fit: ";
}
player.showChange();
if(player.pps==1)break;
player.temp=i;
}
if(player.temp==8){
cout<<"no one win the game!"<<endl;
break;
}
}while(player.continueAbort());
return (0);
}
修修补补终于完工,但总让我感觉很差劲:
1.能否减少函数
2.winLost( )能简化吗
3.能使所有变量step和pps放在私有里吗
4.showChange()内调用winLost()导致每下一个子显示no one win the game!
ps1:又改了一下,解决了第4个问题。不过又增加了一个标志量和一个函数!有必要减少函数吗?其他问题估计不能解决,除非重新写了。就算完成了吧!
ps2:鉴于评论添加了一些注释,原本打算自己学学而已,没想到还有人关注,颇有些惊喜
4月26日想做个人机对弈,发现了原来代码里平局有错误,遂将temp=9 改成8,这样就解决了平局问题