欢迎光临散文网 会员登陆 & 注册

Unity扫雷代码存档

2021-03-17 20:35 作者:剑士_尤吉欧  | 我要投稿


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;


public class Game_Mannage : MonoBehaviour

{

    //保存场景 雷 旗子 数字

    public List<GameObject> QiziObj;


    //位置 12*16 192--------------------------------

    public int[,] map_position_target; //map_position_target记录map状态  0表示空 1表示雷  2有数字

    public GameObject[] map_position_all;


    //遮罩数组 12*16 192----------------------------------------

    public GameObject[,] mask_all;

    public GameObject mask;


    //旗子-----------------------------------------------

    public GameObject QiZi;

    public int QiZi_num=0;//插旗数==雷的数量时判断输赢

    public int[,] Qizi_table;//1已插旗 


    //雷-------------------------------------

    public GameObject lei;

    public int lei_number = 0;

    //雷概率 10-0

    public int gailv = 3;


    //数字-----------------------

    public GameObject[] number;

    

    //鼠标射线点击----------------------

    private RaycastHit2D rayhit;

    private double timeval = 0;


    //游戏状态

    public bool gameover = false;

    public Text text_lei;

    public Text text_flag;

    public Text text_level;

    public GameObject winer;

    public GameObject loser;

    public GameObject gaming;


    // Start is called before the first frame update  初始化

    void Start()

    {

        if(QiziObj!=null)

            ClearFlag();

        if(mask_all!=null)

            ClearMask();

        //初始化数据

        gaming.SetActive(true);

        winer.SetActive(false);

        loser.SetActive(false);

        gameover = false;

        QiZi_num = 0;

        lei_number = 0;

        map_position_target = new int[12, 16];

        mask_all = new GameObject[12, 16];

        Qizi_table= new int[12, 16];

        QiziObj = new List<GameObject>();

        //生成雷区/遮罩---------------用map_position_target记录map状态

        ReSetMap();


        //生成数字 标记有数字 2

        ReSetNum();


        //生成遮罩 12*16

        ReSetMask();

        //雷ui数量初始化

        text_lei.text = lei_number.ToString();

    }


    private void FixedUpdate()

    {

        text_level.text = gailv.ToString();

        if (!gameover)

        {

            text_flag.text = QiZi_num.ToString();

            //排雷

            MouseHit();

            //用旗子标记雷

            if (timeval < 0.5)

            {

                TargetLei();

            }

            timeval -= Time.deltaTime;

        }

    }




    //生成雷区/map_position_target状态--方法

    public void ReSetMap()

    {

        lei_number = 0;

        int hang = 0;

        int lie = 0;

        //遍历所有位置

        for (int j = 0; j < 192; j++)

        {

            //概率生成雷不超过雷数量 图层1

            if (Random.Range(0, 10) > 10 - gailv)

            {

                //雷++生成雷

                lei_number++;

                QiziObj.Add(Instantiate(lei, map_position_all[j].transform.position, Quaternion.identity));

                //标记1 有雷

                map_position_target[hang, lie] = 1;

            }

            else

            {

                //标记0 无雷

                map_position_target[hang, lie] = 0;

            }

            //列大于15 归0 行++

            if (lie >= 15)

            {

                hang++;

                lie = 0;

            }

            //map列++

            else

            {

                lie++;

            }

        }

    }


    //生成数字方法 标记有数字 2

    public void ReSetNum()

    {

        //遍历所有target 位置 0 无雷 1有雷 二维    2有数字

        int position_lei = 0;//obj雷 位置 一维数组

        for(int i = 0; i < 12; i++)

        {

            for(int j = 0; j < 16; j++)

            {

                if (map_position_target[i, j] == 0)

                {

                    //寻找周围雷

                    int num = SeachLei(i, j);

                    if (num > 0)

                    {

                        //生成数字

                        QiziObj.Add(Instantiate(number[num - 1], map_position_all[position_lei].transform.position, Quaternion.identity));

                        //标记数字 2

                        map_position_target[i, j] = 2;

                    }

                }

                position_lei++;

            }

        }

    }


    //在map position上生成 mask遮罩 编入 mask_all[12,16]

    public void ReSetMask()

