using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class GameBoard { #region Variables private int height = 0; public int Height { get { return height; } } private int width = 0; public int Width { get { return width; } } private SC_Gem[,] allGems; // public Gem[,] AllGems { get { return allGems; } } private int score = 0; public int Score { get { return score; } set { score = value; } } private List currentMatches = new List(); public List CurrentMatches { get { return currentMatches; } } #endregion public GameBoard(int _Width, int _Height) { height = _Height; width = _Width; allGems = new SC_Gem[width, height]; } public bool MatchesAt(Vector2Int _PositionToCheck, SC_Gem _GemToCheck) { if (_PositionToCheck.x > 1) { if (allGems[_PositionToCheck.x - 1, _PositionToCheck.y].type == _GemToCheck.type && allGems[_PositionToCheck.x - 2, _PositionToCheck.y].type == _GemToCheck.type) return true; } if (_PositionToCheck.y > 1) { if (allGems[_PositionToCheck.x, _PositionToCheck.y - 1].type == _GemToCheck.type && allGems[_PositionToCheck.x, _PositionToCheck.y - 2].type == _GemToCheck.type) return true; } return false; } public void SetGem(int _X, int _Y, SC_Gem _Gem) { allGems[_X, _Y] = _Gem; } public SC_Gem GetGem(int _X,int _Y) { return allGems[_X, _Y]; } public void FindAllMatches() { currentMatches.Clear(); for (int x = 0; x < width; x++) for (int y = 0; y < height; y++) { SC_Gem currentGem = allGems[x, y]; if (currentGem != null) { if (x > 0 && x < width - 1) { SC_Gem leftGem = allGems[x - 1, y]; SC_Gem rightGem = allGems[x + 1, y]; //checking no empty spots if (leftGem != null && rightGem != null) { //Match if (leftGem.type == currentGem.type && rightGem.type == currentGem.type) { currentGem.isMatch = true; leftGem.isMatch = true; rightGem.isMatch = true; currentMatches.Add(currentGem); currentMatches.Add(leftGem); currentMatches.Add(rightGem); } } } if (y > 0 && y < height - 1) { SC_Gem aboveGem = allGems[x, y - 1]; SC_Gem bellowGem = allGems[x, y + 1]; //checking no empty spots if (aboveGem != null && bellowGem != null) { //Match if (aboveGem.type == currentGem.type && bellowGem.type == currentGem.type) { currentGem.isMatch = true; aboveGem.isMatch = true; bellowGem.isMatch = true; currentMatches.Add(currentGem); currentMatches.Add(aboveGem); currentMatches.Add(bellowGem); } } } } } if (currentMatches.Count > 0) currentMatches = currentMatches.Distinct().ToList(); CheckForBombs(); } public void CheckForBombs() { for (int i = 0; i < currentMatches.Count; i++) { SC_Gem gem = currentMatches[i]; int x = gem.posIndex.x; int y = gem.posIndex.y; if (gem.posIndex.x > 0) { if (allGems[x - 1, y] != null && allGems[x - 1, y].type == GlobalEnums.GemType.bomb) MarkBombArea(new Vector2Int(x - 1, y), allGems[x - 1, y].blastSize); } if (gem.posIndex.x + 1 < width) { if (allGems[x + 1, y] != null && allGems[x + 1, y].type == GlobalEnums.GemType.bomb) MarkBombArea(new Vector2Int(x + 1, y), allGems[x + 1, y].blastSize); } if (gem.posIndex.y > 0) { if (allGems[x, y - 1] != null && allGems[x, y - 1].type == GlobalEnums.GemType.bomb) MarkBombArea(new Vector2Int(x, y - 1), allGems[x, y - 1].blastSize); } if (gem.posIndex.y + 1 < height) { if (allGems[x, y + 1] != null && allGems[x, y + 1].type == GlobalEnums.GemType.bomb) MarkBombArea(new Vector2Int(x, y + 1), allGems[x, y + 1].blastSize); } } } public void MarkBombArea(Vector2Int bombPos, int _BlastSize) { string _print = ""; for (int x = bombPos.x - _BlastSize; x <= bombPos.x + _BlastSize; x++) { for (int y = bombPos.y - _BlastSize; y <= bombPos.y + _BlastSize; y++) { if (x >= 0 && x < width && y >= 0 && y < height) { if (allGems[x, y] != null) { _print += "(" + x + "," + y + ")" + System.Environment.NewLine; allGems[x, y].isMatch = true; currentMatches.Add(allGems[x, y]); } } } } currentMatches = currentMatches.Distinct().ToList(); } }