Example #1
0
def test_calculate_suit_tiles_value_and_dora():
    table = Table()
    table.dora_indicators = [string_to_136_tile(sou="9")]
    player = table.player
    table.has_aka_dora = False

    tile = string_to_136_tile(sou="1")
    option = DiscardOption(player, tile, 0, [], 0)
    assert option.valuation == (DiscardOption.DORA_VALUE + 110)

    # double dora
    table.dora_indicators = [
        string_to_136_tile(sou="9"),
        string_to_136_tile(sou="9")
    ]
    tile = string_to_136_tile(sou="1")
    option = DiscardOption(player, tile, 0, [], 0)
    assert option.valuation == ((DiscardOption.DORA_VALUE * 2) + 110)

    # tile close to dora
    table.dora_indicators = [string_to_136_tile(sou="9")]
    tile = string_to_136_tile(sou="2")
    option = DiscardOption(player, tile, 0, [], 0)
    assert option.valuation == (DiscardOption.DORA_FIRST_NEIGHBOUR + 120)

    # tile not far away from dora
    table.dora_indicators = [string_to_136_tile(sou="9")]
    tile = string_to_136_tile(sou="3")
    option = DiscardOption(player, tile, 0, [], 0)
    assert option.valuation == (DiscardOption.DORA_SECOND_NEIGHBOUR + 140)

    # tile from other suit
    table.dora_indicators = [string_to_136_tile(sou="9")]
    tile = string_to_136_tile(man="3")
    option = DiscardOption(player, tile, 0, [], 0)
    assert option.valuation == 140
Example #2
0
def test_choose_tanki_with_kabe():
    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="119", pin="224477", man="5669"),
        [string_to_136_tile(sou="8")],
        string_to_136_tile(man="5"),
        "9m",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="119", pin="224477", man="5669"),
        [string_to_136_tile(man="8")],
        string_to_136_tile(man="5"),
        "9s",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="118", pin="224477", man="5668"),
        [string_to_136_tile(sou="7")],
        string_to_136_tile(man="5"),
        "8m",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="118", pin="224477", man="5668"),
        [string_to_136_tile(man="7")],
        string_to_136_tile(man="5"),
        "8s",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="117", pin="224477", man="1157"),
        [string_to_136_tile(sou="6"),
         string_to_136_tile(sou="9")],
        string_to_136_tile(man="5"),
        "7m",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="117", pin="224477", man="1157"),
        [string_to_136_tile(man="6"),
         string_to_136_tile(man="9")],
        string_to_136_tile(man="5"),
        "7s",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="116", pin="224477", man="1126"),
        [string_to_136_tile(sou="5"),
         string_to_136_tile(sou="7")],
        string_to_136_tile(man="2"),
        "6m",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="116", pin="224477", man="1126"),
        [string_to_136_tile(man="5"),
         string_to_136_tile(man="7")],
        string_to_136_tile(man="2"),
        "6s",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="115", pin="224477", man="1125"),
        [string_to_136_tile(sou="4"),
         string_to_136_tile(sou="6")],
        string_to_136_tile(man="2"),
        "5m",
    )

    _choose_tanki_with_kabe_helper(
        string_to_136_array(sou="115", pin="224477", man="1125"),
        [string_to_136_tile(man="4"),
         string_to_136_tile(man="6")],
        string_to_136_tile(man="2"),
        "5s",
    )
