From f0ea41ca1566ff56f6812fb3ea8a731f58fde95e Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Thu, 2 Dec 2010 02:02:57 +0100 Subject: Added tenpai test to allow calling riichi. --- server/hand.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 2 deletions(-) (limited to 'server/hand.cpp') diff --git a/server/hand.cpp b/server/hand.cpp index 393a6c0..abdeb4b 100644 --- a/server/hand.cpp +++ b/server/hand.cpp @@ -4,6 +4,10 @@ bool Hand::agari(const Tiles& tiles) { return basic_format(tiles); } +bool Hand::tenpai(const Tiles& tiles) { + return basic_format_tenpai(tiles); +} + bool Hand::basic_format(const Tiles& tiles, bool pair_eaten) { if(!tiles) { return true; // All tiles eaten. @@ -34,6 +38,90 @@ bool Hand::basic_format(const Tiles& tiles, bool pair_eaten) { return false; } +bool Hand::basic_format_tenpai(const Tiles& tiles, bool pair_eaten, bool wait_eaten) { + if(!tiles) { + return true; + } + + if(!pair_eaten && !wait_eaten) { + if(basic_format_tenpai(eat_tanki(tiles), true, true)) { + return true; + } + } + + if(tiles.size() < 2) { + return false; + } + + if(!pair_eaten) { + if(Tiles rest = eat_pair(tiles)) { + if(basic_format_tenpai(rest, true, wait_eaten)) { + return true; + } + } + } + + if(!wait_eaten) { + if(Tiles rest = eat_chi_wait(tiles)) { + if(basic_format_tenpai(rest, pair_eaten, true)) { + return true; + } + } + } + + if(tiles.size() < 3) { + return false; + } + + if(Tiles rest = eat_pon(tiles)) { + if(basic_format_tenpai(rest, pair_eaten, wait_eaten)) { + return true; + } + } + + if(Tiles rest = eat_chi(tiles)) { + return basic_format_tenpai(rest, pair_eaten, wait_eaten); + } + + return false; +} + +Tiles Hand::eat_tanki(Tiles tiles) { + tiles.erase(tiles.begin()); + return tiles; +} + +Tiles Hand::eat_chi_wait(Tiles tiles) { + Tile::Set set = tiles.front().get_set(); + int num = tiles.front().get_num(); + + if(set == Tile::Honor || num > 8) { + return Tiles(); + } + + // Look for T+1. + Tiles::iterator it = std::find(tiles.begin(), tiles.end(), Tile(set, num + 1)); + if(it != tiles.end()) { + tiles.erase(it); + tiles.erase(tiles.begin()); + return tiles; + } + + if(num > 7) { + return Tiles(); + } + + // Look for T+2. + it = std::find(tiles.begin(), tiles.end(), Tile(set, num + 2)); + if(it != tiles.end()) { + tiles.erase(it); + tiles.erase(tiles.begin()); + return tiles; + } + + return Tiles(); +} + Tiles Hand::eat_pair(Tiles tiles) { if(tiles[0] == tiles[1]) { tiles.erase(tiles.begin(), tiles.begin() + 2); @@ -51,8 +139,8 @@ Tiles Hand::eat_pon(Tiles tiles) { } Tiles Hand::eat_chi(Tiles tiles) { - Tile::Set set = tiles[0].get_set(); - int num = tiles[0].get_num(); + Tile::Set set = tiles.front().get_set(); + int num = tiles.front().get_num(); if(set == Tile::Honor || num > 7) { // Can't be chi-ed. -- cgit v1.2.3