---
# System prepended metadata

title: OOXX遊戲

---

# OOXX遊戲

## 原始版本  
### 1.0  
```cpp=
#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int t=0,fin=0;
    int a[5][5]={};
    char w[3];
    cout<<"歡迎遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>w[1];
    while(w[1]!='O' && w[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>w[1];
    }
    if(w[1]=='O')
        w[2]='X';
    if(w[1]=='X')
        w[2]='O';
    
    while(fin==0){
        int r,i,j;
        
       
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<w[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<w[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 

        cout<<"輪到"<<w[t%2+1]<<"，請輸入要填入的位置代碼";
        cin>>r;
        while(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
            cout<<"該位置不存在，請重新輸入";
            cin>>r;
        }
        i=r/10;
        j=r%10;
        while(a[i][j]!=0){
            cout<<"該位置已使用，請重新輸入";
            cin>>r;
            i=r/10;
            j=r%10;
        }
        a[i][j]=t%2+1;

        for(i=1 ; i<=3 ; i++){
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=t%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=t%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=t%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=t%2+1;
        }
        
        int tie=0;
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    tie=1;
                
            }
        }
        if(tie==0 && fin==0){
            fin=3;
        }
        
        t++;        
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<w[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<w[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<w[fin]<<"獲勝"<<endl;
    }    
    return 0;
}
```

### 1.1  
1. 修正輸入錯誤值的漏洞  
```cpp=
#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int t=0,fin=0,ok=0;
    int a[5][5]={};
    char w[3];
    cout<<"歡迎遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>w[1];
    while(w[1]!='O' && w[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>w[1];
    }
    if(w[1]=='O')
        w[2]='X';
    if(w[1]=='X')
        w[2]='O';
    
    while(fin==0){
        int r,i,j;
        
       
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<w[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<w[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 

        cout<<"輪到"<<w[t%2+1]<<"，請輸入要填入的位置代碼";
        cin>>r;
        do{
			i=r/10;
        	j=r%10;	
        	if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
				ok=1;
				cout<<"該位置不存在，請重新輸入";
            	cin>>r;
			}
        	
        	else if(a[i][j]!=0){
        		ok=1;
        		cout<<"該位置已使用，請重新輸入";
            	cin>>r;
			}	
			else{
				ok=0;
			}
		}while(ok==1);
        
        a[i][j]=t%2+1;

        for(i=1 ; i<=3 ; i++){
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=t%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=t%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=t%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=t%2+1;
        }
        
        ok=0;
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;
                
            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }
        
        t++;        
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<w[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<w[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<w[fin]<<"獲勝"<<endl;
    }    
    return 0;
}
```
### 1.2  
1. 修復最後九宮格輸出排版問題  
2. 修改變數名稱，增加修改便利性  

```cpp=
#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int turn=0,fin=0,ok=0;
    int a[5][5]={};
    char word[3];
    //輸入先手
    cout<<"歡迎遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>word[1];
    while(word[1]!='O' && word[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>word[1];
    }
    if(word[1]=='O')
        word[2]='X';
    if(word[1]=='X')
        word[2]='O';
    
    while(fin==0){  //主迴圈開始
        int input,i,j;
              
        for (i=1 ; i<=3 ; i++){ //輸出九宮格
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<word[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<word[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 

        cout<<"輪到"<<word[turn%2+1]<<"，請輸入要填入的位置代碼";  //輸入位置代碼
        cin>>input;
        do{
			i=input/10;
        	j=input%10;	
        	if(input!=11 && input!=12 && input!=13 && input!=21 && input!=22 && input!=23 && input!=31 && input!=32 && input!=33){
				ok=1;
				cout<<"該位置不存在，請重新輸入";
            	cin>>input;
			}
        	
        	else if(a[i][j]!=0){
        		ok=1;
        		cout<<"該位置已使用，請重新輸入";
            	cin>>input;
			}	
			else{
				ok=0;
			}
		}while(ok==1);
        
        a[i][j]=turn%2+1;

        for(i=1 ; i<=3 ; i++){  //判斷勝負
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=turn%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=turn%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=turn%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=turn%2+1;
        }
        
        ok=0;  //判斷平局
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;
                
            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }
        
        turn++;        
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<word[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<word[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<word[fin]<<"獲勝"<<endl;
    }    
    return 0;
}
```
## 斥赤AI版  
### 2.0  

