1

Unity3D 井字棋


今天第一次Unity实战,先用GUI写个井字棋的小游戏。先上成品图:
Unity井字棋

Github源代码及演示视频

首先创建c#脚本,添加GUI方法。此时考虑到要记录九宫格每个位置的状态以及此时是谁在点击,所以创建两个私有变量。

    private int count = 0;
    private int[,] map = new int[3, 3];

OnGUI函数在每帧被调用,每次调用OnGUI函数时,先调用Check()函数判断是否有胜利者,如果有就显示出胜利者的名称。然后再判断游戏是否和棋,如果前两种情况均未发生,再绘出主要游戏界面。

void OnGUI()
    {
        int winner = Check();
        if (winner == 1)
        {
            GUI.Label(new Rect(300, 350, 90, 50), "X wins!");
        }
        else if (winner == 2)
        {
            GUI.Label(new Rect(300, 350, 90, 50), "O wins!");
        }
        else if (count == 9)
        {
            GUI.Label(new Rect(280, 350, 100, 50), "Dead Game! Please Restart!");
        }
        else
        {
            for (int i = 0; i < 3; i += 1)
            {
                for (int j = 0; j < 3; j += 1)
                {
                    if (map[i, j] == 0)
                    {
                        if (GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), ""))
                        {
                            if (count%2 == 0) map[i, j] = 1;
                            else map[i, j] = 2;
                            count = count + 1;
                        }
                    }
                    if (map[i, j] == 1)
                    {
                        GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), "X");
                    }
                    if (map[i, j] == 2)
                    {
                        GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), "O");
                    }
                }
            }
        }
        if (GUI.Button(new Rect(275, 400, 100, 50), "Restart"))
        {
            reset();
        }
    }

Check()函数用于判断是否有胜利者,并返回代指胜利者的数字。

private int Check()
    {
        //横向连线
        for (int i = 0; i < 3; ++i)
        {
            if (map[i, 0] != 0 && map[i, 0] == map[i, 1] && map[i, 1] == map[i, 2])
            {
                return map[i, 0];
            }
        }
        //纵向连线  
        for (int j = 0; j < 3; ++j)
        {
            if (map[0, j] != 0 && map[0, j] == map[1, j] && map[1, j] == map[2, j])
            {
                return map[0, j];
            }
        }
        //斜向连线  
        if (map[1, 1] != 0 &&map[0, 0] == map[1, 1] && map[1, 1] == map[2, 2] ||map[0, 2] == map[1, 1] && map[1, 1] == map[2, 0])
        {
            return map[1, 1];
        }
        return 0;
    }

游戏开始时start()函数调用reset()函数进行初始化,以下是完整代码:

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

public class NewBehaviourScript : MonoBehaviour
{
    private int count = 0;
    private int[,] map = new int[3, 3];

    private void Start()
    {
        reset();
    }

    void OnGUI()
    {
        int winner = Check();
        if (winner == 1)
        {
            GUI.Label(new Rect(300, 350, 90, 50), "X wins!");
        }
        else if (winner == 2)
        {
            GUI.Label(new Rect(300, 350, 90, 50), "O wins!");
        }
        else if (count == 9)
        {
            GUI.Label(new Rect(280, 350, 100, 50), "Dead Game! Please Restart!");
        }
        else
        {
            for (int i = 0; i < 3; i += 1)
            {
                for (int j = 0; j < 3; j += 1)
                {
                    if (map[i, j] == 0)
                    {
                        if (GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), ""))
                        {
                            if (count%2 == 0) map[i, j] = 1;
                            else map[i, j] = 2;
                            count = count + 1;
                        }
                    }
                    if (map[i, j] == 1)
                    {
                        GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), "X");
                    }
                    if (map[i, j] == 2)
                    {
                        GUI.Button(new Rect(250 + i * 50, 250 + j * 50, 50, 50), "O");
                    }
                }
            }
        }
        if (GUI.Button(new Rect(275, 400, 100, 50), "Restart"))
        {
            reset();
        }
    }

    private void reset()
    {
        for (int i = 0; i < 3; i += 1)
        {
            for (int j = 0; j < 3; j += 1)
            {
                map[i, j] = 0;
            }
        }
        count = 0;
    }

    private int Check()
    {
        //横向连线
        for (int i = 0; i < 3; ++i)
        {
            if (map[i, 0] != 0 && map[i, 0] == map[i, 1] && map[i, 1] == map[i, 2])
            {
                return map[i, 0];
            }
        }
        //纵向连线  
        for (int j = 0; j < 3; ++j)
        {
            if (map[0, j] != 0 && map[0, j] == map[1, j] && map[1, j] == map[2, j])
            {
                return map[0, j];
            }
        }
        //斜向连线  
        if (map[1, 1] != 0 &&map[0, 0] == map[1, 1] && map[1, 1] == map[2, 2] ||map[0, 2] == map[1, 1] && map[1, 1] == map[2, 0])
        {
            return map[1, 1];
        }
        return 0;
    }
}

刘一
36 声望10 粉丝

« 上一篇
Unity3D - 1
下一篇 »
Unity3D - 2

引用和评论

1 篇内容引用
0 条评论