Example #3
0
def test_open_hand_and_discard_tiles_logic_advanced():
    # we should choose between one of the ryanmens to discard
    # in this case - discard the one that leads us to atodzuke and has less tanyao ukeire
    # despite the fact that general ukeire is higher
    table = _make_table()
    table.add_discarded_tile(2, string_to_136_tile(pin="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(pin="7"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="7"), False)

    tiles = string_to_136_array(man="236777", sou="56", pin="22256")
    table.player.init_hand(tiles)
    meld = make_meld(MeldPrint.PON, pin="222")
    table.player.add_called_meld(meld)
    tile = string_to_136_tile(man="6")
    table.player.draw_tile(tile)
    tile_to_discard, _ = table.player.discard_tile()
    assert tiles_to_string([tile_to_discard]) == "2m" or tiles_to_string(
        [tile_to_discard]) == "3m"

    # now same situation, but better ryanmen is no atodzuke
    table = _make_table()
    table.add_discarded_tile(2, string_to_136_tile(pin="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(pin="7"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="7"), False)

    tiles = string_to_136_array(man="346777", sou="56", pin="22256")
    table.player.init_hand(tiles)
    meld = make_meld(MeldPrint.PON, pin="222")
    table.player.add_called_meld(meld)
    tile = string_to_136_tile(man="6")
    table.player.draw_tile(tile)
    tile_to_discard, _ = table.player.discard_tile()
    assert (tiles_to_string([tile_to_discard]) == "5s"
            or tiles_to_string([tile_to_discard]) == "6s"
            or tiles_to_string([tile_to_discard]) == "5p"
            or tiles_to_string([tile_to_discard]) == "6p")

    # now same situation as the first one, but ryanshanten
    table = _make_table()
    table.add_discarded_tile(2, string_to_136_tile(pin="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(pin="7"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="4"), False)
    table.add_discarded_tile(2, string_to_136_tile(sou="7"), False)
    table.add_discarded_tile(2, string_to_136_tile(man="5"), False)
    table.add_discarded_tile(2, string_to_136_tile(man="8"), False)

    tiles = string_to_136_array(man="2367", sou="2356", pin="22256")
    table.player.init_hand(tiles)
    meld = make_meld(MeldPrint.PON, pin="222")
    table.player.add_called_meld(meld)
    tile = string_to_136_tile(man="8")
    table.player.draw_tile(tile)
    tile_to_discard, _ = table.player.discard_tile()
    assert (tiles_to_string([tile_to_discard]) == "2m"
            or tiles_to_string([tile_to_discard]) == "3m"
            or tiles_to_string([tile_to_discard]) == "2s"
            or tiles_to_string([tile_to_discard]) == "3s")
Example #4
0
def test_kuikae_advanced():
    # case 0: sanity check
    table = _make_table()
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    tiles = string_to_136_array(man="234", sou="23456", pin="33359")
    table.player.init_hand(tiles)
    table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234"))
    # just force tanyao for the test
    table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO,
                                                      table.player)
    _assert_tanyao(table.player)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is not None

    # case 1: allowed chi
    table = _make_table()
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    tiles = string_to_136_array(man="234", sou="123456", pin="3335")
    table.player.init_hand(tiles)
    table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234"))
    # just force tanyao for the test
    table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO,
                                                      table.player)
    _assert_tanyao(table.player)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is not None

    # case 2: another allowed chi
    table = _make_table()
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    tiles = string_to_136_array(man="234", sou="123345", pin="3335")
    table.player.init_hand(tiles)
    table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234"))
    # just force tanyao for the test
    table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO,
                                                      table.player)
    _assert_tanyao(table.player)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is not None

    # case 3: another allowed chi
    table = _make_table()
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    tiles = string_to_136_array(man="234", sou="12345", pin="33355")
    table.player.init_hand(tiles)
    table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234"))
    # just force tanyao for the test
    table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO,
                                                      table.player)
    _assert_tanyao(table.player)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is not None

    # case 4: useless chi, don't do that
    table = _make_table()
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    tiles = string_to_136_array(man="234", sou="234567", pin="3335")
    table.player.init_hand(tiles)
    table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234"))
    # just force tanyao for the test
    table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO,
                                                      table.player)
    _assert_tanyao(table.player)

    tile = string_to_136_array(sou="2222")[2]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is None

    tile = string_to_136_array(sou="5555")[2]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is None

    tile = string_to_136_array(sou="8888")[2]
    meld, _ = table.player.try_to_call_meld(tile, True)
    assert meld is None
Example #5
0
def test_should_activate_strategy():
    table = Table()
    player = table.player
    strategy = ChinitsuStrategy(BaseStrategy.CHINITSU, player)

    table.add_dora_indicator(string_to_136_tile(pin="1"))
    table.add_dora_indicator(string_to_136_tile(man="1"))
    table.add_dora_indicator(string_to_136_tile(sou="8"))

    tiles = string_to_136_array(sou="12355", man="34589", honors="1234")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    tiles = string_to_136_array(sou="12355", man="458", honors="112345")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # we shouldn't go for chinitsu if we have a valued pair or pon
    tiles = string_to_136_array(sou="111222578", man="8", honors="5556")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    tiles = string_to_136_array(sou="1112227788", man="7", honors="556")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # if we have a pon of non-valued honors, this is not chinitsu
    tiles = string_to_136_array(sou="1112224688", honors="2224")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # if we have just a pair of non-valued tiles, we can go for chinitsu
    # if we have 11 chinitsu tiles and it's early
    tiles = string_to_136_array(sou="11122234688", honors="224")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is True

    # if we have a complete set with dora, we shouldn't go for chinitsu
    tiles = string_to_136_array(sou="1112223688", pin="1239")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # even if the set may be interpreted as two forms
    tiles = string_to_136_array(sou="111223688", pin="23349")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # even if the set may be interpreted as two forms v2
    tiles = string_to_136_array(sou="111223688", pin="23459")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # if we have a long form with dora, we shouldn't go for chinitsu
    tiles = string_to_136_array(sou="111223688", pin="23339")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # buf it it's just a ryanmen - no problem
    tiles = string_to_136_array(sou="1112223688", pin="238", man="9")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is True

    # we have three non-isolated doras in other suits, this is not chinitsu
    tiles = string_to_136_array(sou="111223688", man="22", pin="239")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # we have two non-isolated doras in other suits and no doras in our suit
    # this is not chinitsu
    tiles = string_to_136_array(sou="111223688", man="24", pin="249")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # we have two non-isolated doras in other suits and 1 shanten, not chinitsu
    tiles = string_to_136_array(sou="111222789", man="23", pin="239")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(player.tiles) is False

    # we don't want to open on 9th tile into chinitsu, but it's ok to
    # switch to chinitsu if we get in from the wall
    tiles = string_to_136_array(sou="11223578", man="57", pin="4669")
    player.init_hand(tiles)
    # plus one tile to open hand
    tiles = string_to_136_array(sou="112223578", man="57", pin="466")
    assert strategy.should_activate_strategy(tiles) is False
    # but now let's init hand with these tiles, we can now slowly move to chinitsu
    tiles = string_to_136_array(sou="112223578", man="57", pin="466")
    player.init_hand(tiles)
    assert strategy.should_activate_strategy(tiles) is True
def test_is_dora():
    table = Table()
    table.init_round(0, 0, 0, 0, 0, [])

    table.dora_indicators = [string_to_136_tile(sou="1")]
    assert table.is_dora(string_to_136_tile(sou="2"))

    table.dora_indicators = [string_to_136_tile(sou="9")]
    assert table.is_dora(string_to_136_tile(sou="1"))

    table.dora_indicators = [string_to_136_tile(pin="9")]
    assert table.is_dora(string_to_136_tile(pin="1"))

    table.dora_indicators = [string_to_136_tile(man="9")]
    assert table.is_dora(string_to_136_tile(man="1"))

    table.dora_indicators = [string_to_136_tile(man="5")]
    assert table.is_dora(string_to_136_tile(man="6"))

    table.dora_indicators = [string_to_136_tile(honors="1")]
    assert table.is_dora(string_to_136_tile(honors="2"))

    table.dora_indicators = [string_to_136_tile(honors="2")]
    assert table.is_dora(string_to_136_tile(honors="3"))

    table.dora_indicators = [string_to_136_tile(honors="3")]
    assert table.is_dora(string_to_136_tile(honors="4"))

    table.dora_indicators = [string_to_136_tile(honors="4")]
    assert table.is_dora(string_to_136_tile(honors="1"))

    table.dora_indicators = [string_to_136_tile(honors="5")]
    assert table.is_dora(string_to_136_tile(honors="6"))

    table.dora_indicators = [string_to_136_tile(honors="6")]
    assert table.is_dora(string_to_136_tile(honors="7"))

    table.dora_indicators = [string_to_136_tile(honors="7")]
    assert table.is_dora(string_to_136_tile(honors="5"))

    table.dora_indicators = [string_to_136_tile(pin="1")]
    assert not table.is_dora(string_to_136_tile(sou="2"))

    table.has_open_tanyao = True

    # red five man
    assert table.is_dora(FIVE_RED_MAN)

    # red five pin
    assert table.is_dora(FIVE_RED_PIN)

    # red five sou
    assert table.is_dora(FIVE_RED_SOU)
Example #7
0
def test_tile_danger_against_toitoi_threat():
    table = Table()
    table.add_dora_indicator(string_to_136_tile(pin="1"))
    player = table.player

    enemy_seat = 1
    table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, pin="222"))
    table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, honors="444"))
    table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, sou="999"))

    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="1"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="5"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="8"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="9"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="4"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="3"), False)

    table.add_dora_indicator(string_to_136_tile(pin="1"))

    threatening_players = table.player.ai.defence.get_threatening_players()
    assert len(threatening_players) == 1
    assert threatening_players[0].enemy.seat == enemy_seat

    # let's make 2 man impossible to wait in toitoi
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False)

    tiles = string_to_136_array(man="11134", pin="1569", honors="2555")
    tile = string_to_136_tile(man="2")
    player.init_hand(tiles)
    player.draw_tile(tile)

    _assert_discard(player,
                    enemy_seat,
                    TileDanger.SAFE_AGAINST_THREATENING_HAND,
                    man="2")