```cpp=
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(){
srand(time(NULL));
    int turn=0,fin=0,ok=0;
    int a[5][5]={};
    char w[3];
    
    cout<<"遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>w[1];
    while(w[1]!='O' && w[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>w[1];
    }
    if(w[1]=='O')
        w[2]='X';
    if(w[1]=='X')
        w[2]='O';
    
    while(fin==0){
        int r,i,j;
        r+=10*(rand()%4+1);
       
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<w[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<w[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 

        cout<<"輪到"<<w[turn%2+1]<<"，請輸入要填入的位置代碼"<<endl;
        if(turn%2+1!=1)
		{
			int repeat=0;
			r+=rand()%3+1;
		i=r/10;
        	j=r%10;	
			while(repeat==0)
			{
			
	    
		
		 if(a[i][j]!=0){
        		ok=0;
            	r=rand()%3+1+10*(rand()%3)+10;		
		       i=r/10;
        	j=r%10;	
		
			}
			else repeat=1;
			}
			
			}
			
		if(turn%2+1==1)
		{
		
		cin>>r;
        do{
			i=r/10;
        	j=r%10;	
        	if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
				ok=1;
				cout<<"該位置不存在，請重新輸入";
            	cin>>r;
			}
        	
        	else if(a[i][j]!=0){
        		ok=1;
        		cout<<"該位置已使用，請重新輸入";
            	cin>>r;
			}	
			else{
				ok=0;
			}
		}while(ok==1);
        }
        a[i][j]=turn%2+1;

        for(i=1 ; i<=3 ; i++){
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=turn%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=turn%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=turn%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=turn%2+1;
        }
        
        ok=0;
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;
                
            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }
        
        turn++;        
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<w[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<w[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<w[fin]<<"獲勝"<<endl;
    }    
    return 0;}
```

