Exemple #1
0
def create_table_13(iter_time, n):
    yama = CardStack()
    card = HandCard()

    table = {}
    file_decoder('lookup_table_13.DAT', table)
    size = len(table)

    for i in range(0, iter_time):
        yama.reset(0)
        card_list = yama.deal_with_n(n)
        for j in range(0, 4):
            pai = card_list[j]
            card.deal(pai)

            old_pattern = card_encoding(card)
            pattern = pattern_sort(old_pattern)
            result = array_encoder(pattern)

            if table.get(result) == None:
                s = shan_ten_check_13(card_encoding(card), len(card.card13))
                kokushi_s = kokushi_shan_ten_check(card, 13)
                if kokushi_s > s:
                    table[result] = s
                else:
                    table[result] = kokushi_s

    file_encoder('lookup_table_13.DAT', table, size)
    print(len(table))
class Player:
    id = 0

    def __init__(self):
        self.card = HandCard()
        self.info = PlayerInfo()
        self.reset()

    def reset(self):
        self.info.i_ba_tsu = False
        self.info.first = True
        self.info.fu_ri_ten = False
        self.info.discard_tile = -1
        self.info.action_state = -1
        self.card.reset()
        self.info.rin_shan = False
        self.info.chan_kan = 0
        self.info.update_reward = True

    def new_game(self, id):
        self.id = id
        self.info.point = 25000

    def can_do_something(self, pai, left_hand, dora):
        if not self.card.richi:
            pai_no_r = pai
            if pai_no_r == 0 or pai_no_r == 10 or pai_no_r == 20:
                pai_no_r += 5

            self.info.can_do_something = False
            #check can chi or not
            self.info.chi_able_list = []
            self.info.can_chi = False
            if left_hand and pai_no_r < 30 and len(self.card.card13) > 2:
                # pai - 2, pai - 1, pai + 1, pai + 2
                has_tile = [False, False, False, False]

                for i in self.card.check_card13:
                    if i >= 30:
                        continue
                    if pai_no_r % 10 != 1:
                        if pai_no_r - i == 2:
                            has_tile[0] = True
                        if pai_no_r - i == 1:
                            has_tile[1] = True
                    if pai_no_r % 10 != 9:
                        if i - pai_no_r == 1:
                            has_tile[2] = True
                        if i - pai_no_r == 2:
                            has_tile[3] = True
                if has_tile[0] and has_tile[1]:
                    self.info.can_chi = True
                    self.info.chi_able_list.append(
                        [pai_no_r - 2, pai_no_r - 1, 5])
                if has_tile[1] and has_tile[2]:
                    self.info.can_chi = True
                    self.info.chi_able_list.append(
                        [pai_no_r - 1, pai_no_r + 1, 4])
                if has_tile[2] and has_tile[3]:
                    self.info.can_chi = True
                    self.info.chi_able_list.append(
                        [pai_no_r + 1, pai_no_r + 2, 3])
            #check can pon or not
            self.info.pon_able_tile = -1
            self.info.can_pon = False
            self.info.can_kan = False
            same_num = 0
            for i in self.card.check_card13:
                if pai_no_r == i:
                    same_num += 1
            if same_num >= 2:
                self.info.can_pon = True
                pon_able_tile = pai_no_r
                self.info.pon_able_tile = pai_no_r
            if same_num >= 3:
                self.info.can_kan = True
        #check can ron or not
        self.card.ron(pai)
        self.info.can_ron = False
        if win_check(self.card) and not self.info.fu_ri_ten:
            yaku = point_check(self.card, self.info.chan_fon,
                               self.info.men_fon, self.info.last,
                               self.info.first, self.info.rin_shan,
                               self.info.chan_kan, self.info.i_ba_tsu, 0, dora,
                               [])
            if not yaku.yaku_nashi:
                self.info.can_ron = True

        if self.info.can_chi or self.info.can_kan or self.info.can_pon or self.info.can_ron:
            self.info.can_do_something = True
            return True
        else:
            self.info.can_do_something = False
            return False

    def draw(self, p):
        self.card.draw(p)
        self.info.time_to_discard = True

    def discard(self, discard_stack):
        if self.info.discard_tile != -1:
            for i in range(int(len(self.info.what_to_tenpai) / 2)):
                if self.info.discard_tile == self.info.what_to_tenpai[i *
                                                                      2][0]:
                    self.info.tenpai_list = copy.copy(
                        self.info.what_to_tenpai[i * 2][1])
            if len(self.info.what_to_tenpai) == 0 and not self.card.richi:
                self.info.tenpai_list = []
            self.info.what_to_tenpai = []

            if self.info.want_to_richi == 1 and not self.card.richi:
                self.card.richi = True
                self.info.i_ba_tsu = True
                self.info.want_to_richi = 0
                self.info.can_richi = False
                self.info.point -= 1000
            p = self.info.discard_tile
            self.card.discard(p)
            self.info.time_to_discard = False
            self.info.discard_tile = -1
            self.fu_ri_ten_check(discard_stack)
            return p
        else:
            return -1

    def an_kan(self):
        if self.info.action_state == 2:
            self.info.action_state = -1
            if len(self.info.kan_able_list) <= self.info.an_kan_case:
                return [0, 0]
            ka_kan = self.info.kan_able_list[self.info.an_kan_case][1]
            kan_pai = self.info.kan_able_list[self.info.an_kan_case][0]
            if ka_kan == 1:
                self.card.ka_kan(kan_pai)
            else:
                self.card.an_kan(kan_pai)
            self.info.an_kan_case = -1
            self.info.kan_able_list = []
            self.info.time_to_discard = False
            self.info.can_ankan = False
            return [ka_kan, kan_pai]

        else:
            return [0, 0]

    def tsumo(self):
        if self.info.want_to_tsumo:
            self.info.want_to_tsumo = False
            return True
        return False

    # naki
    def claim(self, pai):
        if not self.info.can_do_something:
            return 0

        if self.info.action_state > 0 and self.info.action_state != 2:
            self.info.just_naki = True
        return self.info.action_state

    def be_claimed(self):
        self.info.i_ba_tsu = False
        self.info.first = False

    def fu_ri_ten_check(self, discard_stack):
        if not self.card.richi:
            self.info.fu_ri_ten = False
        for i in self.info.tenpai_list:
            for j in discard_stack:
                p = j
                if p == 0 or p == 10 or p == 20:
                    p += 5
                if p == i:
                    self.info.fu_ri_ten = True
                    break

    def can_chan_kan(self, ron_pai, kan):
        if self.info.has_tenpai:
            # kan  1 : kakan
            # kan -1 : ankan
            if kan == 1:
                for i in self.info.tenpai_list:
                    if i == ron_pai:
                        self.info.can_ron = True
                        return True
            elif kan == -1:
                for i in self.info.tenpai_list:
                    if i == ron_pai:
                        self.card.ron(ron_pai)
                        if kokushi_check(self.card):
                            self.info.can_ron = True
                            return True
                        return False
        return False

    def an_kan_tsumo_check(self):
        if win_check(self.card):
            yaku = point_check(self.card, self.info.chan_fon,
                               self.info.men_fon, self.info.last,
                               self.info.first, self.info.rin_shan,
                               self.info.chan_kan, self.info.i_ba_tsu, 0, [],
                               [])
            if not yaku.yaku_nashi:
                self.info.can_can_tsumo = True
        else:
            self.info.what_to_tenpai = richi_check(self.card)
            if len(self.info.what_to_tenpai) != 0 and len(
                    self.card.chi_card) == 0 and len(self.card.pon_card) == 0:
                men_zen = True
                for i in self.card.kan_card:
                    if i[1] != 0:
                        men_zen = False
                if men_zen and self.info.point >= 1000:
                    self.info.can_richi = True

        pin = np.zeros(9)
        man = np.zeros(9)
        sou = np.zeros(9)
        other = np.zeros(7)
        for i in self.card.check_card14:
            if i >= 30:
                other[int(i) - 30] += 1
            elif i > 20:
                sou[int(i) - 21] += 1
            elif i > 10:
                man[int(i) - 11] += 1
            else:
                pin[int(i) - 1] += 1

        self.info.kan_able_list = []
        for i in range(0, 9):
            if pin[i] == 4:
                self.info.kan_able_list.append([i + 1, -1])
                self.info.can_ankan = True
            if man[i] == 4:
                self.info.kan_able_list.append([i + 11, -1])
                self.info.can_ankan = True
            if sou[i] == 4:
                self.info.kan_able_list.append([i + 21, -1])
                self.info.can_ankan = True
        for i in range(0, 7):
            if other[i] == 4:
                self.info.kan_able_list.append([i + 30, -1])
                self.info.can_ankan = True

        for i in self.card.pon_card:
            for j in self.card.check_card14:
                if i[2] == j:
                    self.info.kan_able_list.append([i, 1])
                    self.info.can_ankan = True

        if self.info.just_naki:
            self.info.can_ankan = False
        self.info.just_naki = False
 def __init__(self):
     self.card = HandCard()
     self.info = PlayerInfo()
     self.reset()
Exemple #4
0
def test_func():
    test = HandCard()

    test.check_card13 = [1, 3, 3, 4, 15, 19, 22, 24, 26, 30, 30, 31, 33]
    print(effective_card(test, True))
Exemple #5
0
                    table[result] = kokushi_s

    file_encoder('lookup_table_14.DAT', table, size)
    print(len(table))


def test_func():
    test = HandCard()

    test.check_card13 = [1, 3, 3, 4, 15, 19, 22, 24, 26, 30, 30, 31, 33]
    print(effective_card(test, True))


if __name__ == '__main__':
    #yama = CardStack()
    test = HandCard()

    test.check_card13 = [1, 3, 3, 4, 15, 19, 22, 24, 26, 30, 30, 31, 33]
    print(effective_card(test))

    #table = {}

    #yama.reset(0)
    #test.deal([1,2,3,4,5,6,7,18,9,12,12,13,21])
    #test.deal(yama.deal()[0])
    #test.deal([3,3,3,4,5,15,16,17,18,18,35,35,35])
    #test.draw(18)

    #print(shan_ten_check_14(test))

    #ddd = [[4, 1], [4, 0], [3, 1], [2, 1], [1, 2], [1, 2], [1, 0], [2, 1], [3, 2]]