HW2:基于Unity3D的井字棋游戏实现

作业要求
游戏内容:五子棋游戏、井字棋游戏或自己拟定主题(需要有创意)
技术限制:仅使用IMGUI构建UI


作业目的
了解 OnGUI() 事件,提升 debug 能力
提升阅读 API 文档能力


需求分析

棋盘大小为3x3
任意一格子只能有一个棋子
两位玩家(“叉”和“圈”)交替下棋,每次能且只能下一枚棋子
当出现:三个同种棋子连成一线时,判定此方获胜,游戏结束

游戏实现
下文分两步介绍游戏实现过程:制作UI和代码化表示游戏规则。

(一)制作UI
先选取合适的位置,合适的大小画出棋盘:

    int w=Screen.width/2;           
    GUI.Box(new Rect(w-150,50,300,400),"井字棋");

再画出目前的游戏状态,比如play(游戏中),O win(玩家1胜利)等:

    GUI.Box(new Rect(w-50,80,100,35),"Play!");

然后画出重置按钮,便于重新开始游戏:

    if(GUI.Button(new Rect(w-50,415,100,35),"Reset")) 
    reset();

最后用border来表示各个位置的值,画出棋盘上的每个位置:

    private int[][] border=new int[3][]{new int[3],new int[3],new int[3]};
    for(int i=0;i<3;i++){            
        for(int j=0;j<3;j++){                
            if(border[i][j]==0){                    
            GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"O");                
            }else if(border[i][j]==1){
            GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"X");                
            }else{                    
                if(GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"")){                        
                    //空按钮被点击的操作
               }
            }
        }
   }

UI的简要设计就完成了。下面是第二部分:用代码实现井字棋的逻辑。

(二)规则代码化
我们发现:主要的操作分为两部分,第一部分为点击空按钮是发生的事件,第二部分为点击reset按钮是发生的事件。

点击reset只需要重置所有变量即可,因此把重点放在实现空按钮点击即可。

空按钮点击时发生的事件:

判断当前游戏是否已经分出胜负,若分出胜负则不做任何操作:
    private int end=0;
    if(点击空按钮){
        if(end==1) break;
    }

改变当前位置的值为当前玩家所代表的值:

    private int player=0;
    if(点击空按钮){
    border[i][j]=player;
    }
判断这步之后是否分出胜负:

    private int res=-1;
    if(点击空按钮){
        if(border[0][j]==border[1][j] && border[0][j]==border[2][j]) 
             res=player;                        
        else if(border[i][0]==border[i][1] && border[i][0]==border[i][2]) 
             res=player;                        
        else if(i==j && border[0][0]==border[1][1] && border[0][0]==border[2][2]) 
             res=player;                        
        else if(i+j==2 && border[0][2]==border[1][1] && border[0][2]==border[2][0]) 
             res=player;
    }
使用res来标记当前游戏的状态,-1代表游戏正在进行,而0或者1代表决出胜负。
四行if:
    第一行if用来判断同一列是否连成线;
    第二行if用来判断同一行是否连成线;
    第三四两行if用来判断对角线是否连成线。

判断是否平局:

     private int cnt=0;
     if(点击空按钮){
         cnt++;
         if(res!=-1 && cnt==9) res=2;
         if(res!=-1) end=1;
     }
使用变量cnt来表示已经点击过的空按钮数量,假如达到9而且未分出胜负,则平局。
res为2代表平局。
如果res不为-1,则代表游戏已经结束,改变end。

根据胜负改变"Play!"位置的值:

void printRes(int res){        
     int w=Screen.width/2;        
     if(res==0){            
         GUI.Box(new Rect(w-50,80,100,35),"O win!");
     }else if(res==1){            
         GUI.Box(new Rect(w-50,80,100,35),"X win!");       
     }else if(res==2){           
          GUI.Box(new Rect(w-50,80,100,35),"Draw!");        
     }else{            
          GUI.Box(new Rect(w-50,80,100,35),"Play!");        
     }    
 }
点击reset按钮发生的事件:

void reset(){
     player=0;        
     cnt=0;        
     end=0;        
     res=-1;        
     for(int i=0;i<3;i++){            
         for(int j=0;j<3;j++){                
              border[i][j]=-1;            
          }       
     }        
}

猜你喜欢

转载自blog.csdn.net/weixin_40552127/article/details/128161139