Example #8
0
def test_tile_danger_matagi_suji_pattern():
    enemy_seat = 1
    table = _create_table(enemy_seat,
                          discards=[],
                          riichi_tile=string_to_136_tile(honors="7"))
    player = table.player

    tiles = string_to_136_array(man="11134", pin="1156", honors="255", sou="4")
    tile = string_to_136_tile(sou="5")
    player.init_hand(tiles)
    player.draw_tile(tile)

    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(sou="6"),
                             is_tsumogiri=False)
    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(pin="5"),
                             is_tsumogiri=True)

    # it is too early for matagi check
    _assert_discard_not_equal(player,
                              enemy_seat,
                              TileDanger.BONUS_MATAGI_SUJI,
                              sou="5")

    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(honors="6"),
                             is_tsumogiri=True)
    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(honors="6"),
                             is_tsumogiri=True)
    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(sou="8"),
                             is_tsumogiri=False)
    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(sou="6"),
                             is_tsumogiri=False)

    # 8s in discard, so 5s is not matagi suji
    _assert_discard_not_equal(player,
                              enemy_seat,
                              TileDanger.BONUS_MATAGI_SUJI,
                              sou="5")
    # 4-7 is still matagi
    _assert_discard(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="4")

    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(sou="6"),
                             is_tsumogiri=True)
    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(pin="6"),
                             is_tsumogiri=False)

    # 4s is not matagi anymore, because 6p is latest discard from the hand
    _assert_discard_not_equal(player,
                              enemy_seat,
                              TileDanger.BONUS_MATAGI_SUJI,
                              sou="4")

    table.add_discarded_tile(enemy_seat,
                             string_to_136_tile(honors="6"),
                             is_tsumogiri=True)

    # 4s is matagi again, because it is late stage and we are checking two latest discards from hand
    _assert_discard(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="4")
