unity3D 2019.3版本开发的扫雷

unity3D 2019.3版本开发的扫雷

在这里插入图片描述
在这里插入图片描述

1 GameManger

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class GameManger : MonoBehaviour
{
    public GameObject BlockPrefab;
    public int xColumn =20;
    public int yRow = 18;
    public AudioClip bombClip;
    private float gameTIme = 120;
    public Text gameText;
    public Block[,] blockArrays;
    public CanvasGroup gamePanle;
    private bool isgame;
    private void Awake()
    {
        blockArrays = new Block[xColumn, yRow];
       // blocks= Block[xColumn,yRow];
        for (int i = 0; i < xColumn; i++) {
            for (int j = 0; j < yRow; j++) {
               GameObject tempBlock= Instantiate(BlockPrefab,correctPositive(i,j),Quaternion.identity);
                tempBlock.transform.parent = transform;
                blockArrays[i, j] = tempBlock.GetComponent<Block>();
                blockArrays[i, j].Init(i, j, Block.BlockSpriteType.Block, this);
            }
        }
        CreateBoobs();
        gamePanle.alpha = 0;
        gamePanle.blocksRaycasts = false;
        gamePanle.interactable = false;
        isgame = true;
    }
    // Update is called once per frame
    void Update()
    {
        if (isgame==false)
        {
            return;
        }
        if (gameTIme<=0)
        {
            isgame = false;
            gamePanle.alpha = 1;
            gamePanle.blocksRaycasts = true;
            gamePanle.interactable = true;
        }
        gameText.text = (gameTIme -= Time.deltaTime).ToString("0.0");

        if (Input.GetMouseButtonDown(1))
        {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                bool isCollider = Physics.Raycast(ray, out hit, int.MaxValue, LayerMask.GetMask("Blocks"));
                if (isCollider)
                {
                    GameObject blockObject= hit.collider.gameObject;

                    Block block = blockObject.GetComponent<Block>();
                    Debug.Log(block.name);

                    if (block.isFlaged == false && block.isOpen == false)
                    {
                        block.isFlaged = true;
                        block.setSprite(Block.BlockSpriteType.BlockFlagged);
                    }
                    else
                    {
                    Debug.Log("GetMouseButtonDown(1)");
                    block.isFlaged = false;
                    block.setSprite(Block.BlockSpriteType.Block);
                    }
                }
            
        }

    }
    void CreateBoobs()
    {
        int count = 0;
        while (count < 40)
        {
            int x = Random.Range(0, xColumn);
            int y = Random.Range(0,yRow);
            if (blockArrays[x, y].isbombs == false) {
                blockArrays[x, y].isbombs = true;
                count++;
               // blockArrays[x, y].setSprite(Block.BlockSpriteType.Bomb);
            }
        }
    }
    public Vector3 correctPositive(float x, float y)
    {

        return new Vector3((transform.position.x - (xColumn) / 2f + x)/2f, (transform.position.y + (yRow-1 ) / 2f - y)/2f, 0);
    }
    private ArrayList getNeighbours(Block block) {
         ArrayList  blocklist =  new ArrayList();
       
        if (block.x + 1 < xColumn && block.y + 1 < yRow) {
            blocklist.Add(blockArrays[block.x + 1, block.y + 1]);
        }

        if (block.x + 1 < xColumn &&block.y - 1 >= 0)
        {
            blocklist.Add(blockArrays[block.x + 1, block.y - 1]);
        }
        if (block.x + 1 < xColumn )
        {
            blocklist.Add(blockArrays[block.x + 1, block.y]);
        }

        if (block.y + 1 < yRow)
        {
            blocklist.Add(blockArrays[block.x , block.y + 1]);
        }
        if (block.y - 1 >= 0)
        {
            blocklist.Add(blockArrays[block.x, block.y - 1]);
        }
        if (block.x - 1 >= 0 && block.y + 1 < yRow)
        {
            blocklist.Add(blockArrays[block.x - 1, block.y + 1]);
        }
        if (block.x - 1 >= 0 )
        {
            blocklist.Add(blockArrays[block.x - 1, block.y ]);
        }
        if (block.x - 1 >= 0 && block.y - 1 >= 0)
        {
            blocklist.Add(blockArrays[block.x - 1, block.y - 1]);
        }
        return blocklist;
    }

    public int getBoobNumber(Block block) {
        int bombNumber = 0;
        ArrayList blocks = getNeighbours(block);
        foreach (Block nblock in blocks) {
            if (nblock.isbombs == true)
                bombNumber++;
        }
        return bombNumber;
    }
    public void buttonPress (Block block)
    {
        if (Input.GetMouseButtonDown(0)) {
            if (block.isbombs == false && block.isFlaged == false)
            {

                if (block.isOpen == false)
                {
                    openBlock(block);
                }
            }
            else if(block.isbombs == true && block.isFlaged == false)
            {
                AudioSource.PlayClipAtPoint(bombClip,transform.position);
                block.setSprite(Block.BlockSpriteType.Bomb);
                Debug.Log("game over");
                isgame = false;
                gamePanle.alpha = 1;
                gamePanle.blocksRaycasts = true;
                gamePanle.interactable = true;
            }
        }   
    }
    private void openBlock(Block block) {
        block.isOpen = true;
        int bombNumber = getBoobNumber(block);
        block.setImage(bombNumber);
        if (bombNumber == 0) {
            ArrayList blocksList = getNeighbours(block);
            foreach (Block nblock in blocksList)
            {
                if (nblock.isOpen == false) {
                    openBlock(nblock);
                }
            }
        }
    }
    public void restart()
    {
        UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex);
    }
    public void QuitGame()
    {

        Application.Quit();
    }
}

