tinjaw
6/14/2017 - 3:06 PM

Companion Code for Blog Entry on Hexasphere

Companion Code for Blog Entry on Hexasphere

// ***********************************************************************
// Assembly         : Testing Project
// Author           : Chaim Krause
// Created          : 05-26-2017
//
// Last Modified By : Chaim Krause
// Last Modified On : 05-30-2017
// ***********************************************************************
// <copyright file="GameManager.cs" company="Combat Coding">
//     CC BY 4.0
//     https://creativecommons.org/licenses/by/4.0/   
// </copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections.Generic;

using HexasphereGrid;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    #region Fields

    private GamePlayer _WhosTurnIsIt = GamePlayer.Blue;
    private int gameturn = 1;
    private Hexasphere hexa;
    private GamePlayer[] owner;
    private List<GamePlayer> unclaimed = new List<GamePlayer>() { GamePlayer.BlueMatch, GamePlayer.RedMatch, GamePlayer.None };

    #endregion Fields

    #region Enums

    public enum GamePlayer
    {
        None,
        Blue,
        Red,
        BlueMatch,
        RedMatch
    }

    #endregion Enums

    #region Properties

    private GamePlayer WhosTurnIsIt
    {
        get
        {
            return _WhosTurnIsIt;
        }

        set
        {
            _WhosTurnIsIt = value;
        }
    }

    #endregion Properties

    #region Methods

    private bool IsAdjacentToOwnTile(GamePlayer whosTurnIsIt, int[] neighbors)
    {
        foreach (int index in neighbors)
        {
            if (owner[index] == whosTurnIsIt)
            {
                return true;
            }
        }

        return false;
    }

    private bool IsOppositeClear(int polarOpposite)
    {
        return owner[polarOpposite] == GamePlayer.None;
    }

    private void OnTileClick(int tileIndex)
    {
        Debug.Log(tileIndex);
        int[] neighbors = hexa.GetTileNeighbours(tileIndex);
        int polarOpposite = hexa.GetTileAtPolarOpposite(tileIndex);
        if ((unclaimed.IndexOf(owner[tileIndex]) != -1) & (IsAdjacentToOwnTile(WhosTurnIsIt, neighbors) | (gameturn == 1)))
        {
            if (WhosTurnIsIt == GamePlayer.Blue)
            {
                hexa.SetTileColor(tileIndex, Color.blue);
                if (owner[tileIndex] == GamePlayer.BlueMatch)
                {
                    // Blue is the winner
                    Debug.Log("Blue is the winner");
                }

                if (IsOppositeClear(polarOpposite))
                {
                    hexa.SetTileColor(polarOpposite, new Color(0, 0.75F, 1, 1));
                    if (owner[tileIndex] == GamePlayer.RedMatch)
                    {
                        // Red is the winner
                        Debug.Log("Red is the winner");
                    }

                    if (owner[polarOpposite] == GamePlayer.None)
                    {
                        owner[polarOpposite] = GamePlayer.BlueMatch;
                    }
                }

                hexa.highlightColor = Color.red;
            }
            else
            {
                hexa.SetTileColor(tileIndex, Color.red);
                if (IsOppositeClear(polarOpposite))
                {
                    hexa.SetTileColor(polarOpposite, new Color(1, 0.5F, 0.5F, 1));
                    if (owner[polarOpposite] == GamePlayer.None)
                    {
                        owner[polarOpposite] = GamePlayer.RedMatch;
                    }
                }

                hexa.highlightColor = Color.blue;
            }

            owner[tileIndex] = WhosTurnIsIt;
            if (WhosTurnIsIt == GamePlayer.Red)
            {
                gameturn += 1;
            }

            SwitchSide();
        }
    }

    private void Start()
    {
        hexa = Hexasphere.GetInstance("Hexasphere");
        hexa.OnTileClick += OnTileClick;
        owner = new GamePlayer[hexa.tiles.Length];
        for (int i = 0; i < owner.Length; i++)
        {
            owner[i] = GamePlayer.None;
        }
    }

    private GamePlayer SwitchSide()
    {
        if (WhosTurnIsIt == GamePlayer.Blue)
        {
            WhosTurnIsIt = GamePlayer.Red;
        }
        else
        {
            WhosTurnIsIt = GamePlayer.Blue;
        }

        return WhosTurnIsIt;
    }

    #endregion Methods
}