/// <summary> /// Checks how many equal colors, withous repetitions, are in common with both rows /// </summary> /// <param name="row">The other row to compare</param> /// <returns>Number of similar colors, without repetitions</returns> internal int EqualColors(ColoredPegRow row) { if (this.NumberPegs != row.NumberPegs) { throw new MastermindColoredPegRowException("To compare objects, the number of pegs must be equal"); } List <PegColor> foundColors = new List <PegColor>(); for (int i = 0; i < this.NumberPegs; i++) { if (!foundColors.Contains(this.Pegs[i])) { bool newColor = false; PegColor current = this.Pegs[i]; foreach (PegColor color in row.Pegs) { if (current == color) { newColor = true; break; } } if (newColor) { foundColors.Add(current); } } } return(foundColors.Count); }
/// <summary> /// Creates the combination to be broke by human player /// </summary> /// <param name="combination">An array containing the combination</param> /// <remarks>Once set, the combination cannot be changed</remarks> public void setup(ColoredPegRow combination) { if (this.Status != GameStatus.Setup) { throw new MastermindGameException("Setup can only be done during setup game status"); } this.theBoard.setup(combination); this.Status = GameStatus.Ready; }
/// <summary> /// Checks how many pegs are in right positions (same color and same position) /// </summary> /// <param name="row">The other row to compare</param> /// <returns>Number of right pegs</returns> internal int EqualColorsAndPositions(ColoredPegRow row) { if (this.NumberPegs != row.NumberPegs) { throw new MastermindColoredPegRowException("To compare objects, the number of pegs must be equal"); } int total = 0; for (int i = 0; i < this.NumberPegs; i++) { if (this.Pegs[i] == row.Pegs[i]) { total++; } } return(total); }
/// <summary> /// Try to guess a row of the board /// </summary> /// <param name="row">Row with pegs to break the combination</param> /// <returns>Result stats of the move</returns> public MoveResult doMove(ColoredPegRow row) { if (this.Status != GameStatus.Running) { throw new MastermindGameException("The game is not running"); } MoveResult result = this.theBoard.doMove(row); // check for victory if (result.TotalRightColorAndPosition == this.theBoard.NumberPegs) { this.theWinner = this.Players[0]; // human player this.Status = GameStatus.Ended; } else if (result.NoMoreMoves) { this.theWinner = this.Players[1]; // computer this.Status = GameStatus.Ended; } return(result); }
/// <summary> /// Checks if two ColoredPegRow are equal /// </summary> /// <param name="obj">The other object to compare</param> /// <returns>True, if the rows are equal (peg colors and positions); false otherwise</returns> /// <remarks>This method always returns false if the other object is not a ColoredPegRow</remarks> public override bool Equals(object obj) { if (!(obj is ColoredPegRow)) { return(false); } ColoredPegRow other = (ColoredPegRow)obj; if (other.NumberPegs != this.NumberPegs) { return(false); } for (int i = 0; i < this.NumberPegs; i++) { if (this.Pegs[i] != other.Pegs[i]) { return(false); } } return(true); }