设计要求
- 游戏内容: 井字棋
- 技术限制: 仅允许使用 IMGUI 构建 UI
- 作业目的:
– 了解 OnGUI() 事件,提升 debug 能力
– 提升阅读 API 文档能力
项目配置
- 使用unity创建一个空物体
- 在空物体上挂在脚本
代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Game : MonoBehaviour
{
private int player=0;
private int cnt=0;
private int end=0;
private int res=-1;
private int[][] border=new int[3][]{new int[3],new int[3],new int[3]};
void Start(){
reset();
Debug.Log("game start!");
}
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;
}
}
Debug.Log("game reset!");
}
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),"Game Start!");
}
}
void OnGUI(){
int w=Screen.width/2;
GUI.Box(new Rect(w-150,50,300,400),"井字棋");
if(GUI.Button(new Rect(w-50,415,100,35),"Reset")) reset();
GUI.Label(new Rect(w-50,450,100,35),GUI.tooltip);
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),"")){
if(end==1) break;
border[i][j]=player;
cnt++;
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;
if(cnt==9 && res==-1) res=2;
if(res!=-1) end=1;
Debug.Log("res="+res);
Debug.Log("end="+end);
player=player^1;
}
}
}
}
printRes(res);
}
}
效果
- 游戏开始
- O玩家先行
- O玩家和X玩家交替行走
- O玩家胜
- X玩家胜
- 平局
- 初始化(reset)