/*
 井字遊戲
*/

#include<iostream>
#include<iomanip>
#include<ctime>

using namespace std;

#define size 3

struct Node
{
 int value;
 int who;
};

void DrawRule()
{
 int k = 1;

 for(int i = 0;i<size;i++)
 {
  for(int j = 0;j<size;j++)
  {
   cout<<k;
   k++;
   if( j < size-1 )
    cout<<" | ";
  }
  if( i < size-1 )
   cout<<endl<<"------------"<<endl;
 }
 cout<<endl;
}

void Init( Node array[size][size] )
{
 for(int i = 0;i<size;i++)
 {
  for(int j = 0;j<size;j++)
  {
   array[i][j].value = 0;
   array[i][j].who = 0;
  }
 }
}

void Check(Node array[size][size],int x,int y,int &count,int num)
{
 if( array[x][y].value == 1 || array[x][y].value == 2 )
 {
  count--;
  cout<<endl<<"此位置已被佔據"<<endl;
 }
 else
 {
  if( num == 1)
   array[x][y].value = 1;
  else
   array[x][y].value = 2;

  array[x][y].who = 1;
 }
}


void Draw(Node array[size][size],int num,int coordinate,int &count)
{
 cout<<endl;
 if( num == 1 )
 {
  switch(coordinate)
  {
   case 1:
    Check(array,0,0,count,num);
    break;
   case 2:
    Check(array,0,1,count,num);
    break;
   case 3:
    Check(array,0,2,count,num);
    break;
   case 4:
    Check(array,1,0,count,num);
    break;
   case 5:
    Check(array,1,1,count,num);
    break;
   case 6:
    Check(array,1,2,count,num);
    break;
   case 7:
    Check(array,2,0,count,num);
    break;
   case 8:
    Check(array,2,1,count,num);
    break;
   case 9:
    Check(array,2,2,count,num);
    break;
   default:
    cout<<"Error Input!!"<<endl;
  }
 }
 else
 {
  switch(coordinate)
  {
   case 1:
    Check(array,0,0,count,num);
    break;
   case 2:
    Check(array,0,1,count,num);
    break;
   case 3:
    Check(array,0,2,count,num);
    break;
   case 4:
    Check(array,1,0,count,num);
    break;
   case 5:
    Check(array,1,1,count,num);
    break;
   case 6:
    Check(array,1,2,count,num);
    break;
   case 7:
    Check(array,2,0,count,num);
    break;
   case 8:
    Check(array,2,1,count,num);
    break;
   case 9:
    Check(array,2,2,count,num);
    break;
   default:
    cout<<"Error Input!!"<<endl;
  }
  
 }

 for(int i = 0;i<size;i++)
 {
  for(int j = 0;j<size;j++)
  {
   if( array[i][j].value == 1 )
    cout<<" O ";
   else if( array[i][j].value == 2 )
    cout<<" X ";
   else
    cout<<"   ";

   if( j < size-1 )
    cout<<" | ";
  }
  if( i < size-1 )
   cout<<endl<<"----------------"<<endl;
 }
 cout<<endl;
}

bool ComputerCheck(Node array[size][size],int x,int y)
{

 if( array[x][y].value == 1 || array[x][y].value == 2 )
 {
  return true;
 }
 else
  return false;

}

void ComputerDraw(Node array[size][size])
{
 for(int i = 0;i<size;i++)
 {
  for(int j = 0;j<size;j++)
  {
   if( array[i][j].value == 1 )
    cout<<" O ";
   else if( array[i][j].value == 2 )
    cout<<" X ";
   else
    cout<<"   ";

   if( j < size-1 )
    cout<<" | ";
  }
  if( i < size-1 )
   cout<<endl<<"----------------"<<endl;
 }

 cout<<endl;
}

