/*
 井字遊戲
*/

#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;
}


執行結果:

init.jpg 

初始畫面

lose.jpg 

電腦勝

same.jpg 

雙方平手

win.jpg 

玩家勝


寫得蠻不好的小遊戲 XD

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

下次要來修一修才行

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

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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 flyinsky76 的頭像
    flyinsky76

    Deja Vu

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