// Return the upper section bonus if player submits score for category; playerScores // is reference to array of player's submitted scores for all categories. public int CalculateUpperSectionBonus(Rules.Category category, int score, int [] playerScores) { int cat = (int)category; if ((ActivePlayer == Player.Player1 && UpperBonusPlayer1) || (ActivePlayer == Player.Player2 && UpperBonusPlayer2)) { return(0); // return 0 if player has already earned the bonus. } if (cat < 1 || cat > 6 || playerScores [(int)category] != -1) { return(0); // return 0 if the category is not upper section or was used already. } int sumUpperSection = score; // add the current score for (int i = 1; i <= Rules.DiceSides; i++) { if (playerScores [i] != -1) { sumUpperSection += playerScores [i]; } } if (sumUpperSection >= Rules.UpperSectionThreshold) { return(Rules.UpperSectionBonus); } return(0); }
// Returns what a player has scored in given category. public int GetPlayerScore(Player player, Rules.Category category) { if (player == Player.Player1) { return(CategoriesPlayer1 [(int)category]); } else { return(CategoriesPlayer2 [(int)category]); } }
// Submit score private void SubmitScore(int index) { YahtzeeGame.Player player = Game.ActivePlayer; Rules.Category category = (Rules.Category)index; Label scoreLabel; DiceContainer container; int [] finalDice = new int [DiceSet.DiceCount]; for (int i = 0; i < DiceSet.DiceCount; i++) { finalDice [i] = Game.Dice [i]; } if (Game.SubmitScore(category)) { SelectCategoryButtons [index].Visible = false; if (player == YahtzeeGame.Player.Player1) { scoreLabel = Player1Scores [index]; container = Player1Categories [index]; } else { scoreLabel = Player2Scores [index]; container = Player2Categories [index]; } for (int i = 0; i < DiceSet.DiceCount; i++) { container.SetDie(i, DiceImages [finalDice [i]]); } UpdateScores(); DisableButtons(); SetButtonPositions(); CurrentDice.ClearDice(); UpdateStatus(); LabelWarning.Text = ""; if (Game.Round < Rules.TotalRounds) { ButtonRoll.Enabled = true; } else { ButtonRoll.Enabled = false; string date = System.DateTime.Now.ToShortDateString() + " " + System.DateTime.Now.ToShortTimeString(); HighScores.SubmitScore(FormInputPlayerNames.Player1Name, Game.ScorePlayer1, date); HighScores.SubmitScore(FormInputPlayerNames.Player2Name, Game.ScorePlayer2, date); } } }
// Score the dice according to category from Yahtzee public int ScoreDice(Rules.Category c) { switch (c) { case Rules.Category.Aces: return(ScoreNumbers(1)); case Rules.Category.Twos: return(ScoreNumbers(2)); case Rules.Category.Threes: return(ScoreNumbers(3)); case Rules.Category.Fours: return(ScoreNumbers(4)); case Rules.Category.Fives: return(ScoreNumbers(5)); case Rules.Category.Sixes: return(ScoreNumbers(6)); case Rules.Category.ThreeOfAKind: return(ScoreThreeOfAKind()); case Rules.Category.FourOfAKind: return(ScoreFourOfAKind()); case Rules.Category.FullHouse: return(ScoreFullHouse()); case Rules.Category.SmallStraight: return(ScoreSmallStraight()); case Rules.Category.LargeStraight: return(ScoreLargeStraight()); case Rules.Category.Yahtzee: return(ScoreYahtzee()); case Rules.Category.Chance: return(ScoreChance()); default: return(-10); } }
// Add the score of the dice in selected category to active player's total score. // Then end the turn. public bool SubmitScore(Rules.Category category) { Tuple <int, int> score = ScoreDice(category); if (RollsUsed > 0 && Round < Rules.TotalRounds) { if (ActivePlayer == Player.Player1) { if (CategoriesPlayer1 [(int)category] != -1) { return(false); // cancel if player 1 has already used scoring category } if (CalculateUpperSectionBonus(category, score.Item1, CategoriesPlayer1) > 0) { UpperBonusPlayer1 = true; // register player 1 has received upper sect. bonus } CategoriesPlayer1 [(int)category] = score.Item1; BonusPlayer1 += score.Item2; ScorePlayer1 += score.Item1 + score.Item2; ActivePlayer = Player.Player2; } else { if (CategoriesPlayer2 [(int)category] != -1) { return(false); // cancel if player 2 has already used scoring category } if (CalculateUpperSectionBonus(category, score.Item1, CategoriesPlayer2) > 0) { UpperBonusPlayer2 = true; // register player 2 has received upper sect. bonus } CategoriesPlayer2 [(int)category] = score.Item1; BonusPlayer2 += score.Item2; ScorePlayer2 += score.Item1 + score.Item2; ActivePlayer = Player.Player1; Round++; } Dice.Reset(); RollsUsed = 0; return(true); } return(false); }
// Evaluate the score + potential bonus of the current dice for given category. public Tuple <int, int> ScoreDice(Rules.Category category) { int [] playerScores = (ActivePlayer == Player.Player1) ? CategoriesPlayer1 : CategoriesPlayer2; int score = Dice.ScoreDice(category); int bonus = 0; if (Dice.ScoreDice(Rules.Category.Yahtzee) > 0 && // if player rolled a yahtzee playerScores [(int)Rules.Category.Yahtzee] > 0) // and already scored one, { // add bonus bonus = Rules.YahtzeeBonus; int diceValue = Dice [0]; if (playerScores [diceValue] != -1) // if upper section for dice value used { switch (category) // allow the yahtzee as joker for some lower section categories { case Rules.Category.FullHouse: score = Rules.ScoreFullHouse; break; case Rules.Category.SmallStraight: score = Rules.ScoreSmallStraight; break; case Rules.Category.LargeStraight: score = Rules.ScoreLargeStraight; break; default: break; } } } bonus += CalculateUpperSectionBonus(category, score, playerScores); return(new Tuple <int, int> (score, bonus)); }