Example #9
0
def test_calculate_second_level_ukeire():
    """
    There was a bug with 2356 form and second level ukeire
    """
    table = Table()
    player = table.player

    table.add_dora_indicator(string_to_136_tile(man="2"))
    table.add_discarded_tile(1, string_to_136_tile(man="2"), False)
    table.add_discarded_tile(1, string_to_136_tile(pin="3"), False)
    table.add_discarded_tile(1, string_to_136_tile(pin="3"), False)

    tiles = string_to_136_array(man="34678", pin="2356", sou="4467")
    tile = string_to_136_tile(sou="8")

    player.init_hand(tiles)
    player.draw_tile(tile)

    discard_options, _ = player.ai.hand_builder.find_discard_options()

    tile = string_to_136_tile(man="4")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 108

    tile = string_to_136_tile(man="3")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 108

    tile = string_to_136_tile(pin="2")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 96

    tile = string_to_136_tile(pin="3")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 96

    tile = string_to_136_tile(pin="5")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 96

    tile = string_to_136_tile(pin="6")
    discard_option = [
        x for x in discard_options if x.tile_to_discard_34 == tile // 4
    ][0]
    player.ai.hand_builder.calculate_second_level_ukeire(discard_option)
    assert discard_option.ukeire_second == 96
Example #10
0
def test_tile_danger_and_2_8_suji_tiles():
    enemy_seat = 1
    table = _create_table(enemy_seat,
                          discards=[],
                          riichi_tile=string_to_136_tile(honors="7"))
    player = table.player

    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="4"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="5"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="6"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="3"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="8"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(man="9"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="1"), False)
    table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="7"), False)

    tiles = string_to_136_array(sou="2378", pin="4", man="56", honors="233555")
    tile = string_to_136_tile(honors="3")
    player.init_hand(tiles)
    player.draw_tile(tile)

    _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="2")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="3")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="7")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="8")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, pin="4")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, man="5")
    _assert_discard(player, enemy_seat, TileDanger.SUJI, man="6")
