This is a version of the game Lines with a mayan theme.
[button url=”https://gamelogic.co.za/examples/grids/mayan-magic/”]PLAY GAME[/button]
Note: You need the Unity Web Plugin to play this example.
Main Game Logic
using System; using System.Linq; using System.Collections.Generic; using UnityEngine; using Gamelogic; using Gamelogic.Grids; public class Lines : GLMonoBehaviour { #region Inspector public LinesCell cellPrefab; public int width = 5; public int height = 5; public int lineLength = 4; public int colorCount = 3; public int cellsPerTurn = 5; public GameObject root; #endregion #region Private Fields private Vector2 hexDimensions = new Vector2(74, 84);// private PointyHexGrid grid; private IMap3D map; private bool isHoldingCell; private LinesCell cellThatIsBeingHeld; private Rect screenRect; private int moveCount; #endregion #region Callbacks public void Start() { moveCount = 0; BuildGrid(); AddNewCells(); } public void Update() { if(Input.GetMouseButtonDown(0)) { Vector3 worldPosition = ExampleUtils.ScreenToWorld_NGUI(root, Input.mousePosition); PointyHexPoint hexPoint = map[worldPosition]; if(grid.Contains(hexPoint)) { ClickPoint (hexPoint); } } } #endregion private void ClickPoint(PointyHexPoint hexPoint) { LinesCell clickedCell = grid [hexPoint]; if (isHoldingCell) { if (clickedCell.IsEmpty) { MoveCell(clickedCell); if (!ClearLinesAroundPoint(hexPoint)) { moveCount++; AddNewCells(); }//otherwise, give the player a "free" turn. } else if (clickedCell == cellThatIsBeingHeld) { DropCell(clickedCell); } } else { if (!clickedCell.IsEmpty) { PickUpCell(clickedCell); } } } private void PickUpCell(LinesCell clickedCell) { cellThatIsBeingHeld = clickedCell; isHoldingCell = true; clickedCell.HighlightOn = true; } private void DropCell (LinesCell clickedCell) { cellThatIsBeingHeld.HighlightOn = false; cellThatIsBeingHeld = null; isHoldingCell = false; } private void MoveCell(LinesCell clickedCell) { cellThatIsBeingHeld.HighlightOn = false; SwapCells (cellThatIsBeingHeld, clickedCell); cellThatIsBeingHeld = null; isHoldingCell = false; } private void BuildGrid() { screenRect = new Rect(-Screen.width/2, -Screen.height / 2, Screen.width, Screen.height); grid = PointyHexGrid .BeginShape() .UpTriangle(7) .Translate(-1, 2) .Union() .DownTriangle(7) .EndShape(); map = new PointyHexMap(hexDimensions) .WithWindow(screenRect) .AlignMiddelCenter(grid) .AnchorCellMiddelCenter() .To3DXY(); foreach (PointyHexPoint point in grid) { LinesCell cell = Instantiate (cellPrefab); Vector3 worldPoint = map[point]; cell.transform.parent = root.transform; cell.transform.localPosition = worldPoint; cell.transform.localScale = Vector3.one; cell.SetState (true, -1); grid[point] = cell; } } private void AddNewCells() { var emptyCells = GetEmptyCells(); List cellsToPlace; cellsToPlace = emptyCells.SampleRandom(cellsPerTurn); foreach(PointyHexPoint point in cellsToPlace) { SetCellToRandom(grid[point]); ClearLinesAroundPoint(point); } emptyCells = GetEmptyCells(); if(!emptyCells.Any()) { Debug.Log ("Game Ends!"); } } private IEnumerable GetEmptyCells () { return from point in grid where grid [point].IsEmpty select point; } private void SetCellToRandom(LinesCell cell) { int newColor = (UnityEngine.Random.Range(0, colorCount)); cell.SetState(false, newColor); } private static void SwapCells(LinesCell cell1, LinesCell cell2) { int tempColor = cell1.Color; bool tempIsEmpty = cell1.IsEmpty; cell1.SetState(cell2.IsEmpty, cell2.Color); cell2.SetState(tempIsEmpty, tempColor); } private bool ClearLinesAroundPoint(PointyHexPoint point) { bool wasLinesRemoved = false; IEnumerable lines = from line in Algorithms.GetConnectedLines(grid, point, (p1, p2) => grid[p1].Color == grid[p2].Color) where line.Count() >= lineLength select line; foreach (IEnumerable line in lines) { foreach(PointyHexPoint linePoint in line) { grid[linePoint].SetState(true, -1); } wasLinesRemoved = true; } return wasLinesRemoved; } }