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;
  }