/// <summary> /// Create a <see cref="PriorityQueue{T}" /> with given <see cref="IHeap{T}" />. /// If no <see cref="IHeap{T}" /> is given, <see cref="BinaryHeap{T}" /> and <see cref="PriorityComparer{T}" /> will be /// used. /// </summary> /// <param name="heap">Initial Heap.</param> public PriorityQueue(IHeap <IPriority <T> > heap = null) { if (heap == null) { heap = Heaps.Default(new PriorityComparer <T>()); } _heap = heap; }
/// <summary> /// Allows the computer to make a random, legal, non-suicidal move. /// </summary> public void AITakeTurn() { Random rando = new Random(); if (Heaps.Sum() > 1) //Do not intentionally lose. { bool validHeap = false; int heap = 0; int beads = 0; while (!validHeap) { heap = rando.Next(Heaps.Length); if (Heaps[heap] != 0) { validHeap = true; } } bool validBeads = false; while (!validBeads) { beads = rando.Next(Heaps[heap]) + 1; if (Heaps.Where(x => x > 0).Count() == 1 && beads == Heaps.Sum()) { validBeads = false; } else { validBeads = true; } } Heaps[heap] -= beads; Console.Clear(); Console.WriteLine($"{P2Name} removed {beads} from heap {heap+1}."); } else //The only available move is to lose. { for (int i = 0; i < Heaps.Length; i++) { if (Heaps[i] == 1) { Heaps[i] -= 1; Console.Clear(); Console.WriteLine($"{P2Name} removed 1 from heap {i+1}"); break; } } } }