From 6375f1ec6f7ba030cbe8a8d7c36dccdee79b62fc Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Sat, 1 Feb 2025 07:04:28 -0500 Subject: [PATCH] More ergonomic teyaku --- main.c | 14 ++++++------ teyaku.c | 69 ++++++++++++++++++++++++++++++++++++++------------------ teyaku.h | 23 +++++++++++++++++++ 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/main.c b/main.c index 739ac01..5fb6559 100644 --- a/main.c +++ b/main.c @@ -16,13 +16,13 @@ int main(int argc, char** argv) { SetTargetFPS(60); Hand h; - h.cards[0] = (Card) { 1, CHAFF, RIBBON_NONE, JANUARY, (Vector2) { 0, 0 } }; - h.cards[1] = (Card) { 1, CHAFF, RIBBON_NONE, JANUARY, (Vector2) { 0, 0 } }; - h.cards[2] = (Card) { 1, CHAFF, RIBBON_NONE, JANUARY, (Vector2) { 0, 0 } }; - h.cards[3] = (Card) { 1, ANIMAL, RIBBON_NONE, JANUARY, (Vector2) { 0, 0 } }; - h.cards[4] = (Card) { 1, ANIMAL, RIBBON_NONE, MAY, (Vector2) { 0, 0 } }; - h.cards[5] = (Card) { 1, CHAFF, RIBBON_BLUE, MAY, (Vector2) { 0, 0 } }; - h.cards[6] = (Card) { 1, CHAFF, RIBBON_PLAIN, MAY, (Vector2) { 0, 0 } }; + h.cards[0] = (Card) { 1, BRIGHT, RIBBON_NONE, NOVEMBER, (Vector2) { 0, 0 } }; + h.cards[1] = (Card) { 1, ANIMAL, RIBBON_NONE, NOVEMBER, (Vector2) { 0, 0 } }; + h.cards[2] = (Card) { 1, RIBBON, RIBBON_PLAIN, NOVEMBER, (Vector2) { 0, 0 } }; + h.cards[3] = (Card) { 1, CHAFF, RIBBON_NONE, NOVEMBER, (Vector2) { 0, 0 } }; + h.cards[4] = (Card) { 1, CHAFF, RIBBON_NONE, DECEMBER, (Vector2) { 0, 0 } }; + h.cards[5] = (Card) { 1, CHAFF, RIBBON_NONE, DECEMBER, (Vector2) { 0, 0 } }; + h.cards[6] = (Card) { 1, CHAFF, RIBBON_NONE, DECEMBER, (Vector2) { 0, 0 } }; h.count = 7; printf("Teyaku: %d\n", calculate_teyaku(h)); diff --git a/teyaku.c b/teyaku.c index 77e7872..0848959 100644 --- a/teyaku.c +++ b/teyaku.c @@ -1,8 +1,9 @@ +#include "teyaku.h" #include "card.h" -int calculate_set_teyaku(Hand h) { +SetTeyaku calculate_set_teyaku(Hand h) { int month_counts[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - int month_stands[12] = { 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1 }; // TODO Pawlonia is weird + int month_stands[12] = { 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1 }; for (int i = 0; i < h.count; i++) { Card c = h.cards[i]; month_counts[c.month]++; @@ -13,7 +14,7 @@ int calculate_set_teyaku(Hand h) { if (month_counts[i] == 4) { four_of_a_kind++; } else if (month_counts[i] == 3) { - if (month_stands[i]) standing_triplets++; + if (month_stands[i]) standing_triplets++; // TODO Pawlonia is weird else triplets++; } else if (month_counts[i] == 2) { pairs++; @@ -21,21 +22,21 @@ int calculate_set_teyaku(Hand h) { } int total_triplets = triplets + standing_triplets; - if (four_of_a_kind && total_triplets) return 20; // 四三 - else if (four_of_a_kind && pairs) return 8; // 一二四 - else if (standing_triplets == 2) return 8; // 二立三本 - else if (total_triplets && pairs == 2) return 7; // 跳剣 - else if (triplets == 1 && standing_triplets == 1) return 7; // 三本立三本 - else if (four_of_a_kind) return 6; // 手四 - else if (triplets == 2) return 6; // 二三本 - else if (pairs == 3) return 4; // 二三本 - else if (standing_triplets) return 3; // 立三本 - else if (triplets) return 2; // 三本 + if (four_of_a_kind && total_triplets) return FOUR_THREE; + else if (four_of_a_kind && pairs) return ONE_TWO_FOUR; + else if (standing_triplets == 2) return TWO_STANDING_TRIPLETS; + else if (total_triplets && pairs == 2) return TRIPLET_AND_TWO_PAIRS; + else if (triplets == 1 && standing_triplets == 1) return TRIPLET_AND_STANDING_TRIPLET; + else if (four_of_a_kind) return FOUR_OF_A_KIND; + else if (triplets == 2) return TWO_TRIPLETS; + else if (pairs == 3) return THREE_PAIRS; + else if (standing_triplets) return STANDING_TRIPLET; + else if (triplets) return TRIPLET; - return 0; + return SET_TEYAKU_NONE; } -int calculate_chaff_teyaku(Hand h) { +ChaffTeyaku calculate_chaff_teyaku(Hand h) { int ribbons = 0; int animals = 0; int brights = 0; @@ -50,14 +51,38 @@ int calculate_chaff_teyaku(Hand h) { else chaff++; } - if (chaff == 7) return 4; // 空素 - Empty Hand - else if (chaff == 6 && brights == 1) return 4; // 光一 - One Bright - else if (chaff == 6 && animals == 1) return 3; // 十一 - One Animal - else if (chaff == 6 && ribbons == 1) return 3; // 短一 - One Ribbon - else if (ribbons >= 2 && chaff == 7 - ribbons) return 2; // 赤 - Red - else return 0; + if (chaff == 7) return EMPTY_HAND; + else if (chaff == 6 && brights == 1) return ONE_BRIGHT; + else if (chaff == 6 && animals == 1) return ONE_ANIMAL; + else if (chaff == 6 && ribbons == 1) return ONE_RIBBON; + else if (ribbons >= 2 && chaff == 7 - ribbons) return CHAFF_TEYAKU_RED; + + return CHAFF_TEYAKU_NONE; +} + +static int set_teyaku_points_array[11] = { 0, 2, 3, 6, 7, 8, 4, 6, 7, 8, 20 }; +static char *set_teyaku_english_array[11] = { "None", "Triplet", "Standing Triplet", "Two Triplets", "Triplet and Standing Triplet", "Two Standing Triplets", "Three Pairs", "Four of a Kind", "Triplet and Two Pairs", "One-Two-Four", "Four-Three" }; +static int chaff_teyaku_points_array[6] = { 0, 2, 3, 3, 4, 4 }; +static char *chaff_teyaku_english_array[6] = { "None", "Red", "One Ribbon", "One Animal", "One Bright", "Empty Hand" }; + +int set_teyaku_points(Hand h) { + return set_teyaku_points_array[calculate_set_teyaku(h)]; +} + +int chaff_teyaku_points(Hand h) { + return chaff_teyaku_points_array[calculate_chaff_teyaku(h)]; +} + +char *set_teyaku_english(Hand h) { + return set_teyaku_english_array[calculate_set_teyaku(h)]; +} + +char *chaff_teyaku_english(Hand h) { + return chaff_teyaku_english_array[calculate_chaff_teyaku(h)]; } int calculate_teyaku(Hand h) { - return calculate_chaff_teyaku(h) + calculate_set_teyaku(h); + if (calculate_chaff_teyaku(h)) printf("%s\n", chaff_teyaku_english(h)); + if (calculate_set_teyaku(h)) printf("%s\n", set_teyaku_english(h)); + return chaff_teyaku_points(h) + set_teyaku_points(h); } diff --git a/teyaku.h b/teyaku.h index e14da25..31e45d3 100644 --- a/teyaku.h +++ b/teyaku.h @@ -3,6 +3,29 @@ #include "card.h" +typedef enum SetTeyaku { + SET_TEYAKU_NONE, + TRIPLET, + STANDING_TRIPLET, + TWO_TRIPLETS, + TRIPLET_AND_STANDING_TRIPLET, + TWO_STANDING_TRIPLETS, + THREE_PAIRS, + FOUR_OF_A_KIND, + TRIPLET_AND_TWO_PAIRS, + ONE_TWO_FOUR, + FOUR_THREE, +} SetTeyaku; + +typedef enum ChaffTeyaku { + CHAFF_TEYAKU_NONE, + CHAFF_TEYAKU_RED, + ONE_RIBBON, + ONE_ANIMAL, + ONE_BRIGHT, + EMPTY_HAND, +} ChaffTeyaku; + int calculate_teyaku(Hand h); #endif