日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归算法-扫雷

發布時間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归算法-扫雷 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一直覺得掃雷的算法很神奇,研究了一下,其實就是簡單的遞歸算法。核心在于遍歷每個格子周圍的八個格子,計算雷數:雷數大于0時顯示雷數,雷數等于0時不顯示數字,并且利用遞歸方法自動點開周圍的格子。

格子類

public class Grid {public bool IsLei;public bool IsClicked;public int Count; }

掃雷地圖類

public class Map:MonoBehaviour,IPointerClickHandler {//地圖行數public const int RowCount;//地圖列數public const int ColCount;//將格子類存入一個數組public Grid[,] grids = new Grids[RowCount,ColCount];//將按鈕作為格子UI部分,用于點擊public GameObject[,] tiles = new GameObject[RowCount,ColCount];//格子周圍的八個方向private Vector2[] dirs = new Vector2[] { Vector2.up, Vector2.down, Vector2.left,Vector2.right ,new Vector2(-1,1),new Vector2(-1,-1),new Vector2(1,1),new Vector2(1,-1)};//格子的容器[SerializeField]private Transform gridContainer; //格子預制體Button [SerializeField]private GameObject gridPrefab;//初始地圖void StartGame(){for (int i = 0; i < RowCount; i++){for (int j = 0; j < ColCount; j++){grids[i, j] = new Grid();//隨機向格子中添加雷grids[i, j].IsLei = Random.Range(1, 11) < 3 ? true : false;//添加可點擊按鈕作為格子GameObject grid = Instantiate<GameObject>(gridPrefab);grid.transform.SetParent(gridContainer);//給按鈕命名,便于點擊的時候檢測grid.name = i.ToString() + "_" + j.ToString();tiles[i, j] = grid;}}}void Start(){StartGame();}//點擊事件檢測,獲取點擊的格子坐標public void OnPointerClick(PointerEventData eventData){GameObject enter = eventData.pointerEnter;//如果點擊的是格子if (enter.name.Contains("_")){ //計算格子的坐標int x = int.Parse(enter.name.Split('_')[0]);int y = int.Parse(enter.name.Split('_')[1]);GridClick(x, y);}}//點擊格子的結果判斷private void GridClick(int x,int y){if (!grids[x, y].IsClicked){grids[x, y].IsClicked = true;//檢測grids[x,y]是不是雷if (grids[x, y].IsLei){//是雷就輸了Debug.Log("輸了");return;}else {//如果不是雷,則檢測該格子周圍八個格子的情況for (int i = 0; i < dirs.Length; i++){int temp_x = x + (int)dirs[i].x;int temp_y = y + (int)dirs[i].y;//如果周圍有雷,則該格子雷數+1if (temp_x >= 0 && temp_x < RowCount && temp_y >= 0 && temp_y < ColCount){if (grids[temp_x, temp_y].IsLei){grids[x, y].Count++;}}}//格子點擊后變灰,并顯示雷數tiles[x, y].transform.GetChild(0).gameObject.SetActive(true);tiles[x, y].GetComponent<Image>().color = Color.gray;if (grids[x, y].Count > 0)tiles[x, y].GetComponentInChildren<Text>().text = grids[x, y].Count.ToString();elseDigui(x,y); }}}//當grids[x,y]這個格子周圍雷數為0時,調用遞歸方法自動點開它周圍的八個格子private void Digui(int x, int y){for (int i = 0; i < dirs.Length; i++){int temp_x = x + (int)dirs[i].x;int temp_y = y + (int)dirs[i].y;//沒被點擊過if (temp_x>=0&&temp_x<RowCount&&temp_y>=0&&temp_y<ColCount){GridClick(temp_x,temp_y);}}} }

運行結果如下:

總結

以上是生活随笔為你收集整理的递归算法-扫雷的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。