summaryrefslogtreecommitdiff
path: root/server/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server/player.cpp')
-rw-r--r--server/player.cpp55
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) {