Example #11
0
def test_choose_tanki_with_suji():
    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="19", pin="99", honors="2"),
        [string_to_136_tile(sou="6")],
        string_to_136_tile(honors="2"),
        "1s",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="19", pin="99", honors="2"),
        [string_to_136_tile(sou="4")],
        string_to_136_tile(honors="2"),
        "9s",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="2", pin="299", honors="2"),
        [string_to_136_tile(sou="5")],
        string_to_136_tile(honors="2"),
        "2p",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="2", pin="299", honors="2"),
        [string_to_136_tile(pin="5")],
        string_to_136_tile(honors="2"),
        "2s",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="3", pin="399", honors="2"),
        [string_to_136_tile(sou="6")],
        string_to_136_tile(honors="2"),
        "3p",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="3", pin="399", honors="2"),
        [string_to_136_tile(pin="6")],
        string_to_136_tile(honors="2"),
        "3s",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="4", pin="499", honors="2"),
        [string_to_136_tile(sou="1"),
         string_to_136_tile(sou="7")],
        string_to_136_tile(honors="2"),
        "4p",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="4", pin="499", honors="2"),
        [string_to_136_tile(pin="1"),
         string_to_136_tile(pin="7")],
        string_to_136_tile(honors="2"),
        "4s",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="5", pin="599", honors="2"),
        [string_to_136_tile(sou="2"),
         string_to_136_tile(sou="8")],
        string_to_136_tile(honors="2"),
        "5p",
    )

    _choose_tanki_with_suji_helper(
        string_to_136_array(man="22336688", sou="5", pin="599", honors="2"),
        [string_to_136_tile(pin="2"),
         string_to_136_tile(pin="8")],
        string_to_136_tile(honors="2"),
        "5s",
    )
Example #12
0
def test_is_dora_connector():
    cases = [
        {
            "dora_indicators": [string_to_136_tile(sou="5")],
            "dora_connectors": [string_to_136_tile(sou="4"), string_to_136_tile(sou="6")],
        },
        {
            "dora_indicators": [string_to_136_tile(sou="5"), string_to_136_tile(sou="4")],
            "dora_connectors": [
                string_to_136_tile(sou="3"),
                string_to_136_tile(sou="4"),
                string_to_136_tile(sou="5"),
                string_to_136_tile(sou="6"),
            ],
        },
        {
            "dora_indicators": [string_to_136_tile(pin="1")],
            "dora_connectors": [
                string_to_136_tile(pin="2"),
            ],
        },
        {
            "dora_indicators": [string_to_136_tile(man="9")],
            "dora_connectors": [
                string_to_136_tile(man="8"),
            ],
        },
        {
            "dora_indicators": [string_to_136_tile(honors="1")],
            "dora_connectors": [],
        },
    ]

    for case in cases:
        dora_connectors_34 = [x // 4 for x in case["dora_connectors"]]
        for tile_34 in range(0, 34):
            if tile_34 in dora_connectors_34:
                assert is_dora_connector(tile_34 * 4, case["dora_indicators"]) is True
            else:
                assert is_dora_connector(tile_34 * 4, case["dora_indicators"]) is False
Example #13
0
def test_chose_right_set_to_open_hand_dora():
    table = Table()
    table.has_open_tanyao = True
    table.has_aka_dora = False
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    table.add_dora_indicator(string_to_136_tile(sou="1"))
    tiles = string_to_136_array(man="3456788", sou="245888")
    player.init_hand(tiles)

    tile = string_to_136_tile(sou="3")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "234s"

    table = Table()
    table.has_open_tanyao = True
    table.has_aka_dora = False
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    table.add_dora_indicator(string_to_136_tile(sou="4"))
    tiles = string_to_136_array(man="3456788", sou="245888")
    player.init_hand(tiles)

    tile = string_to_136_tile(sou="3")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345s"

    table = Table()
    table.has_open_tanyao = True
    table.has_aka_dora = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    # 5 from string is always aka
    tiles = string_to_136_array(man="3456788", sou="240888")
    player.init_hand(tiles)

    tile = string_to_136_tile(sou="3")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "340s"

    table = Table()
    table.has_open_tanyao = True
    table.has_aka_dora = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    table.add_dora_indicator(string_to_136_tile(sou="1"))
    table.add_dora_indicator(string_to_136_tile(sou="4"))
    # double dora versus regular dora, we should keep double dora
    tiles = string_to_136_array(man="3456788", sou="245888")
    player.init_hand(tiles)

    tile = string_to_136_tile(sou="3")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345s"
Example #14
0
def test_chose_right_set_to_open_hand():
    """
    Different test cases to open hand and chose correct set to open hand.
    Based on real examples of incorrect opened hands
    """
    table = Table()
    table.has_open_tanyao = True
    player = table.player

    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(pin="2"))
    table.add_dora_indicator(string_to_136_tile(pin="3"))

    tiles = string_to_136_array(man="23455", pin="3445678", honors="1")
    tile = string_to_136_array(man="5555")[2]
    player.init_hand(tiles)

    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.PON
    assert tiles_to_string(meld.tiles) == "555m"

    table = Table()
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="5"))
    tiles = string_to_136_array(man="335666", pin="22", sou="345", honors="55")
    player.init_hand(tiles)

    tile = string_to_136_tile(man="4")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345m"

    table = Table()
    table.has_open_tanyao = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="1"))
    table.add_dora_indicator(string_to_136_tile(man="4"))
    tiles = string_to_136_array(man="23557", pin="556788", honors="22")
    player.init_hand(tiles)

    tile = string_to_136_array(pin="5555")[2]
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.PON
    assert tiles_to_string(meld.tiles) == "555p"

    table = Table()
    table.has_open_tanyao = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="4"))
    table.add_dora_indicator(string_to_136_tile(pin="5"))
    tiles = string_to_136_array(man="35568", pin="234668", sou="28")
    player.init_hand(tiles)

    tile = string_to_136_tile(man="4")
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345m"

    table = Table()
    table.has_open_tanyao = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="4"))
    table.add_dora_indicator(string_to_136_tile(pin="5"))
    tiles = string_to_136_array(man="34458", pin="234668", sou="28")
    player.init_hand(tiles)

    tile = string_to_136_array(man="4444")[2]
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345m"

    table = Table()
    table.has_open_tanyao = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    tiles = string_to_136_array(man="567888", pin="788", sou="3456")
    player.init_hand(tiles)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "456s"

    tile = string_to_136_array(sou="5555")[1]
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "345s"

    table = Table()
    table.has_open_tanyao = True
    player = table.player
    # add 3 doras so we are sure to go for tanyao
    table.add_dora_indicator(string_to_136_tile(man="7"))
    tiles = string_to_136_array(man="567888", pin="788", sou="2345")
    player.init_hand(tiles)

    tile = string_to_136_array(sou="4444")[1]
    meld, _ = player.try_to_call_meld(tile, True)
    assert meld is not None
    assert meld.type == MeldPrint.CHI
    assert tiles_to_string(meld.tiles) == "234s"
