每天写个程序,#字棋游戏,目前位置写得最大的程序了,高达230行!

#include<iostream>
using namespace std;
void check(int i,int j);           //检查每条直线上的各方棋子的数量
int other(int b,int c);
void check_win();                  //检查是否胜利
void begin(char ch);
void computer();                  //电脑下棋
void user();                      //用户下棋
int a[4][4],deep;
int line[3][3][2];                //全局变量,用来存放每条直线上的各方棋子数!
                                  //第一维下标表示是行列还是对角线,第二维下标表示第几条直线
                                  //第三维下标表示各方的棋子数!
void main()
{
  char ch;
  
  cout<<"欢迎与本机下#字棋!您的棋子将用#表示,电脑的棋子用X表示/n请选择先后手,输入u则您先手,输入c则电脑先手!(小写)/n"<<endl;
  
  do
  {  
      cin>>ch;
      if(ch!='u'&&ch!='c')  cout<<"您输入的数据不合法,请重新输入!"<<endl;
  }while(ch!='u'&&ch!='c');           //非法处理
  
  if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
  else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
  begin(ch);
}

void begin(char ch)
{
  int i,j,k;
  a[1][1]=1;
  cout<<"/n      1 | 2 | 3 /n     ——————/n      4 | 5 | 6 /n     ——————/n      7 | 8 | 9 /n"<<endl;
  for(i=1;i<4;i++)
      for(j=1;j<4;j++)
      {
        if(j==1)
        if(i==1);
        else     a [j]=a[3]+1;
        else     a[j]=a[j-1]+1;
      }                              //初始化棋盘
  for(i=0;i<3;i++)
      for(j=0;j<3;j++)
          for(k=0;k<3;k++)
              line[j][k]=0;
  deep=0;
  if(ch=='u') user();
  else computer();
}

void computer()
{
  int i,j,flag=0,m;                 //flag判断是否落子
  for(i=0;i<3;i++)
      for(j=0;j<3;j++)
      {    
             if (line[j][0]==2&&line[j][1]==0&&flag==0)
             {
                 m=other(i,j);
                 if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
                 else       {a[m/3+1][m%3]=40;    check(m/3+1,m%3);}          //40是#的ASCII码减48
                 flag=1;

             }                                                              //当某条直线上用户有两棋子而我方无棋子时,在该直线的另一点落子
             if (line[j][1]==2&&line[j][0]==0&&flag==0)
             {
                 m=other(i,j);
                 if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
                 else       {a[m/3+1][m%3]=40;    check(m/3+1,m%3);}            //当某条直线上我方有两棋子而对方无棋子时,在该直线的另一点落子
                 flag=1;
             }
             if (line[j][1]==1&&line[j][0]==0&&flag==0)
             {
                  m=other(i,j);
                 if(m%3==0) {a[m/3][3]=40;check(m/3,3);}
                 else       {a[m/3+1][m%3]=40;    check(m/3+1,m%3);}           //当某条直线上我方有一棋子而对方无棋子时,在该直线的另一点落子
                 flag=1;
             }
      }
              
  if(flag==0)
  if (a[2][2]==5)
  {
      a[2][2]=72;
      flag=1;
      check(2,2);
  }                                //优先下第5个位置
  else{
      for(i=2;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
      {
        if(i%3==0) {a[3]=40;check(i/3,3);}
        else       {a=40;    check(i/3+1,i%3);}
        flag=1;                  
      }                           //2,4,6,8其次
      for(i=1;i<9&&flag==0&&a[j]==(i-1)*3+j;i+=2)
      {
        if(i%3==0) {a[3]=40;check(i/3,3);}
        else       {a=40;    check(i/3+1,i%3);}
        flag=1;                  
      }                           //1,3,7,9再次
  }
  for(i=1;i<=3;i++)
  {
      cout<<"     ";
      for(j=1;j<=3;j++)
          cout<<" "<<char(a[j]+48)<<" |";
      cout<<"/n      ——————"<<endl;
  }
  deep++;
  if(flag==1) user();
  else check_win();
}

void user()
{
  int down;
  cout<<"/n轮到您下了,请输入您要下的棋子位置:"<<endl;
  
  do{
    cin>>down;
    if(down<1||down>9)  
        cout<<"数字不合法,请重新输入/n"<<endl;
    if ((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down))
        cout<<"您所输入的位置已经有棋子了,请重新输入/n"<<endl;
  }while(down<1||down>9||((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down)));
  //判断输入是否异常
  
  if(down%3==0) {a[down/3][3]=-13;  check(down/3,3);}
  else          {a[down/3+1][down%3]=-13;check(down/3+1,down%3);}   //-13是X的ASCII码减48
  deep++;
  computer();
}

int other(int b,int c)
{
  int i,m;
  if(b<2)
  {
     if (b==0)
     m=3*c+1;
     if (b==1)
     m=c+1;
     for(i=m;i<m+3;i++)
     {
         if(i%3==0)
             if(a[3]==i) return i;
             else;
         else if(a) return i;
     }
  }                                        //水平与垂直直线的情况
  if(b==2)
  {
    if(c==0)
    {
      if(a[1][1]==1) return 1;
      if(a[2][2]==5) return 5;
      if(a[3][3]==9) return 9;
    }
    if(c==1)
    {
      if(a[1][3]==3) return 3;
      if(a[2][2]==5) return 5;
      if(a[3][1]==7) return 7;
    }
  }                                      //对角线的情况
}

void check(int i,int j)
{    
  if(a[j]==-13)
  {
            
    line[0][0]++;
    line[1][j-1][0]++;
    if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))  
        line[2][0][0]++;
    if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))  
        line[2][1][0]++;
          
  }
  if(a[j]==40)
  {
            
    line[0][1]++;
    line[1][j-1][1]++;
    if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))  
        line[2][0][1]++;
    if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))  
        line[2][1][1]++;
  }
   check_win();
}

void check_win()
{
  int i,j,k;
  bool end=false;
  char ch;
  for(i=0;i<3;i++)
      for(j=0;j<3;j++)
          for(k=0;k<2;k++)
            if(line[j][k]==3)
            {
                if(k==1)    cout<<"您失败了,电脑获得了胜利"<<endl;
                if(k==0)    cout<<"恭喜您,您获得了胜利"<<endl;
                end=true;
            }
            if(deep>=9)  {cout<<"和棋!"<<endl;end=true;}
            if(end)
            {
                cout<<"/n您是否继续?是输入Y,按其余任意键结束本游戏!:"<<endl;
                cin>>ch;
                if(ch!='y') exit(0);
                else{
                cout<<"/n请选择先后手,输入U则您先手,输入C则电脑先手!/n"<<endl;
  
                do
                {
                  cin>>ch;
                  if(ch!='u'&&ch!='c')  cout<<"您输入的数据不合法,请重新输入!"<<endl;
                }while(ch!='u'&&ch!='c');           //非法处理
  
                if(ch=='u') cout<<"您选择了您先手!/n"<<endl;
                else if(ch=='c') cout<<"您选择了电脑先手/n"<<endl;
                begin(ch);
                }
            }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值