### 2.1  
```cpp=
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(){
srand(time(NULL));
    int turn=0,fin=0,ok=0;
    int a[5][5]={};
    char w[3];

    cout<<"歡迎遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>w[1];
    while(w[1]!='O' && w[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>w[1];
    }
    if(w[1]=='O')
        w[2]='X';
    if(w[1]=='X')
        w[2]='O';

    while(fin==0){
        int r,i,j;
        r+=10*(rand()%3+1);
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<w[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<w[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        }

        cout<<"輪到"<<w[turn%2+1]<<"，請輸入要填入的位置代碼"<<endl;
        if(turn%2+1!=1)
		{
			int repeat=0;

			while(repeat==0)
			{
            if(a[i][j]!=0){
                ok=0;
                r=rand()%3+1+10*(rand()%3)+10;
                i=r/10;
                j=r%10;	}
            else if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33)
            {
                ok=0;
                r=rand()%3+1+10*(rand()%3)+10;
                i=r/10;
                j=r%10;
            }
            else{
                i=r/10;
                j=r%10;

                repeat=1;}
			}
			cout<<r<<endl;
		}

		if(turn%2+1==1)
		{
            cin>>r;
            do{
                i=r/10;
                j=r%10;
                if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
                    ok=1;
                    cout<<"該位置不存在，請重新輸入";
                    cin>>r;
                }

                else if(a[i][j]!=0){
                    ok=1;
                    cout<<"該位置已使用，請重新輸入";
                    cin>>r;
                }
                else{
                    ok=0;
                }
            }while(ok==1);
        }
        a[i][j]=turn%2+1;

        for(i=1 ; i<=3 ; i++){
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=turn%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=turn%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=turn%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=turn%2+1;
        }

        ok=0;
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;

            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }

        turn++;
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<w[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<w[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl;
    }
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<w[fin]<<"獲勝"<<endl;
    }
    return 0;
}
```
### 2.2  
```c=
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(){
srand(time(NULL));
    int turn=0,fin=0,ok=0;
    int a[5][5]={};
    char w[3];
    
    cout<<"遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>w[1];
    while(w[1]!='O' && w[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>w[1];
    }
    if(w[1]=='O')
        w[2]='X';
    if(w[1]=='X')
        w[2]='O';
    
    while(fin==0){
        int r,i,j;
       
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<w[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<w[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 
        cout<<"輪到"<<w[turn%2+1]<<"，請輸入要填入的位置代碼"<<endl;
        if(turn%2+1!=1){
			int repeat=0,b[5][5]={},ok=0;
			r=0;						
			for(i=1;i<=3;i++){
                for(j=1;j<=3;j++){
                    b[i][j]=a[i][j];
                }
			}
			for(i=1;i<=3;i++){			
                for(j=1;j<=3;j++){
                    if(b[i][j]=0){   
                        for(i=1 ; i<=3 ; i++){
                            if(b[i][1]==b[i][2] && b[i][2]==b[i][3] && b[i][1]!=0){
                                r=i*10+j;repeat=1; i=r/10;
                                j=r%10;
                            }
                            else if(b[1][i]==b[2][i] && b[2][i]==b[3][i] && b[1][i]!=0){
                                r=i*10+j; repeat=1;i=r/10;
                                j=r%10;                       
                            }
                        }
                        if(b[1][1]==b[2][2] && b[2][2]==b[3][3] && b[1][1]!=0){
                            r=i*10+j; repeat=1;i=r/10;
                            j=r%10;
                        }
                        else if(b[1][3]==b[2][2] && b[2][2]==b[3][1] && b[3][1]!=0){
                            r=i*10+j; repeat=1;i=r/10;
                            j=r%10;
                        }
                    }
                    
                }
		    }
            if(a[2][2]==0){
                r=22;i=2;j=2;
                repeat=1;
            }
                            
            while(repeat==0){
                
                if(a[i][j]!=0){
                    ok=0; 		
                    r=rand()%3+1+10*(rand()%3)+10;		
                    i=r/10;
                    j=r%10;	
                }
                else if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
                    ok=0;
                    r=rand()%3+1+10*(rand()%3)+10;		
                    i=r/10;
                    j=r%10;	
                }
                else{
                    i=r/10;
                    j=r%10;               
                    repeat=1;
                }
            }
			cout<<r<<endl;
		}
			
		if(turn%2+1==1){
            cin>>r;
            do{
                i=r/10;
                j=r%10;	
                if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
                    ok=1;
                    cout<<"該位置不存在，請重新輸入";
                    cin>>r;
                }
                
                else if(a[i][j]!=0){
                    ok=1;
                    cout<<"該位置已使用，請重新輸入";
                    cin>>r;
                }	
                else{
                    ok=0;
                }
            }while(ok==1);
        }
        a[i][j]=turn%2+1;

        for(i=1 ; i<=3 ; i++){
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=turn%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=turn%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=turn%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=turn%2+1;
        }
        
        ok=0;
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;     
            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }       
        turn++;        
    }
    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<w[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<w[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<w[fin]<<"獲勝"<<endl;
    }    
    return 0;
}
```

