井字棋小遊戲
來自專欄 Unity開發
本文這要的思路是通過位操作來實現,記錄兩個玩家每一步的位置。當然演算法不止一種,主要是基於《C#6.0本質論》里講到的內容做一個總結
思路
- 通過位操作(position = 1 << position )來獲取當前玩家選中的位置
- positionX(or positionO) |= position 來記錄該玩家所有選中的位置
- 根據所有的可能性來判斷是否成功 (target & positionX(or positionO) == target) (target 為目標位置 如:111 000 000、 000 111 000 、 000 000 111 …)
核心演算法
- 位置選擇
public void OnButtonClick(){ if (isSelect) { GameView.instance.ShowTips("已被選..."); return; } isSelect = true;//標記此位置已被選中 GameManager.instance.SetPostion(playerPos);//記錄選中位置 //貼圖 image.material = GameView.instance.GetMaterial(GameManager.instance.player); //判斷遊戲是否結束 if (GameManager.instance.GameOver(playerPos)) { GameView.instance.ShowTipsAllTimes("遊戲結束
恭喜 " + GameManager.instance.player.ToString() +" 獲勝!!!"); return; } //更換玩家 GameManager.instance.player = (GameManager.instance.player == Player.O) ? GameManager.instance.player = Player.X : Player.O; GameView.instance.SetPlayer(GameManager.instance.player);}
- 記錄玩家已選擇的位置
private int postionX; //記錄 X 玩家已選擇的位置private int postionO; //記錄 O 玩家已選擇的位置public void SetPostion( int _position){ //每次玩家選擇的位置 int position = 1 << _position; //判斷是哪個玩家選擇了該位置 if (player == Player.O) { //通過 |= 操作來記錄玩家所有選擇的位置 (0 為未選擇 , 1 位已選擇) postionO |= position; } else { postionX |= position; }}
- 判斷遊戲結束
//成功的所有可能性int[] winningMasks = {7, 56 , 448 , 73 , 146 , 292 , 84 , 273}public bool GameOver(int _playerPos){ foreach (int mask in winningMasks) { if ((mask & postionX) == mask)// X 玩家獲勝 { isOver = true; break; } else if ((mask & postionO) == mask)// O 玩家獲勝 { isOver = true; break; } } //平局 if (!GameView.instance.items.Any(item => item.IsSelect == false)) { isOver = false; GameView.instance.ShowTipsAllTimes("平局"); } return isOver;}
其實通過位操作實現起來還蠻簡單的,當然這只是簡單的 3*3 的圖。 後面如果有時間的話我會加上 AI 自動下棋功能。可能會用到數據結構中的圖。正好我也在學習書籍結構…
博客地址
井字棋小遊戲 | 學無止境工程及源代碼
Lenzan/Tic_Tac_Toe
配圖
推薦閱讀:
※決戰秋名山!QQ飛車手游手柄秋名山賽道攻略,教你克服所有難點!
※崩壞3rd哪個角色最值得培養?
※對比fifa online4,3有什麼缺點?
※002.不朽屍王