Unity3D学习——基于IMGUI的井字棋

GitHub:https://github.com/kotomineshiki/unityhomework1.git

之前使用过NGUI来进行游戏开发,这次尝试一下GUI。

井字棋规则如下
  1. 棋盘大小为3*3,对战双方只能在这个范围内、按次序轮流下棋
  2. 先手的棋的形状是O 后手的棋的形状是X
  3. 先将自己的棋子连成一条直线(横、竖、斜都可以)的一方获胜


那么我们的思路很明显了
  1. 采用一个二维数组作为存储结构,每个单元初始状态为0,被先手下了变为1,被后手下了变为2
  2. 检测当前状态,如果分为:先手赢、后手赢、输赢待定、平局四个状态
  3. 对于先、后手赢、平局状态应该输出,并有restart按钮可以重新开始
  4. 先后手赢需要检查3行、3列、2斜来判定。
  5. 平局状态应该用一个计数器来判定,每下一个子++,但它值为9的时候还没有输赢,那么就是平局了
  6. 输赢待定时,先渲染当前的棋盘,然后如果当前为空的棋盘被点击,则在该处下子、接着轮到对手下。

1:存储结构
    public int turn;//次序,表示轮流下棋
    public int count;//累计数量,防止平局
    private int[,] cells = new int[3, 3];//用来储存九个格子


2:判断当前状态

    private int winCheck()
    {
        for(int i = 0; i < 3; ++i)
        {
            if (cells[i, 0] != 0 && cells[i,0]==cells[i, 1] && cells[i, 1] == cells[i, 2])
            {
                return cells[i, 0];
            }
        }
        for (int i = 0; i < 3; ++i)
        {
            if (cells[0, i] != 0 && cells[0, i] == cells[1, i] && cells[1, i] == cells[2, i])
            {
                return cells[0, i];
            }
        }
        if(cells[1,1]!=0&&
            cells[0,0]==cells[1,1]&&
            cells[1,1]==cells[2,2]||
            cells[0,2]==cells[1,1]&&
            cells[1,1]==cells[2,0]
            )
        {
            return cells[1, 1];
        }
        if (count == 9) return 3;
        return 0;
    }

3:输出结果

        switch (result)
        {
            case 1:
                GUI.Label(new Rect(500, 100, 100, 50), "O WIN", style: temp);//先手赢;
                break;
            case 2:
                GUI.Label(new Rect(500, 100, 100, 50), "X WIN", style: temp);//后手胜
                break;
            case 3:
                GUI.Label(new Rect(500, 100, 100, 50), "DUAL", style: temp);//平局
                break;
        }

4:渲染棋盘、下子
        for (int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                if (cells[i, j] == 1)
                {
                    GUI.Button(new Rect(i * 50, j * 50, 50, 50), "0");
                }
                if (cells[i, j] == 2)
                {
                    GUI.Button(new Rect(i * 50, j * 50, 50, 50), "X");
                }
                if(GUI.Button(new Rect(i * 50, j * 50, 50, 50), ""))
                {
                    if (result == 0)
                    {
                        if (turn == 1) cells[i, j] = 1;
                        else cells[i, j] = 2;
                        count++;
                        turn = -turn;
                    }
                }
            }
        }
    }

完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class sharp : MonoBehaviour {
    public int turn;//次序,表示轮流下棋
    public int count;//累计数量,防止平局
    private int[,] cells = new int[3, 3];//用来储存九个格子
	// Use this for initialization
	void Start () {
        restart();
	}
    void restart()
    {
        turn = 1;
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                cells[i, j] = 0;
            }
        }
        count = 0;
    }
    private int winCheck()
    {
        for(int i = 0; i < 3; ++i)
        {
            if (cells[i, 0] != 0 && cells[i,0]==cells[i, 1] && cells[i, 1] == cells[i, 2])
            {
                return cells[i, 0];
            }
        }
        for (int i = 0; i < 3; ++i)
        {
            if (cells[0, i] != 0 && cells[0, i] == cells[1, i] && cells[1, i] == cells[2, i])
            {
                return cells[0, i];
            }
        }
        if(cells[1,1]!=0&&
            cells[0,0]==cells[1,1]&&
            cells[1,1]==cells[2,2]||
            cells[0,2]==cells[1,1]&&
            cells[1,1]==cells[2,0]
            )
        {
            return cells[1, 1];
        }
        if (count == 9) return 3;
        return 0;
    }
    private void OnGUI()
    {
        if(GUI.Button(new Rect(20, 300, 100, 50),"restart"))
        {
            restart();
        }
        int result = winCheck();//

        GUIStyle temp = new GUIStyle
        {
            fontSize = 20
        };
        temp.normal.textColor = Color.red;
        temp.fontStyle = FontStyle.BoldAndItalic;

        switch (result)
        {
            case 1:
                GUI.Label(new Rect(500, 100, 100, 50), "O WIN", style: temp);//先手赢;
                break;
            case 2:
                GUI.Label(new Rect(500, 100, 100, 50), "X WIN", style: temp);//后手胜
                break;
            case 3:
                GUI.Label(new Rect(500, 100, 100, 50), "DUAL", style: temp);//平局
                break;
        }

        for (int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                if (cells[i, j] == 1)
                {
                    GUI.Button(new Rect(i * 50, j * 50, 50, 50), "0");
                }
                if (cells[i, j] == 2)
                {
                    GUI.Button(new Rect(i * 50, j * 50, 50, 50), "X");
                }
                if(GUI.Button(new Rect(i * 50, j * 50, 50, 50), ""))
                {
                    if (result == 0)
                    {
                        if (turn == 1) cells[i, j] = 1;
                        else cells[i, j] = 2;
                        count++;
                        turn = -turn;
                    }
                }
            }
        }
    }
    // Update is called once per frame
    void Update () {
		
	}
}


你可能感兴趣的:(unity)