void Computer(Node array[size][size],int num,int coordinate)
{
 srand(time(0));

 if( num == 1 )
 {
  switch(coordinate)
  {
   case 1:
    if( ComputerCheck(array,0,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][0].value = 1;
     array[0][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 2:
    if( ComputerCheck(array,0,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][1].value = 1;
     array[0][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 3:
    if( ComputerCheck(array,0,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][2].value = 1;
     array[0][2].who = 2;
     ComputerDraw(array);
    }
    break;
   case 4:
    if( ComputerCheck(array,1,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][0].value = 1;
     array[1][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 5:
    if( ComputerCheck(array,1,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][1].value = 1;
     array[1][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 6:
    if( ComputerCheck(array,1,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][2].value = 1;
     array[1][2].who = 2;
     ComputerDraw(array);
    }
    break;
   case 7:
    if( ComputerCheck(array,2,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][0].value = 1;
     array[2][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 8:
    if( ComputerCheck(array,2,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][1].value = 1;
     array[2][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 9:
    if( ComputerCheck(array,2,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][2].value = 1;
     array[2][2].who = 2;
     ComputerDraw(array);
    }
    break;
   default:
    cout<<"Error Input!!"<<endl;
  }
 }
 else
 {
  switch(coordinate)
  {
   case 1:
    if( ComputerCheck(array,0,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][0].value = 2;
     array[0][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 2:
    if( ComputerCheck(array,0,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][1].value = 2;
     array[0][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 3:
    if( ComputerCheck(array,0,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[0][2].value = 2;
     array[0][2].who = 2;
     ComputerDraw(array);
    }
    break;
   case 4:
    if( ComputerCheck(array,1,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][0].value = 2;
     array[1][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 5:
    if( ComputerCheck(array,1,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][1].value = 2;
     array[1][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 6:
    if( ComputerCheck(array,1,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[1][2].value = 2;
     array[1][2].who = 2;
     ComputerDraw(array);
    }
    break;
   case 7:
    if( ComputerCheck(array,2,0) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][0].value = 2;
     array[2][0].who = 2;
     ComputerDraw(array);
    }
    break;
   case 8:
    if( ComputerCheck(array,2,1) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][1].value = 2;
     array[2][1].who = 2;
     ComputerDraw(array);
    }
    break;
   case 9:
    if( ComputerCheck(array,2,2) )
    {
     coordinate++;
     if( coordinate > 9 )
      coordinate = 1;
     Computer(array,num,coordinate);
    }
    else
    {
     array[2][2].value = 2;
     array[2][2].who = 2;
     ComputerDraw(array);
    }
    break;
   default:
    cout<<"Error Input!!"<<endl;
  }
  
 }

}

bool CheckRow(Node array[size][size],int &win)
{
 for(int i = 0;i<size;i++)
 {
  if( array[i][0].who == array[i][1].who && array[i][2].who == array[i][0].who && array[i][2].who == array[i][1].who )
  {
   win = array[i][0].who;

   if( win != 0 )
    return true;
   else
    return false;
  }
 }

 return false; 
}

bool CheckColumn(Node array[size][size],int &win)
{
 for(int i = 0;i<size;i++)
 {
  if( array[0][i].who == array[1][i].who && array[0][i].who == array[2][i].who && array[1][i].who==array[2][i].who )
  {
   win = array[0][i].who;

   if( win != 0 )
    return true;
   else
    return false;
  }
 }

 return false;
}

bool CheckDialog(Node array[size][size],int &win)
{
 
 if( array[0][0].who == array[1][1].who && array[0][0].who == array[2][2].who && array[1][1].who == array[2][2].who ) //此部分不可直接寫3個等式 EX: A=B=C 這樣只要 A=B or A=C or B=C 皆會符合條件
 {
  win = array[1][1].who;
  if( win != 0 )
   return true;
  else
   return false;
 }

 if( array[0][2].who == array[1][1].who && array[0][2].who == array[2][0].who && array[1][1].who == array[2][0].who )
 {
  win = array[1][1].who;
  if( win != 0 )
   return true;
  else
   return false;
 }
 else
  return false;
}

void Print(int win)
{
 if( win == 1 )
  cout<<endl<<endl<<"Congratulations. You are the Winner!!"<<endl;
 else if( win == 0 )
  cout<<endl<<endl<<"雙方平手"<<endl;
 else
  cout<<endl<<endl<<"Computer is the Winner."<<endl;
}


void Play(Node array[size][size],int num)
{
 srand(time(0));
 int coordinate,count = 0,end = (size*size)/2,win = 0;

 while(true)
 {
  cout<<endl<<"請輸入想下的位置(1~9): ";
  cin>>coordinate;
  Draw(array,num,coordinate,count);

  if( CheckRow(array,win) )
   break;
  else if ( CheckColumn(array,win) )
   break;
  else if ( CheckDialog(array,win) )
   break;
  
  if( count == end )
   break;

  cout<<endl<<"=====Computer====="<<endl;
  coordinate = rand() % 9 + 1;
  if( num == 1 )
  {
   Computer(array,2,coordinate);
  }
  else
   Computer(array,1,coordinate);

  if( CheckRow(array,win) )
   break;
  else if ( CheckColumn(array,win) )
   break;
  else if ( CheckDialog(array,win) )
   break;

  count++;
 }
 
 Print(win);
 cout<<endl;


}

int main()
{
 Node array[size][size];
 int num;

 cout<<"Welcome to play Tick Tack Toe: "<<endl;
 cout<<"======================================="<<endl<<endl;
 cout<<"請選擇 O or X (1:O 2:X): ";
 cin>>num;

 Init(array);
 DrawRule();
 Play(array,num);

 system("PAUSE");
 
 return 0;
}


執行結果:

 

初始畫面

 

電腦勝

 

雙方平手

 

玩家勝


寫得蠻不好的小遊戲 XD

也沒有AI 而且還寫死...

下次要來修一修才行

便當狗不知道為啥現在進不去

下次再上傳給大家玩玩 (如果會有人想玩 XD)

文章標籤
全站熱搜
創作者介紹
創作者 flyinsky76 的頭像
flyinsky76

Deja Vu

flyinsky76 發表在 痞客邦 留言(0) 人氣(571)