/*
井字遊戲
*/
#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)