2 Block

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

public class Block : MonoBehaviour
{
    public enum BlockSpriteType
    {
        Block,
        BlockClicked,
        Bomb,
        BlockFlagged,
        one,
        tow,
        three,
        four,
        five,
        six,
        seven,
        eight
    }
    [System.Serializable]
    public struct BlockSpriteStruct {
        public BlockSpriteType type;
        public Sprite sprite;
    }
    private GameManger gameManger;
    public BlockSpriteStruct[] blockSpriteStructs;
    public int x;
    public int y;
    public Dictionary<BlockSpriteType, Sprite> blockSpriteDict;
    [HideInInspector]
    public SpriteRenderer spriteRenderer;
    private void Awake()
    {
        spriteRenderer = transform.Find("blockmodel").GetComponent<SpriteRenderer>();
        blockSpriteDict = new Dictionary<BlockSpriteType, Sprite>();
        for (int i = 0; i < blockSpriteStructs.Length; i++) {
            if (!blockSpriteDict.ContainsKey(blockSpriteStructs[i].type)) {
                blockSpriteDict.Add(blockSpriteStructs[i].type, blockSpriteStructs[i].sprite);
            }
        }
    }
    [HideInInspector]
    public BlockSpriteType type;
    public void Init(int x, int y, BlockSpriteType type, GameManger gameManger)
    {
        this.x = x;
        this.y = y;
        this.type = type;
        this.gameManger = gameManger;
        setSprite(type);
    }
    public void setImage(int number) {
        switch (number)
        {
            case 0:
                setSprite(BlockSpriteType.BlockClicked);
                break;
            case 1:
                setSprite(BlockSpriteType.one);
                break;
            case 2:
                setSprite(BlockSpriteType.tow);
                break;
            case 3:
                setSprite(BlockSpriteType.three);
                break;
            case 4:
                setSprite(BlockSpriteType.four);
                break;
            case 5:
                setSprite(BlockSpriteType.five);
                break;
            case 6:
                setSprite(BlockSpriteType.six);
                break;
            case 8:
                setSprite(BlockSpriteType.eight);
                break;
            case 7:
                setSprite(BlockSpriteType.seven);
                break;
            default:
                break;
        }
    }
    public  void setSprite(BlockSpriteType type) {
        this.type = type;
        spriteRenderer.sprite = blockSpriteDict[type];
    }
    public bool isbombs =false;
    public bool isOpen = false;
    public bool isFlaged = false;
    void Start()
    {
        if (Input.GetMouseButtonDown(1))
        {
            Debug.Log("GetMouseButtonDown(1)");
            if (isFlaged == false && isOpen == false)
            {
                isFlaged = true;
               setSprite(Block.BlockSpriteType.BlockFlagged);
            }
            else
            {
                isFlaged = false;
                setSprite(Block.BlockSpriteType.Block);
            }
        }
    }
    private void OnMouseDown()
    {
        Debug.Log(Input.GetMouseButton(1));
        gameManger.buttonPress(this);
    }
}

3 GameManger参数设置

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值