    {

        int position=0;

        for(int i=0; i < 12; i++)

        {

            for(int j = 0; j < 16; j++)

            {

                mask_all[i,j]=Instantiate(mask, map_position_all[position].transform.position, Quaternion.identity);

                position++;

            }

        }

    }


    //查询周围雷数量 1有雷,0无雷

    public int SeachLei(int x,int y)

    {

        int num=0;//雷数量

        int i, j;

        //水平方向-----------------

        {

            //向左

            i = x;

            j = y;

            while (true)

            {

                if (i <= 0)

                    break;

                i--;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

            //向右

            i = x;

            j = y;

            while (true)

            {

                if (i >= 11)

                    break;

                i++;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

        }

        //垂直方向-----------------

        {

            //向上

            i = x;

            j = y;

            while (true)

            {

                if (j <= 0)

                    break;

                j--;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

            //向下

            i = x;

            j = y;

            while (true)

            {

                if (j >= 15)

                    break;

                j++;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

        }

        //斜上方向-----------------

        {

            //i-  j+

            i = x;

            j = y;

            while (true)

            {

                if (i <= 0 || j >= 15)

                    break;

                j++;

                i--;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

            //i+  j-

            i = x;

            j = y;

            while (true)

            {

                if (i >= 11 || j <= 0)

                    break;

                j--;

                i++;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

        }

        //斜下方向-----------------

        {

            //--

            i = x;

            j = y;

            while (true)

            {

                if (i <= 0 || j<=0)

                    break;

                j--;

                i--;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

            //++

            i = x;

            j = y;

            while (true)

            {

                if (i >= 11 || j>=15)

                    break;

                j++;

                i++;

                if (map_position_target[i, j] == 1)

                    num++;

                break;

            }

        }

        return num;

    }


    //点击摧毁

    public void MouseHit()

    {

        if (Input.GetKey(KeyCode.Mouse0))//鼠标左键点击

        {

            rayhit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (rayhit.collider != null)

            {

                if (rayhit.collider.tag == "mask")

                {

                    Mask m = rayhit.collider.GetComponent<Mask>();

                    //被点击位置

                    int x=-1, y=-1;

                    for (int i = 0; i < 12; i++)

                    {

                        for (int j = 0; j < 16; j++)

                        {

                            //如果找到被点击的mask位置,进行判断是否需要展开空白区域

                            if (mask_all[i, j] != null)

                            {

                                if (mask_all[i, j].transform.position == m.transform.position)

                                {

                                    x = i;

                                    y = j;

                                    break;

                                }

                            }

                        }

                        if (x != -1 && y != -1)

                            break;

                    }

                    //摧毁

                    m.Die();

                    mask_all[x, y] = null;

                    //如果点击雷 游戏结束

                    if (map_position_target[x, y] == 1)

                        GameOver();

                    //展开空白区域

                    FindMapTarg_0(x,y);

                }

            }

        }

    }


    //展开空白区域 递归

    public void FindMapTarg_0(int x,int y)

    {

        //0为无雷空白  向周围展开

        if (map_position_target[x, y] == 0)

        {

            int up = x + 1;

            int down = x - 1;

            int right = y + 1;

            int left = y - 1;

            //摧毁垂直 水平

            if(up < 12)

                if (mask_all[up, y] != null)

                {

                    Destroy(mask_all[up, y]);

                    mask_all[up, y] = null;

                    FindMapTarg_0(up, y);

                }

            if(down >= 0)

                if (mask_all[down, y] != null)

                {

                    Destroy(mask_all[down, y]);

                    mask_all[down, y] = null;

                    FindMapTarg_0(down, y);

                }

            if (right < 16)

                if (mask_all[x, right] != null)

                {

                    Destroy(mask_all[x, right]);

                    mask_all[x, right] = null;

                    FindMapTarg_0(x, right);

                }

            if (left >= 0)

                if (mask_all[x, left] != null)

                {

                    Destroy(mask_all[x, left]);

                    mask_all[x, left] = null;

                    FindMapTarg_0(x, left);

                }

            //摧毁斜方向

            if (up < 12 && right < 16)

                if (mask_all[up, right] != null)

                {

                    Destroy(mask_all[up, right]);

                    mask_all[up, right] = null;

                    FindMapTarg_0(up, right);

                }

            if (down >= 0 && right < 16)

                if (mask_all[down, right] != null)

                {

                    Destroy(mask_all[down, right]);

                    mask_all[down, right] = null;

                    FindMapTarg_0(down, right);

                }

            if (up < 12 && left >= 0)

                if (mask_all[up, left] != null)

                {

                    Destroy(mask_all[up, left]);

                    mask_all[up, left] = null;

                    FindMapTarg_0(up, left);

                }

            if (down >= 0 && left >= 0)

                if (mask_all[down, left] != null)

                {

                    Destroy(mask_all[down, left]);

                    mask_all[down, left] = null;

                    FindMapTarg_0(down, left);

                }

        }

    }


    //标记雷/取消标记

    public void TargetLei()

    {

        if (Input.GetKey(KeyCode.Mouse1))//鼠标右键点击 标记雷

        {

            rayhit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (rayhit.collider != null)

            {

                if (rayhit.collider.tag == "mask")

                {

                    Mask m = rayhit.collider.GetComponent<Mask>();

                    //生成旗子

                    for (int i = 0; i < 12; i++)

                    {

                        for (int j = 0; j < 16; j++)

                        {

                            //如果找到被点击的mask位置,在此位置上插旗 无旗子

                            if (mask_all[i, j] != null && Qizi_table[i, j] != 1)

                            {

                                if (mask_all[i, j].transform.position == m.transform.position)

                                {

                                    //插旗

                                    QiziObj.Add(Instantiate(QiZi, m.transform.position, Quaternion.identity));

                                    Qizi_table[i, j] = 1;

                                    //旗子数++

                                    QiZi_num++;

                                    //旗子数量是否达到雷的数量

                                    if (QiZi_num >= lei_number)

                                        WinerOrLoser();

                                }

                            }

                            //有旗子 取消插旗

                            else if(mask_all[i, j] != null && Qizi_table[i, j] == 1)

                            {

                                if (mask_all[i, j].transform.position == m.transform.position)

                                {

                                    //取消插旗

                                    for(int index = 0; index < QiziObj.Count; index++)

                                    {

                                        if (QiziObj[index].transform.position == mask_all[i, j].transform.position)

                                        {

                                            Destroy(QiziObj[index]);

                                            QiziObj.Remove(QiziObj[index]);

                                        }

                                    }

                                    Qizi_table[i, j] = 0;

                                    //旗子数--

                                    QiZi_num--;

                                }

                            }

                        }

                    }

                    

                }

            }

            timeval = 1; 

        }

    }


    //判断扫雷是否正确

    public void WinerOrLoser()

    {

        //遍历地图状态

        int flag = 0;

        for (int i = 0; i < 12; i++)

        {

            for (int j = 0; j < 16; j++)

            {

                //地图标记有雷

                if (map_position_target[i, j] == 1)

                {

                    //有旗子

                    if (Qizi_table[i, j] == 1)

                    {

                        flag++;

                    }

                }

            }

        }

        if(flag>=lei_number)

            GameWin();

        else

        {

            GameOver();

        }

    }


    //除去全图遮罩

    public void ClearMask()

    {

        for (int i = 0; i < 12; i++)

        {

            for (int j = 0; j < 16; j++)

            {

                if (mask_all[i, j] != null)

                {

                    Destroy(mask_all[i, j]);

                }

            }

        }

    }


    //清除 flag number lei

    public void ClearFlag()

    {

        for(int i = 0; i < QiziObj.Count; i++)

        {

            Destroy(QiziObj[i]);

        }

    }


    //结束方法

    public void GameOver()

    {

        ClearMask();

        print("Loser");

        gameover = true;

        gaming.SetActive(false);

        loser.SetActive(true);

    }


    //赢方法

    public void GameWin()

    {

        ClearMask();

        print("Winer");

        gameover = true;

        gaming.SetActive(false);

        winer.SetActive(true);

    }


    //重新开始游戏

    public void RestartGame()

    {

        Start();

    }


    //难度+

    public void Levelup()

    {

        if (gailv < 4)

            gailv += 1;

    }

    //难度-

    public void Leveldown()

    {

        if (gailv > 2)

            gailv -= 1;

    }

}


Unity扫雷代码存档的评论 (共 条)

分享到微博请遵守国家法律