## 育德AI版  
### 3.0  
```c=
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;
char hand,AI;
int r,F,S,i,j,win=0,step=1;
char table[3][3]={};

void Table(){
    for (i=0 ; i<=2 ; i++){
        for(j=0 ; j<=2 ;j++){
            if(table[i][j]==0)
				cout<<setw(3)<<(i+1)*10+j+1;
			else
				cout<<setw(3)<<table[i][j];
        }
        cout<<endl<<endl;
    }
}

void input(){
	cout<<"輪到你"<<"，請輸入要填入的位置代碼";
	cin>>r;
	F=(r-10)/10;
    S=(r-1)%10;
   while(1){
		if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
        	cout<<"該位置不存在，請重新輸入";
       		cin>>r;
		}
		else if(table[F][S]!=0){
            cout<<"該位置已使用，請重新輸入";
            cin>>r;
            F=(r-10)/10;
    		S=(r-1)%10;
        }
    	else{
    		F=(r-10)/10;
    		S=(r-1)%10;
    		table[F][S]=hand;
			break;
		}
	}
}

int result(char who){
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[i][j]==who){
				win++;
			}
			if(win==3){
				return win;
				break;
			}
		}
		win=0;
	}
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[j][i]==who){
				win++;
			}
			if(win==3){
				return win;
				break;
			}
		}
		win=0;
	}
	if((table[0][0]==table[1][1]&&table[0][0]==table[2][2]&&table[0][0]!=0) || (table[0][2]==table[1][1]&&table[0][2]==table[2][0]&&table[0][2]!=0)){
		win=3;
	}
	return win;	
}

void Think(){
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[i][j]==hand){
				win++;
			}
			if(win==2){
				if(table[i][0]==table[i][1]&&table[i][2]==0){
					r=10*i+10+3;
					break;
				} 
				else if(table[i][1]==table[i][2]&&table[i][0]==0){ 
					r=10*i+10+1;
					break;
				} 
				else if(table[i][0]==table[i][2]&&table[i][1]==0){ 
					r=10*i+10+2;
					break;
				}
			}
		}
		win=0;
	}
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[j][i]==hand){
				win++;
			}
			if(win==2){
				if(table[0][i]==table[1][i]&&table[2][i]==0){
					r=30+i+1;
					break;
				} 
				else if(table[1][i]==table[2][i]&&table[0][i]==0){ 
					r=10+i+1;
					break;
				} 
				else if(table[0][i]==table[2][i]&&table[1][i]==0){ 
					r=20+i+1;
					break;
				}
			}
		}
		win=0;
	}
	if(table[0][0]==table[1][1]&&table[2][2]==0)
		r=33;
	else if(table[0][0]==table[2][2]&&table[1][1]==0)
		r=22;
	else if(table[1][1]==table[2][2]&&table[0][0]==0)
		r=11;
	else if(table[0][2]==table[1][1]&&table[2][0]==0)
		r=31;
	else if(table[2][0]==table[1][1]&&table[0][2]==0)
		r=13;
	else if(table[0][2]==table[2][0]&&table[1][1]==0)
		r=22;
}

void Ain(){
		cout<<"輪到電腦"<<"，請輸入要填入的位置代碼";
		F=(r-10)/10;
    	S=(r-1)%10;
		while(table[F][S]!=0){
			r=rand()%3+1+(rand()%3)*10+10;
			F=(r-10)/10;
    		S=(r-1)%10;
		}
		cout<<r<<endl;
		table[F][S]=AI;
}
int main(){
	srand(time(NULL));
	cout<<"歡迎遊玩OOXX遊戲\n請輸入O或X(請輸入大寫)"<<endl;
	cin>>hand;
	while(hand!='O' && hand!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>hand;
    }
 	if(hand=='O')
       AI='X';
    else
    	AI='O';
    Table();
    if(hand=='O'){
    	step=1;
    	input();
	}
	else{
		step=2;
		cout<<"輪到電腦"<<"，請輸入要填入的位置代碼";
		r=22;
		cout<<r<<endl;
		F=(r-10)/10;
    	S=(r-1)%10;
		table[F][S]=AI;
	}
	Table();
	if(step==1){
		for(int k=1;k<=4;k++){
		
		Think();
		Ain();
		Table();
		result(AI);
		if(win==3){
				cout<<"你輸了，電腦獲勝"<<endl;
				break;
			}
		input();
		Table();
		result(hand);
		if(win==3){
				cout<<"你贏了!"<<endl;
				break;
			}
		}
	}
	else if(step==2){
		for(int k=1;k<=4;k++){
			input();
			Table();
			result(hand);
			if(win==3){
				cout<<"你贏了!"<<endl;
				break;
			}
			Think();
			Ain();
			Table();
			result(AI);
			if(win==3){
				cout<<"你輸了，電腦獲勝"<<endl;
				break;
			}
		}
	}
}

```
## 結合版  
### 4.0  
終於能選擇單雙人了  

