unity3D IMGUI井字棋

目标

使用IMGUI构建UI,做一个井字棋游戏。IMGUI文档

目的:
1. 提升 debug 能力
2. 提升阅读 API 文档能力

结果

这里写图片描述

核心设计

GUI.Button(new Rect(x, y, width, height), “Something you want to show in Button”);
该函数用于创建一个button,点击button,该函数返回true,可用于if语句中的检测条件,判断button是否被点击。


GUI.Label(new Rect(x, y, width, height), “Something you want to show in Button”);
与GUI.Button不同的是,该函数是不具有交互性的,只生成用于显示某些内容的label,该label无法点击。


turn用来记录玩家的回合,为1的时候是玩家1的回合,2的时候是玩家2的回合;
grid数组用于记录3X3格子的状态,值为1的时候认为被格子被玩家1点击,2的时候被玩家2点击,0的时候还没有被点击过。

private int turn = 1;
private int[,] grid = new int[3, 3];



通过start函数调用restart函数,进行数组初始化

// 重新开始游戏
  void Start () {
       Restart();
  }
  void Restart(){
        turn = 1;
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                grid[i, j] = 0;
            }
        }
   }



GUI.skin.button.fontSize用来设置所有button中的字体大小
style则用来设置label中字体大小与字体颜色

//设置button中字体的大小
GUI.skin.button.fontSize = 20; 
//设置label中字体大小和颜色
GUIStyle style = new GUIStyle();
style.fontSize = 40;
style.normal.textColor = new Color(255, 255, 255);



if语句判断restart按钮是否被点击,被点击时,调用restart函数,重置格子状态
GUI.Button()在指定位置上生成一个具有Restart字体内容的button

//判断是否点击Restart按钮
if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){
  Restart();
}



result用于记录judge函数返回的值,judge函数用于判断当前游戏是否有游戏玩家胜利,或者游戏结束却没有玩家取得胜利。

//判断游戏是否结束
int result = judge();
if (result == 1)
{
    GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style);
}
else if (result == 2)
{
    GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style);
}else if (result == 3)
{
    GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style);
}
//judge函数
    int judge()
    {
        // 横向连线    
        for (int i = 0; i < 3; ++i)
        {
            if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2])
            {
                return grid[i, 0];
            }
        }
        //纵向连线    
        for (int j = 0; j < 3; ++j)
        {
            if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j])
            {
                return grid[0, j];
            }
        }
        //斜向连线    
        if (grid[1, 1] != 0 &&
            grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] ||
            grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0])
        {
            return grid[1, 1];
        }
        //全部格子都被点击
        bool allClick = true;
        for (int i=0; i<3; i++)
        {
            for (int j=0; j<3; j++)
            {
                if (grid[i, j] == 0)
                {
                    allClick = false;
                }
            }
        }
        if (allClick)
            return 3;
        return 0;
    }



循环中对每个格子的状态进行判断,当值为1时,button内容显示O;值为2时,显示X;值为0时,对格子进行赋值,以此确认别哪个玩家点击

//生成棋盘并判断格子是否被点击
        for (int i=0; i<3; i++)
        {
            for(int j=0; j<3; j++) {
                if (grid[i, j] == 1)
                {
                    GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O");
                }else if (grid[i, j] == 2)
                {
                    GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X");
                }else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0)
                {
                    if (turn == 1)
                    {
                        grid[i, j] = 1;
                    }else
                    {
                        grid[i, j] = 2;
                    }
                    turn = -turn;
                }
            }
        }

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chess : MonoBehaviour {

    private int turn = 1;
    private int[,] grid = new int[3, 3];

    // 重新开始游戏
    void Start () {
        Restart();
    }

    void Restart()
    {
        turn = 1;
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                grid[i, j] = 0;
            }
        }
    }

    void OnGUI()
    {
        //设置button中字体的大小
        GUI.skin.button.fontSize = 20; 

        //设置label中字体大小和颜色
        GUIStyle style = new GUIStyle();
        style.fontSize = 40;
        style.normal.textColor = new Color(255, 255, 255);

        //判断是否点击Restart按钮
        if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){
            Restart();
        }

        //判断游戏是否结束
        int result = judge();
        if (result == 1)
        {
            GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style);
        }
        else if (result == 2)
        {
            GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style);
        }else if (result == 3)
        {
            GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style);
        }

        //生成棋盘并判断格子是否被点击
        for (int i=0; i<3; i++)
        {
            for(int j=0; j<3; j++) {
                if (grid[i, j] == 1)
                {
                    GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O");
                }else if (grid[i, j] == 2)
                {
                    GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X");
                }else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0)
                {
                    if (turn == 1)
                    {
                        grid[i, j] = 1;
                    }else
                    {
                        grid[i, j] = 2;
                    }
                    turn = -turn;
                }
            }
        }
    }

    int judge()
    {
        // 横向连线    
        for (int i = 0; i < 3; ++i)
        {
            if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2])
            {
                return grid[i, 0];
            }
        }
        //纵向连线    
        for (int j = 0; j < 3; ++j)
        {
            if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j])
            {
                return grid[0, j];
            }
        }
        //斜向连线    
        if (grid[1, 1] != 0 &&
            grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] ||
            grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0])
        {
            return grid[1, 1];
        }
        //全部格子都被点击
        bool allClick = true;
        for (int i=0; i<3; i++)
        {
            for (int j=0; j<3; j++)
            {
                if (grid[i, j] == 0)
                {
                    allClick = false;
                }
            }
        }
        if (allClick)
            return 3;

        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36184359/article/details/79688097