From 44e1ff4182f6983f2f363f12ff12970749ae8b46 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Wed, 1 Dec 2010 15:23:25 +0100 Subject: Move hand calculations to a new file. --- server/hand.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 server/hand.cpp (limited to 'server/hand.cpp') diff --git a/server/hand.cpp b/server/hand.cpp new file mode 100644 index 0000000..393a6c0 --- /dev/null +++ b/server/hand.cpp @@ -0,0 +1,76 @@ +#include "hand.h" + +bool Hand::agari(const Tiles& tiles) { + return basic_format(tiles); +} + +bool Hand::basic_format(const Tiles& tiles, bool pair_eaten) { + if(!tiles) { + return true; // All tiles eaten. + } + + if(!pair_eaten) { + if(Tiles rest = eat_pair(tiles)) { + if(basic_format(rest, true)) { + return true; + } + } + } + + if(tiles.size() < 3) { + return false; + } + + if(Tiles rest = eat_pon(tiles)) { + if(basic_format(rest, pair_eaten)) { + return true; + } + } + + if(Tiles rest = eat_chi(tiles)) { + return basic_format(rest, pair_eaten); + } + + return false; +} + +Tiles Hand::eat_pair(Tiles tiles) { + if(tiles[0] == tiles[1]) { + tiles.erase(tiles.begin(), tiles.begin() + 2); + return tiles; + } + return Tiles(); +} + +Tiles Hand::eat_pon(Tiles tiles) { + if(tiles[0] == tiles[2]) { + tiles.erase(tiles.begin(), tiles.begin() + 3); + return tiles; + } + return Tiles(); +} + +Tiles Hand::eat_chi(Tiles tiles) { + Tile::Set set = tiles[0].get_set(); + int num = tiles[0].get_num(); + + if(set == Tile::Honor || num > 7) { + // Can't be chi-ed. + return Tiles(); + } + + Tiles::iterator it1 = std::find(tiles.begin(), tiles.end(), Tile(set, num + 1)); + if(it1 != tiles.end()) { + Tiles::iterator it2 = std::find(tiles.begin(), tiles.end(), Tile(set, num + 2)); + if(it2 != tiles.end()) { + // We can eat a chi of tiles. + tiles.erase(it2); + tiles.erase(it1); + tiles.erase(tiles.begin()); + return tiles; + } + } + return Tiles(); +} + + -- cgit v1.2.3