Unity制作扫雷游戏
生活随笔
收集整理的這篇文章主要介紹了
Unity制作扫雷游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
曾經在網上看了一篇掃雷教程,鏈接如下:https://noobtuts.com/unity/2d-minesweeper-game
但是照著做出來有點問題,后來自己嘗試的做了一個,效果如圖:
主要有三個代碼,一個是排序代碼,一個是管理腳本,還有一個是子物體屬性腳本,腳本內容如下:
GridTransform.cs
using UnityEngine; using System.Collections;public class GridTransform : MonoBehaviour {//排序的列數public int column = 1;//間距的寬和高public float space_w;public float space_h;//組件對象的寬和高public float width;public float Height;//排序對象的數目public int itemNumber;public bool Direction;//字段封裝實時排序public bool repositionNow{set{_repositionNow = value;if (value){Sort();_repositionNow = false;}}get{return _repositionNow;}}private bool _repositionNow;//排序方法void Sort(){itemNumber = transform.childCount; ;for (int i = 0; i < itemNumber; i++){transform.GetChild(i).localPosition = new Vector3((width + space_w) * ((i) % (column)), (Direction?1:-1)*((i) / column) * (Height + space_h), 0);}} }Element.cs using UnityEngine; using System.Collections;public enum MineState {Empty = 0,Mine = 1,Num = 2,MaybeMine = 3 }public class Element : MonoBehaviour {/// <summary>/// current box mine state/// </summary>public MineState mine;public Sprite[] emptyTextures;public Sprite mineTexture;public void loadTexture(int mineCount = 0){if ((int)mine == 1)GetComponent<SpriteRenderer>().sprite = mineTexture;elseGetComponent<SpriteRenderer>().sprite = emptyTextures[mineCount];}public bool isCovered(){return GetComponent<SpriteRenderer>().sprite.texture.name == "default";}void OnMouseUpAsButton(){Debug.Log(transform.localPosition.x + " " + transform.localPosition.y+" "+mine);if ((int)mine == 1){MineManager.Instance.uncoverMines();print("you lose");}else{int x = (int)transform.localPosition.x;int y = (int)transform.localPosition.y;loadTexture(MineManager.Instance.MineCount(x, y));MineManager.Instance.FFuncover(x, y, new bool[MineManager.Instance.width, MineManager.Instance.height]);if (MineManager.Instance.isFinished()){print("you win");}}}}
MineManager.cs using UnityEngine; using System.Collections; using System.Collections.Generic;public class MineManager : MonoBehaviour {public GameObject elementPrefab;public GridTransform grid;public int width;public int height;public Element[,] elements;public int mineNumber;public ArrayList MineLocation;public static MineManager Instance;// Use this for initializationvoid Start(){Instance = this;elements = new Element[width, height];MineLocation = new ArrayList();Init();}void Init(){//create elementfor (int j = 0; j < height; j++){for (int i = 0; i < width; i++){elements[i, j] = CreateElement();elements[i, j].mine = MineState.Empty;}}//reset positiongrid.repositionNow = true;//random mine in the current elementsfor (int n = 0; n < mineNumber; n++){int k = Random.Range(0, width);int m = Random.Range(0, height);Vector2 temp = new Vector2(k, m);if (MineLocation.Contains(temp)){n--;continue;}elements[k, m].mine = MineState.Mine;Debug.Log(elements[k, m].mine);//elements[k, m].loadTexture();var c = new Vector2(k, m);Debug.Log(c);MineLocation.Add(c);}//set numbers near mineforeach (var item in MineLocation){Vector2 t = (Vector2)item;int x = (int)t.x;int y = (int)t.y;JudegeMinesNear(x - 1, y + 1);JudegeMinesNear(x, y + 1);JudegeMinesNear(x + 1, y + 1);JudegeMinesNear(x - 1, y);JudegeMinesNear(x + 1, y);JudegeMinesNear(x - 1, y - 1);JudegeMinesNear(x, y - 1);JudegeMinesNear(x + 1, y - 1);}}// Find out if a mine is at the coordinatespublic bool mineAt(int x, int y){// Coordinates in range? Then check for mine.if (x >= 0 && y >= 0 && x < width && y < height)return (int)elements[x, y].mine == 1;return false;}public bool IsInclude(int x, int y){if (x >= 0 && y >= 0 && x < width && y < height)return true;return false;}public void JudegeMinesNear(int x, int y){if (IsInclude(x, y) == false)return;if ((int)elements[x, y].mine != 1){elements[x, y].mine = MineState.Num;//elements[x, y].loadTexture(MineCount(x, y));}}// Count adjacent mines for an elementpublic int MineCount(int x, int y){int count = 0;if (mineAt(x, y + 1)) ++count; // topif (mineAt(x + 1, y + 1)) ++count; // top-rightif (mineAt(x + 1, y)) ++count; // rightif (mineAt(x + 1, y - 1)) ++count; // bottom-rightif (mineAt(x, y - 1)) ++count; // bottomif (mineAt(x - 1, y - 1)) ++count; // bottom-leftif (mineAt(x - 1, y)) ++count; // leftif (mineAt(x - 1, y + 1)) ++count; // top-leftreturn count;}// Flood Fill empty elementspublic void FFuncover(int x, int y, bool[,] visited){// Coordinates in Range?if (IsInclude(x,y)){// visited already?if (visited[x, y])return;// uncover elementelements[x, y].loadTexture(MineCount(x, y));Debug.Log(" " + x + " " + y);// close to a mine? then no more work needed hereif (MineCount(x, y) > 0)return;// set visited flagvisited[x, y] = true;// recursionFFuncover(x - 1, y + 1, visited);FFuncover(x, y + 1, visited);FFuncover(x + 1, y + 1, visited);FFuncover(x - 1, y, visited);FFuncover(x + 1, y, visited);FFuncover(x - 1, y - 1, visited);FFuncover(x, y - 1, visited);FFuncover(x + 1, y - 1, visited);Debug.Log("----------------------------------------");}}// Uncover all Minespublic void uncoverMines(){foreach (Element elem in elements)if (elem.mine == MineState.Mine)elem.loadTexture(0);}Element CreateElement(){GameObject temp = Instantiate(elementPrefab) as GameObject;temp.transform.parent = grid.transform;temp.transform.position = Vector3.zero;return temp.GetComponent<Element>();}public bool isFinished(){// Try to find a covered element that is no mineforeach (Element elem in elements)if (elem.isCovered() && (int)elem.mine != 1)return false;// There are none => all are mines => game won.return true;} }
工程下載
總結
以上是生活随笔為你收集整理的Unity制作扫雷游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冀教版小学三年级计算机课本,冀教版小学三
- 下一篇: Win2000 蓝屏画面错误代码说明