```cpp=
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;
int mod;
char hand,AI;
int r,F,S,i,j,win=0,step=1;
char table[3][3]={};

void Table(){
    for (i=0 ; i<=2 ; i++){
        for(j=0 ; j<=2 ;j++){
            if(table[i][j]==0)
				cout<<setw(3)<<(i+1)*10+j+1;
			else
				cout<<setw(3)<<table[i][j];
        }
            cout<<endl<<endl;
    }
}

void input(){
	cout<<"輪到你"<<"，請輸入要填入的位置代碼";
	cin>>r;
	F=(r-10)/10;
    S=(r-1)%10;
   while(1){
		if(r!=11 && r!=12 && r!=13 && r!=21 && r!=22 && r!=23 && r!=31 && r!=32 && r!=33){
        	cout<<"該位置不存在，請重新輸入";
       		cin>>r;
		}
		else if(table[F][S]!=0){
            cout<<"該位置已使用，請重新輸入";
            cin>>r;
            F=(r-10)/10;
    		S=(r-1)%10;
        }
    	else{
    		F=(r-10)/10;
    		S=(r-1)%10;
    		table[F][S]=hand;
			break;
		}
	}
}

int result(char who){
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[i][j]==who){
				win++;
			}
			if(win==3){
				return win;
				break;
			}
		}
		win=0;
	}
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[j][i]==who){
				win++;
			}
			if(win==3){
				return win;
				break;
			}
		}
		win=0;
	}
	if((table[0][0]==table[1][1]&&table[0][0]==table[2][2]&&table[0][0]!=0) || (table[0][2]==table[1][1]&&table[0][2]==table[2][0]&&table[0][2]!=0)){
		win=3;
	}
	return win;	
}

void Think(){
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[i][j]==hand){
				win++;
			}
			if(win==2){
				if(table[i][0]==table[i][1]&&table[i][2]==0){
					r=10*i+10+3;
					break;
				} 
				else if(table[i][1]==table[i][2]&&table[i][0]==0){ 
					r=10*i+10+1;
					break;
				} 
				else if(table[i][0]==table[i][2]&&table[i][1]==0){ 
					r=10*i+10+2;
					break;
				}
			}
		}
		win=0;
	}
	for(i=0;i<=2;i++){
		for(j=0;j<=2;j++){
			if(table[j][i]==hand){
				win++;
			}
			if(win==2){
				if(table[0][i]==table[1][i]&&table[2][i]==0){
					r=30+i+1;
					break;
				} 
				else if(table[1][i]==table[2][i]&&table[0][i]==0){ 
					r=10+i+1;
					break;
				} 
				else if(table[0][i]==table[2][i]&&table[1][i]==0){ 
					r=20+i+1;
					break;
				}
			}
		}
		win=0;
	}
	if(table[0][0]==table[1][1]&&table[2][2]==0)
		r=33;
	else if(table[0][0]==table[2][2]&&table[1][1]==0)
		r=22;
	else if(table[1][1]==table[2][2]&&table[0][0]==0)
		r=11;
	else if(table[0][2]==table[1][1]&&table[2][0]==0)
		r=31;
	else if(table[2][0]==table[1][1]&&table[0][2]==0)
		r=13;
	else if(table[0][2]==table[2][0]&&table[1][1]==0)
		r=22;
}

void Ain(){
		cout<<"輪到電腦"<<"，請輸入要填入的位置代碼";
		F=(r-10)/10;
    	S=(r-1)%10;
		while(table[F][S]!=0){
			r=rand()%3+1+(rand()%3)*10+10;
			F=(r-10)/10;
    		S=(r-1)%10;
		}
		cout<<r<<endl;
		table[F][S]=AI;
}
int main(){
	cout<<"單人遊戲按 1"<<endl<<"雙人遊戲按 2"<<endl; 
	cin>>mod;
	while(mod!=1&&mod!=2){
		cout<<"錯誤請重新輸入";
		cin>>mod; 
	}
	if(mod==1){
	srand(time(NULL));
	cout<<"歡迎遊玩OOXX遊戲\n請輸入O或X(請輸入大寫)"<<endl;
	cin>>hand;
	while(hand!='O' && hand!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>hand;
    }
 	if(hand=='O')
       AI='X';
    else
    	AI='O';
    Table();
    if(hand=='O'){
    	step=1;
    	input();
	}
	else{
		step=2;
		cout<<"輪到電腦"<<"，請輸入要填入的位置代碼";
		r=22;
		cout<<r<<endl;
		F=(r-10)/10;
    	S=(r-1)%10;
		table[F][S]=AI;
	}
	Table();
	if(step==1){
		for(int k=1;k<=4;k++){
		
		Think();
		Ain();
		Table();
		result(AI);
		if(win==3){
				cout<<"AI Win!"<<endl;
				break;
			}
		input();
		Table();
		result(hand);
		if(win==3){
				cout<<"You Win!"<<endl;
				break;
			}
		}
	}
	else if(step==2){
		for(int k=1;k<=4;k++){
			input();
			Table();
			result(hand);
			if(win==3){
				cout<<"You Win!"<<endl;
				break;
			}
			Think();
			Ain();
			Table();
			result(AI);
			if(win==3){
				cout<<"AI Win!"<<endl;
				break;
			}
		}
	}
	if(win!=3)
		cout<<"平局"<<endl; 
		
}
	else if(mod==2){
	
    int turn=0,fin=0,ok=0;
    int a[5][5]={};
    char word[3];
    //輸入先手
    cout<<"歡迎遊玩OOXX遊戲\n請輸入先手為O或X(請輸入大寫)"<<endl;
    cin>>word[1];
    while(word[1]!='O' && word[1]!='X'){
        cout<<"非O或X，請重新輸入";
        cin>>word[1];
    }
    if(word[1]=='O')
        word[2]='X';
    if(word[1]=='X')
        word[2]='O';
    
    while(fin==0){  //主迴圈開始
        int input,i,j;
              
        for (i=1 ; i<=3 ; i++){ //輸出九宮格
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==1)
                    cout<<setw(3)<<word[1];
                else if(a[i][j]==2)
                    cout<<setw(3)<<word[2];
                else
                    cout<<setw(3)<<i*10+j;
            }
            cout<<endl<<endl;
        } 

        cout<<"輪到"<<word[turn%2+1]<<"，請輸入要填入的位置代碼";  //輸入位置代碼
        cin>>input;
        do{
			i=input/10;
        	j=input%10;	
        	if(input!=11 && input!=12 && input!=13 && input!=21 && input!=22 && input!=23 && input!=31 && input!=32 && input!=33){
				ok=1;
				cout<<"該位置不存在，請重新輸入";
            	cin>>input;
			}
        	
        	else if(a[i][j]!=0){
        		ok=1;
        		cout<<"該位置已使用，請重新輸入";
            	cin>>input;
			}	
			else{
				ok=0;
			}
		}while(ok==1);
        
        a[i][j]=turn%2+1;

        for(i=1 ; i<=3 ; i++){  //判斷勝負
            if(a[i][1]==a[i][2] && a[i][2]==a[i][3] && a[i][1]!=0){
                fin=turn%2+1;
            }
            if(a[1][i]==a[2][i] && a[2][i]==a[3][i] && a[1][i]!=0){
                fin=turn%2+1;
            }
        }
        if(a[1][1]==a[2][2] && a[2][2]==a[3][3] && a[1][1]!=0){
            fin=turn%2+1;
        }
        if(a[1][3]==a[2][2] && a[2][2]==a[3][1] && a[3][1]!=0){
            fin=turn%2+1;
        }
        
        ok=0;  //判斷平局
        for (i=1 ; i<=3 ; i++){
            for(j=1 ; j<=3 ;j++){
                if (a[i][j]==0)
                    ok=1;
                
            }
        }
        if(ok==0 && fin==0){
            fin=3;
        }
        
        turn++;        
    }

    for (int i=1 ; i<=3 ; i++){
        for(int j=1 ; j<=3 ;j++){
            if (a[i][j]==1)
                cout<<setw(3)<<word[1];
            else if(a[i][j]==2)
                 cout<<setw(3)<<word[2];
            else
                cout<<setw(3)<<i*10+j;
        }
         cout<<endl<<endl;
    } 
    if(fin==3){
        cout<<"平局"<<endl;
    }
    else{
        cout<<"恭喜"<<word[fin]<<"獲勝"<<endl;
    }    
    return 0;
	}
}
``` 
  
### 4.1  
敬請其待，功能不變，優化版本  

---

## 連結  
[點此前往github連結](https://github.com/dumbledore96/OOXX.git)  
有問題請反白並留言，或至github/issue反應  

---

## 版本
2021/12/4 創建  
2022/1/6 修改版本代碼  

| 版本 | 發布日期 | 製作者 |
| ---- | -------- | ------ |
| 1.0  | 2021/12/5 | 承希 |
| 1.1  | 2021/12/5 | 承希 |
| 1.2  | 2021/12/6 | 承希 |
| 2.0  | 2021/12/5 | 斥赤 |
| 2.1  | 2021/12/5 | 斥赤 |
| 2.2  | 2021/12/6 | 斥赤 |
| 3.0  | 2021/12/9 | 育德 |
| 4.0  | 2021/12/24 | 育德 |


**power by XiDerYu team**  