学习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,这样就解决了平局问题