diff --git a/src/main/java/io/takima/Yatzy.java b/src/main/java/io/takima/Yatzy.java index 04d59cad749de10f9afe70ab0d13bda33d495a84..b240a0f26030d1cfb040d27f84919bb6ee9e1b73 100644 --- a/src/main/java/io/takima/Yatzy.java +++ b/src/main/java/io/takima/Yatzy.java @@ -1,16 +1,10 @@ package io.takima; -public class Yatzy { +public final class Yatzy { + private final int[] dice; - protected int[] dice; - - public Yatzy(int d1, int d2, int d3, int d4, int _5) { - dice = new int[5]; - dice[0] = d1; - dice[1] = d2; - dice[2] = d3; - dice[3] = d4; - dice[4] = _5; + public Yatzy(int d1, int d2, int d3, int d4, int d5) { + dice = new int[] { d1, d2, d3, d4, d5 }; } public static int chance(int d1, int d2, int d3, int d4, int d5) { @@ -25,62 +19,94 @@ public class Yatzy { public static int yatzy(int... dice) { int[] counts = new int[6]; - for (int die : dice) + for (int die : dice) { counts[die - 1]++; - for (int i = 0; i != 6; i++) - if (counts[i] == 5) + } + for (int i = 0; i != 6; i++) { + if (counts[i] == 5) { return 50; + } + } return 0; } public static int ones(int d1, int d2, int d3, int d4, int d5) { int sum = 0; - if (d1 == 1) sum++; - if (d2 == 1) sum++; - if (d3 == 1) sum++; - if (d4 == 1) sum++; - if (d5 == 1) + if (d1 == 1) { + sum++; + } + if (d2 == 1) { + sum++; + } + if (d3 == 1) { + sum++; + } + if (d4 == 1) { sum++; + } + if (d5 == 1) { + sum++; + } return sum; } public static int twos(int d1, int d2, int d3, int d4, int d5) { int sum = 0; - if (d1 == 2) sum += 2; - if (d2 == 2) sum += 2; - if (d3 == 2) sum += 2; - if (d4 == 2) sum += 2; - if (d5 == 2) sum += 2; + if (d1 == 2) { + sum += 2; + } + if (d2 == 2) { + sum += 2; + } + if (d3 == 2) { + sum += 2; + } + if (d4 == 2) { + sum += 2; + } + if (d5 == 2) { + sum += 2; + } return sum; } public static int threes(int d1, int d2, int d3, int d4, int d5) { - int s; - s = 0; - if (d1 == 3) s += 3; - if (d2 == 3) s += 3; - if (d3 == 3) s += 3; - if (d4 == 3) s += 3; - if (d5 == 3) s += 3; + int s = 0; + if (d1 == 3) { + s += 3; + } + if (d2 == 3) { + s += 3; + } + if (d3 == 3) { + s += 3; + } + if (d4 == 3) { + s += 3; + } + if (d5 == 3) { + s += 3; + } return s; } - public static int score_pair(int d1, int d2, int d3, int d4, int d5) { + public static int pair(int d1, int d2, int d3, int d4, int d5) { int[] counts = new int[6]; counts[d1 - 1]++; counts[d2 - 1]++; counts[d3 - 1]++; counts[d4 - 1]++; counts[d5 - 1]++; - int at; - for (at = 0; at != 6; at++) - if (counts[6 - at - 1] >= 2) + for (int at = 0; at != 6; at++) { + if (counts[6 - at - 1] >= 2) { return (6 - at) * 2; + } + } return 0; } - public static int two_pair(int d1, int d2, int d3, int d4, int d5) { + public static int twoPair(int d1, int d2, int d3, int d4, int d5) { int[] counts = new int[6]; counts[d1 - 1]++; counts[d2 - 1]++; @@ -89,116 +115,121 @@ public class Yatzy { counts[d5 - 1]++; int n = 0; int score = 0; - for (int i = 0; i < 6; i += 1) + for (int i = 0; i < 6; i += 1) { if (counts[6 - i - 1] >= 2) { n++; score += (6 - i); } - if (n == 2) + } + if (n == 2) { return score * 2; - else + } else { return 0; + } } - public static int four_of_a_kind(int _1, int _2, int d3, int d4, int d5) { - int[] tallies; - tallies = new int[6]; - tallies[_1 - 1]++; - tallies[_2 - 1]++; - tallies[d3 - 1]++; - tallies[d4 - 1]++; - tallies[d5 - 1]++; - for (int i = 0; i < 6; i++) - if (tallies[i] >= 4) + public static int fourOfAKind(int d1, int d2, int d3, int d4, int d5) { + int[] counts; + counts = new int[6]; + counts[d1 - 1]++; + counts[d2 - 1]++; + counts[d3 - 1]++; + counts[d4 - 1]++; + counts[d5 - 1]++; + for (int i = 0; i < 6; i++) { + if (counts[i] >= 4) { return (i + 1) * 4; + } + } return 0; } - public static int three_of_a_kind(int d1, int d2, int d3, int d4, int d5) { - int[] t; - t = new int[6]; - t[d1 - 1]++; - t[d2 - 1]++; - t[d3 - 1]++; - t[d4 - 1]++; - t[d5 - 1]++; - for (int i = 0; i < 6; i++) - if (t[i] >= 3) + public static int threeOfAKind(int d1, int d2, int d3, int d4, int d5) { + int[] counts; + counts = new int[6]; + counts[d1 - 1]++; + counts[d2 - 1]++; + counts[d3 - 1]++; + counts[d4 - 1]++; + counts[d5 - 1]++; + for (int i = 0; i < 6; i++) { + if (counts[i] >= 3) { return (i + 1) * 3; + } + } return 0; } public static int smallStraight(int d1, int d2, int d3, int d4, int d5) { - int[] tallies; - tallies = new int[6]; - tallies[d1 - 1] += 1; - tallies[d2 - 1] += 1; - tallies[d3 - 1] += 1; - tallies[d4 - 1] += 1; - tallies[d5 - 1] += 1; - if (tallies[0] == 1 && - tallies[1] == 1 && - tallies[2] == 1 && - tallies[3] == 1 && - tallies[4] == 1) + int[] counts; + counts = new int[6]; + counts[d1 - 1] += 1; + counts[d2 - 1] += 1; + counts[d3 - 1] += 1; + counts[d4 - 1] += 1; + counts[d5 - 1] += 1; + if (counts[0] == 1 && + counts[1] == 1 && + counts[2] == 1 && + counts[3] == 1 && + counts[4] == 1) { return 15; + } return 0; } public static int largeStraight(int d1, int d2, int d3, int d4, int d5) { - int[] tallies; - tallies = new int[6]; - tallies[d1 - 1] += 1; - tallies[d2 - 1] += 1; - tallies[d3 - 1] += 1; - tallies[d4 - 1] += 1; - tallies[d5 - 1] += 1; - if (tallies[1] == 1 && - tallies[2] == 1 && - tallies[3] == 1 && - tallies[4] == 1 - && tallies[5] == 1) + int[] counts; + counts = new int[6]; + counts[d1 - 1] += 1; + counts[d2 - 1] += 1; + counts[d3 - 1] += 1; + counts[d4 - 1] += 1; + counts[d5 - 1] += 1; + if (counts[1] == 1 && + counts[2] == 1 && + counts[3] == 1 && + counts[4] == 1 + && counts[5] == 1) { return 20; + } return 0; } public static int fullHouse(int d1, int d2, int d3, int d4, int d5) { - int[] tallies; - boolean _2 = false; - int i; - int _2_at = 0; - boolean _3 = false; - int _3_at = 0; - - - tallies = new int[6]; - tallies[d1 - 1] += 1; - tallies[d2 - 1] += 1; - tallies[d3 - 1] += 1; - tallies[d4 - 1] += 1; - tallies[d5 - 1] += 1; - - for (i = 0; i != 6; i += 1) - if (tallies[i] == 2) { - _2 = true; - _2_at = i + 1; + boolean hasPair = false; + int pairValue = 0; + boolean hasTriplet = false; + int tripletValue = 0; + + + int[] counts = new int[6]; + counts[d1 - 1] += 1; + counts[d2 - 1] += 1; + counts[d3 - 1] += 1; + counts[d4 - 1] += 1; + counts[d5 - 1] += 1; + + for (int i = 0; i != 6; i += 1) + if (counts[i] == 2) { + hasPair = true; + pairValue = i + 1; } - for (i = 0; i != 6; i += 1) - if (tallies[i] == 3) { - _3 = true; - _3_at = i + 1; + for (int i = 0; i != 6; i += 1) + if (counts[i] == 3) { + hasTriplet = true; + tripletValue = i + 1; } - if (_2 && _3) - return _2_at * 2 + _3_at * 3; + if (hasPair && hasTriplet) + return pairValue * 2 + tripletValue * 3; else return 0; } public int fours() { - int sum; - sum = 0; + int sum = 0; for (int at = 0; at != 5; at++) { if (dice[at] == 4) { sum += 4; @@ -209,18 +240,21 @@ public class Yatzy { public int fives() { int s = 0; - int i; - for (i = 0; i < dice.length; i++) - if (dice[i] == 5) - s = s + 5; + for (int i = 0; i < dice.length; i++) { + if (dice[i] == 5) { + s += 5; + } + } return s; } public int sixes() { int sum = 0; - for (int at = 0; at < dice.length; at++) - if (dice[at] == 6) + for (int at = 0; at < dice.length; at++) { + if (dice[at] == 6) { sum = sum + 6; + } + } return sum; } } diff --git a/src/test/java/io/takima/YatzyTest.java b/src/test/java/io/takima/YatzyTest.java index a8f32145a9e7a543cdf37f35236df54b9e95ac2b..75539a722c7b1b1c6b158a5a02c3234b00b155e1 100644 --- a/src/test/java/io/takima/YatzyTest.java +++ b/src/test/java/io/takima/YatzyTest.java @@ -2,113 +2,173 @@ package io.takima; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; class YatzyTest { + @Test + void chanceShouldSumAllDices() { + assertAll( + () -> assertEquals(15, Yatzy.chance(2, 3, 4, 5, 1)), + () -> assertEquals(16, Yatzy.chance(3, 3, 4, 5, 1)) + ); + } @Test - void chance_scores_sum_of_all_dice() { - int expected = 15; - int actual = Yatzy.chance(2, 3, 4, 5, 1); - assertEquals(expected, actual); - assertEquals(16, Yatzy.chance(3, 3, 4, 5, 1)); + void yatzyShouldScoreFiftyIfAllDicesHaveTheSameValue() { + assertAll( + () -> assertEquals(50, Yatzy.yatzy(4, 4, 4, 4, 4)), + () -> assertEquals(50, Yatzy.yatzy(6, 6, 6, 6, 6)) + ); } @Test - void yatzy_scores_50() { - int expected = 50; - int actual = Yatzy.yatzy(4, 4, 4, 4, 4); - assertEquals(expected, actual); - assertEquals(50, Yatzy.yatzy(6, 6, 6, 6, 6)); + void yatzyShouldScoreZeroIfAllDicesHaveNotTheSameValue() { assertEquals(0, Yatzy.yatzy(6, 6, 6, 6, 3)); } @Test - void test_1s() { - assertTrue(Yatzy.ones(1, 2, 3, 4, 5) == 1); - assertEquals(2, Yatzy.ones(1, 2, 1, 4, 5)); - assertEquals(0, Yatzy.ones(6, 2, 2, 4, 5)); - assertEquals(4, Yatzy.ones(1, 2, 1, 1, 1)); + void onesShouldSumAllOneDices() { + assertAll( + () -> assertEquals(1, Yatzy.ones(1, 2, 3, 4, 5)), + () -> assertEquals(2, Yatzy.ones(1, 2, 1, 4, 5)), + () -> assertEquals(0, Yatzy.ones(6, 2, 2, 4, 5)), + () -> assertEquals(4, Yatzy.ones(1, 2, 1, 1, 1)) + ); + } + + @Test + void twosShouldSumAllTwoDices() { + assertAll( + () -> assertEquals(4, Yatzy.twos(1, 2, 3, 2, 6)), + () -> assertEquals(10, Yatzy.twos(2, 2, 2, 2, 2)) + ); + } + + @Test + void threesShouldSumAllThreeDices() { + assertAll( + () -> assertEquals(6, Yatzy.threes(1, 2, 3, 2, 3)), + () -> assertEquals(12, Yatzy.threes(2, 3, 3, 3, 3)) + ); + } + + @Test + void foursShouldSumAllFourDices() { + assertAll( + () -> assertEquals(12, new Yatzy(4, 4, 4, 5, 5).fours()), + () -> assertEquals(8, new Yatzy(4, 4, 5, 5, 5).fours()), + () -> assertEquals(4, new Yatzy(4, 5, 5, 5, 5).fours()) + ); + } + + @Test + void fivesShouldSumAllFiveDices() { + assertAll( + () -> assertEquals(10, new Yatzy(4, 4, 4, 5, 5).fives()), + () -> assertEquals(15, new Yatzy(4, 4, 5, 5, 5).fives()), + () -> assertEquals(20, new Yatzy(4, 5, 5, 5, 5).fives()) + ); + } + + @Test + void sixesShouldSumAllSixDices() { + assertAll( + () -> assertEquals(0, new Yatzy(4, 4, 4, 5, 5).sixes()), + () -> assertEquals(6, new Yatzy(4, 4, 6, 5, 5).sixes()), + () -> assertEquals(18, new Yatzy(6, 5, 6, 6, 5).sixes()) + ); } @Test - void test_2s() { - assertEquals(4, Yatzy.twos(1, 2, 3, 2, 6)); - assertEquals(10, Yatzy.twos(2, 2, 2, 2, 2)); + void pairShouldSumTheTwoHighestMatchingPair() { + assertAll( + () -> assertEquals(6, Yatzy.pair(3, 4, 3, 5, 6)), + () -> assertEquals(10, Yatzy.pair(5, 3, 3, 3, 5)), + () -> assertEquals(12, Yatzy.pair(5, 3, 6, 6, 5)) + ); } @Test - void test_threes() { - assertEquals(6, Yatzy.threes(1, 2, 3, 2, 3)); - assertEquals(12, Yatzy.threes(2, 3, 3, 3, 3)); + void twoPairShouldSumTheScoreOfAllDiceWhichMatchWithDistinctPair() { + assertAll( + () -> assertEquals(16, Yatzy.twoPair(3, 3, 5, 4, 5)), + () -> assertEquals(16, Yatzy.twoPair(3, 3, 5, 5, 5)) + ); } @Test - void fours_test() { - assertEquals(12, new Yatzy(4, 4, 4, 5, 5).fours()); - assertEquals(8, new Yatzy(4, 4, 5, 5, 5).fours()); - assertEquals(4, new Yatzy(4, 5, 5, 5, 5).fours()); + void twoPairShouldMatchIfThereIsTwoDistinctPair() { + assertEquals(0, Yatzy.twoPair(3, 3, 3, 3, 1)); } @Test - void fives() { - assertEquals(10, new Yatzy(4, 4, 4, 5, 5).fives()); - assertEquals(15, new Yatzy(4, 4, 5, 5, 5).fives()); - assertEquals(20, new Yatzy(4, 5, 5, 5, 5).fives()); + void threeOfAKindShouldSumTheThreeDiceWithTheSameValue() { + assertAll( + () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 4, 5)), + () -> assertEquals(15, Yatzy.threeOfAKind(5, 3, 5, 4, 5)), + () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 5)) + ); } @Test - void sixes_test() { - assertEquals(0, new Yatzy(4, 4, 4, 5, 5).sixes()); - assertEquals(6, new Yatzy(4, 4, 6, 5, 5).sixes()); - assertEquals(18, new Yatzy(6, 5, 6, 6, 5).sixes()); + void threeOfAKindShouldReturnZeroIfThereIsNoThreeDiceWithTheSameValue() { + assertEquals(0, Yatzy.threeOfAKind(3, 3, 4, 5, 6)); } @Test - void one_pair() { - assertEquals(6, Yatzy.score_pair(3, 4, 3, 5, 6)); - assertEquals(10, Yatzy.score_pair(5, 3, 3, 3, 5)); - assertEquals(12, Yatzy.score_pair(5, 3, 6, 6, 5)); + void fourOfAKindShouldSumTheFourDiceWithTheSameValue() { + assertAll( + () -> assertEquals(12, Yatzy.fourOfAKind(3, 3, 3, 3, 5)), + () -> assertEquals(20, Yatzy.fourOfAKind(5, 5, 5, 4, 5)), + () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 3)) + ); } @Test - void two_Pair() { - assertEquals(16, Yatzy.two_pair(3, 3, 5, 4, 5)); - assertEquals(16, Yatzy.two_pair(3, 3, 5, 5, 5)); + void fourOfAKindShouldReturnZeroIfThereIsNoFourDiceWithTheSameValue() { + assertEquals(0, Yatzy.fourOfAKind(2, 2, 2, 5, 5)); } @Test - void three_of_a_kind() { - assertEquals(9, Yatzy.three_of_a_kind(3, 3, 3, 4, 5)); - assertEquals(15, Yatzy.three_of_a_kind(5, 3, 5, 4, 5)); - assertEquals(9, Yatzy.three_of_a_kind(3, 3, 3, 3, 5)); + void smallStraightShouldReturnFifteenIfDiceAreFromOneToFive() { + assertAll( + () -> assertEquals(15, Yatzy.smallStraight(1, 2, 3, 4, 5)), + () -> assertEquals(15, Yatzy.smallStraight(2, 3, 4, 5, 1)) + ); } @Test - void four_of_a_knd() { - assertEquals(12, Yatzy.four_of_a_kind(3, 3, 3, 3, 5)); - assertEquals(20, Yatzy.four_of_a_kind(5, 5, 5, 4, 5)); - assertEquals(9, Yatzy.three_of_a_kind(3, 3, 3, 3, 3)); + void smallStraightShouldReturnZeroIfDicesAreNotFromOneToFive() { + assertAll( + () -> assertEquals(0, Yatzy.smallStraight(1, 2, 2, 4, 5)), + () -> assertEquals(0, Yatzy.smallStraight(2, 3, 4, 5, 6)) + ); } @Test - void smallStraight() { - assertEquals(15, Yatzy.smallStraight(1, 2, 3, 4, 5)); - assertEquals(15, Yatzy.smallStraight(2, 3, 4, 5, 1)); - assertEquals(0, Yatzy.smallStraight(1, 2, 2, 4, 5)); + void largeStraightShouldReturnTwentyIfDicesAreFromTwoToSix() { + assertAll( + () -> assertEquals(20, Yatzy.largeStraight(6, 2, 3, 4, 5)), + () -> assertEquals(20, Yatzy.largeStraight(2, 3, 4, 5, 6)) + ); } @Test - void largeStraight() { - assertEquals(20, Yatzy.largeStraight(6, 2, 3, 4, 5)); - assertEquals(20, Yatzy.largeStraight(2, 3, 4, 5, 6)); - assertEquals(0, Yatzy.largeStraight(1, 2, 2, 4, 5)); + void largeStraightShouldReturnZeroIfDicesAreNotFromTwoToSix() { + assertAll( + () -> assertEquals(0, Yatzy.largeStraight(1, 2, 2, 4, 5)), + () -> assertEquals(0, Yatzy.largeStraight(2, 4, 6, 5, 1)) + ); } @Test - void fullHouse() { + void fullHouseShouldSumDicesIfThereAreATripletAndAPair() { assertEquals(18, Yatzy.fullHouse(6, 2, 2, 2, 6)); + } + + @Test + void fullHouseShouldReturnZeroIfThereIsNotTripletAndPair() { assertEquals(0, Yatzy.fullHouse(2, 3, 4, 5, 6)); } }