Example #15
0
def test_number_of_unverified_suji():
    table = Table()
    enemy_seat = 2
    table.add_called_riichi_step_one(enemy_seat)

    threatening_player = table.player.ai.defence.get_threatening_players()[0]
    assert threatening_player.number_of_unverified_suji == 18

    table.add_discarded_tile(0, string_to_136_tile(sou="4"), True)
    assert threatening_player.number_of_unverified_suji == 16
    table.add_discarded_tile(0, string_to_136_tile(sou="1"), True)
    table.add_discarded_tile(0, string_to_136_tile(sou="7"), True)
    assert threatening_player.number_of_unverified_suji == 16

    table.add_discarded_tile(0, string_to_136_tile(sou="2"), True)
    assert threatening_player.number_of_unverified_suji == 15
    table.add_discarded_tile(0, string_to_136_tile(sou="8"), True)
    assert threatening_player.number_of_unverified_suji == 14
    table.add_discarded_tile(0, string_to_136_tile(sou="5"), True)
    assert threatening_player.number_of_unverified_suji == 14

    table.add_discarded_tile(0, string_to_136_tile(sou="6"), True)
    assert threatening_player.number_of_unverified_suji == 12
    table.add_discarded_tile(0, string_to_136_tile(man="4"), True)
    table.add_discarded_tile(0, string_to_136_tile(man="5"), True)
    table.add_discarded_tile(0, string_to_136_tile(man="6"), True)
    assert threatening_player.number_of_unverified_suji == 6

    table.add_discarded_tile(0, string_to_136_tile(pin="1"), True)
    table.add_discarded_tile(0, string_to_136_tile(pin="7"), True)
    assert threatening_player.number_of_unverified_suji == 4
    table.add_discarded_tile(0, string_to_136_tile(pin="5"), True)
    assert threatening_player.number_of_unverified_suji == 2
    table.add_discarded_tile(0, string_to_136_tile(pin="6"), True)
    assert threatening_player.number_of_unverified_suji == 0