public boolean isMatch() { if (shuntsuCount < 4) { return false; } // 雀頭が三元牌の場合はfalse Tile janto = this.janto.getTile(); if (janto.getType() == SANGEN) { return false; } if (!isSituationsNull()) { if (janto == generalSituation.getBakaze()) { return false; } if (janto == personalSituation.getJikaze()) { return false; } } boolean isRyanmen = false; for (Shuntsu shuntsu : shuntsuList) { // 鳴いていた場合もfalse if (shuntsu.isOpen()) { return false; } // 両面待ちならそれを保存しておく if (isRyanmen(shuntsu, last)) { isRyanmen = true; } } return isRyanmen; }
/** * 両面待ちだったかを判定するため 一つ一つの順子と最後の牌について判定する * * @param shuntsu 判定したい順子 * @param last 最後の牌 * @return 両面待ちだったか */ private boolean isRyanmen(Shuntsu shuntsu, Tile last) { // ラスト牌と判定したい順子のtypeが違う場合はfalse if (shuntsu.getTile().getType() != last.getType()) { return false; } int shuntsuNum = shuntsu.getTile().getNumber(); int lastNum = last.getNumber(); if (shuntsuNum == 2 && lastNum == 1) { return true; } if (shuntsuNum == 8 && lastNum == 9) { return true; } int i = shuntsuNum - lastNum; if (i == 1 || i == -1) { return true; } return false; }