diff options
Diffstat (limited to 'server/player.cpp')
-rw-r--r-- | server/player.cpp | 55 |
1 files changed, 4 insertions, 51 deletions
diff --git a/server/player.cpp b/server/player.cpp index 61f5831..4407095 100644 --- a/server/player.cpp +++ b/server/player.cpp @@ -1,5 +1,7 @@ #include "game.h" +#include "hand.h" + void Game::Player::round_start() { // Reset contents. hand.clear(); @@ -151,64 +153,15 @@ bool Game::Player::can_kan(Tile tile, int target) { return false; } -//! Recursive function that eats away sets from a hand to determine if it's valid or not. -bool complete_hand(Tiles tiles, bool pair_eaten = false) { - if(!tiles) { - return true; // All tiles eaten. - } - - if(tiles[0] == tiles[1]) { - if(!pair_eaten) { - // We can eat a pair of tiles. - Tiles t = tiles; - t.erase(t.begin(), t.begin() + 2); - if(complete_hand(t, true)) { - return true; - } - } - - if(tiles[1] == tiles[2]) { - // We can eat a pon of tiles. - Tiles t = tiles; - t.erase(t.begin(), t.begin() + 3); - if(complete_hand(t, pair_eaten)) { - return true; - } - } - } - - 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 false; - } - - 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 complete_hand(tiles, pair_eaten); - } - } - - return false; -} - bool Game::Player::can_tsumo() { - return complete_hand(hand); + return Hand::agari(hand); } bool Game::Player::can_ron(Tile tile) { Tiles tiles = hand; tiles.push_back(tile); tiles.sort(); - return complete_hand(tiles); + return Hand::agari(tiles); } void Game::Player::draw(Tile tile) { |