def temp_process(temp_list):
    global pure_point_sum, sum_list
    #print("bbbbbbbbbbbbbbbbbbbbbbb")
    hai_id = temp_list[0]
    janshi = temp_list[1]
    yama = temp_list[2]
    taku = temp_list[3]
    shanten_suu = temp_list[4]
    itr = temp_list[5]
    for j in range(itr):
        count = 1.0
        temp_janshi = copy.deepcopy(janshi)
        temp_yama = yama.copy()
        temp_janshi.tehai.remove(function.hai_convert_reverse(
            hai_id))  # = function.tehai_convert_reverse(temp_tehai)
        temp_janshi.sutehai.append(function.hai_convert_reverse(hai_id))
        if j == 0:
            init_shanten_suu = shanten_check_new.shanten_check(
                temp_janshi, taku.hash_table)
        a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                 taku.hash_table, temp_janshi, taku)
        sum_list[hai_id] += a
        pure_point_sum[hai_id] += b
    #shanten_suu + 1で平均打点を割る
    pure_point_sum[hai_id] /= max(init_shanten_suu + 1, 1) * itr
def temp_process(hai_id, janshi, yama, taku, shanten_suu, itr):
    #def temp_process(temp_list):
    global hash_table
    #temp_list = y()
    #print(time.time())
    #global pure_point_sum, sum_list
    #start = time.time()
    #hai_id = temp_list[0]
    #janshi = temp_list[1]
    #yama = temp_list[2]
    #taku = temp_list[3]
    #shanten_suu = temp_list[4]
    #itr = temp_list[5]
    taku.hash_table = hash_table
    itr = 50
    print(hai_id)
    #print(str(time.time()-start))
    print(itr)
    for j in range(itr):
        count = 1.0
        temp_janshi = copy.deepcopy(janshi)
        temp_yama = yama.copy()
        temp_janshi.tehai.remove(function.hai_convert_reverse(
            hai_id))  # = function.tehai_convert_reverse(temp_tehai)
        temp_janshi.sutehai.append(function.hai_convert_reverse(hai_id))
        if j == 0:
            init_shanten_suu = shanten_check_new.shanten_check(
                temp_janshi, taku.hash_table)
        a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                 taku.hash_table, temp_janshi, taku)
Exemple #3
0
def furiten_hantei(janshi, taku):
    assert shanten_check_new.shanten_check(janshi, taku.hash_table) == 0
    sutehai_index = tehai_convert3(akadora_convert(janshi.sutehai)[0])
    yuukouhai_index = find_yuukouhai(janshi, 0, taku.hash_table)
    for i in range(len(yuukouhai_index)):
        if yuukouhai_index[i] in sutehai_index:
            return True
    return False
Exemple #4
0
    def record(self, janshi):
        row = [0] * 6888
        rowCnt = 0
        if janshi.reach == True:
            row[0] = 1
        rowCnt = 1
        a = len(janshi.kawa) + 19 * janshi.fuurosu
        row[rowCnt + a] = 1
        rowCnt += 5 * 19
        for i in janshi.fuurojunme:
            a = i[1] + 19 * (i[0] - 1)
            row[rowCnt + a] = 1
        rowCnt += 4 * 19
        tedasisu = 0
        last_tedasi = -1
        for d in janshi.kawa:
            if d[0] == 'd':
                tedasisu += 1
                last_tedasi = d[1:]
        a = tedasisu + 19 * (janshi.fuurosu)
        row[rowCnt + a] = 1
        rowCnt += 5 * 19
        akadora_id = {'16': 34, '52': 35, '88': 36}
        if last_tedasi in ('16', '52', '88'):
            last_tedasi = akadora_id[last_tedasi]
        else:
            last_tedasi = int(last_tedasi) // 4
        a = last_tedasi + 37 * (janshi.fuurosu)
        row[rowCnt + a] = 1
        rowCnt += 5 * 37
        if janshi.doragiri:
            for d in janshi.doragiri:
                row[rowCnt + d] = 1
        rowCnt += 34
        if janshi.akadoragiri:
            row[rowCnt + 1] = 1
        rowCnt += 1
        tedasi_pare = -1
        for d in janshi.kawa:
            if d[0] == 'd':
                tedasi = d[1:]
                if tedasi in ('16', '52', '88'):
                    tedasi = akadora_id[tedasi]
                else:
                    tedasi = int(tedasi) // 4
                if tedasi_pare != -1:
                    a = tedasi_pare + tedasi * 37
                    row[rowCnt + a] += 1
                tedasi_pare = tedasi
        rowCnt += 37 * 37
        if shanten_check_new.shanten_check(
                janshi, self.hash_table_for_shanten_check) == -1:
            row[rowCnt + 1] = 1
        rowCnt += 1
        row = row[:rowCnt + 1]

        writer = csv.writer(self.output_file)
        writer.writerow(row)
def find_yuukouhai(janshi, old_shanten_suu, hash_table):
    yuukouhai_index_list = []
    tehai = function.tehai_convert(janshi.tehai)
    for i in range(len(tehai)):
        if (i !=30) and (tehai[i] < 4):
            temp_janshi = copy.deepcopy(janshi)
            temp_tehai = tehai.copy()
            temp_tehai[i] += 1
            temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai)
            if shanten_check_new.shanten_check(temp_janshi, hash_table) < old_shanten_suu:
                yuukouhai_index_list.append(i)
    return yuukouhai_index_list
Exemple #6
0
def create_keiten_list(shanten_suu, janshi, taku):
    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4)
    keiten_list = np.zeros(len(janshi.tehai))
    if shanten_suu != 0 or nokori_tsumo_kaisuu >= 4:
        return keiten_list
    for i in range(len(janshi.tehai)):
        temp_janshi = copy.deepcopy(janshi)
        del temp_janshi.tehai[i]
        if shanten_check_new.shanten_check(temp_janshi, taku.hash_table) == 0:
            #keiten_list[i] += 1500/float(max(nokori_tsumo_kaisuu+1, 1))
            keiten_list[i] += 100000
    return keiten_list
Exemple #7
0
def find_machihai(janshi, hash_table):

    machihai = []
    for i in range(38):
        if i != 30:
            temp_janshi = copy.deepcopy(janshi)
            temp_janshi.tehai.append(hai_convert_reverse(i))
            #print(temp_janshi.tehai)

            if shanten_check_new.shanten_check(temp_janshi, hash_table) == -1:
                machihai.append(i)

    return tehai_convert_reverse2(machihai)
Exemple #8
0
def eval_keiten(shanten_suu, janshi, taku, temp_max):
    keiten_point_list = np.zeros(len(janshi.tehai))
    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4)
    if shanten_suu != 0 or nokori_tsumo_kaisuu >= 4:
        return keiten_point_list
    else:
        for i in range(len(janshi.tehai)):
            temp_janshi = copy.deepcopy(janshi)
            del temp_janshi.tehai[i]
            if shanten_check_new.shanten_check(temp_janshi,
                                               taku.hash_table) == 0:
                keiten_point_list[i] += temp_max / float(
                    max(nokori_tsumo_kaisuu + 1, 1))**0.6
        return keiten_point_list
def monte_carlo_riichi(janshi, taku, nokori_tsumo_kaisuu, yama):
    count = 0
    while count < nokori_tsumo_kaisuu:
        count += 1
        janshi.tehai.append(yama[0])
        del yama[0]
        if shanten_check_new.shanten_check(janshi, taku.hash_table) == -1:
            point = tensu_calc.tensu_calc(janshi, taku, janshi.tehai[-1])
            if janshi.kaze == 0:
                agari_point = point[0] * 3
            else:
                agari_point = point[0] * 2 + point[1]
            agari_point = agari_point * (1.0 - 0.4 * (count - 1) / 18.0)
            #print(agari_point)
            return agari_point
        del janshi.tehai[-1]
    return 0
Exemple #10
0
 def ron_agari(self, num_temp, oya, kaze_honba, hai, taku):
     point = 0
     if self.furiten_hantei(taku):
         print("フリテン")
     else:
         temp_tehai = self.tehai.copy()
         temp_tehai.append(hai)
         temp_janshi = copy.deepcopy(self)
         temp_janshi.tehai = temp_tehai
         if shanten_check_new.shanten_check(temp_janshi,
                                            taku.hash_table) == -1:
             point = tensu_calc.tensu_calc(self, taku, hai)
             if len(point) == 0:
                 point = 0
             else:
                 print(teyaku_check.teyaku_check(self, taku, hai))
                 point = point[0]
     return point
def find_yuukou_sutehai(janshi, old_shanten_suu, hash_table):
    yuukou_sutehai_index_list = []
    tehai = function.tehai_convert(janshi.tehai)
    for i in range(len(tehai)):
        if tehai[i] != 0:
            temp_janshi = copy.deepcopy(janshi)
            temp_tehai = tehai.copy()
            temp_tehai[i] -=1
            temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai)
            if shanten_check_new.shanten_check(temp_janshi, hash_table) == old_shanten_suu:
                yuukou_sutehai_index_list.append(i)
    
    #普通の5があるときは赤ドラ5を除外
    if 0 in yuukou_sutehai_index_list and 5 in yuukou_sutehai_index_list:
        yuukou_sutehai_index_list.remove(0)
    if 10 in yuukou_sutehai_index_list and 15 in yuukou_sutehai_index_list:
        yuukou_sutehai_index_list.remove(10)
    if 20 in yuukou_sutehai_index_list and 25 in yuukou_sutehai_index_list:
        yuukou_sutehai_index_list.remove(20)
    return yuukou_sutehai_index_list
Exemple #12
0
 def tsumo_agari(self, teban, oya, kaze_honba, taku):
     point = [0, 0, 0, 0, False]
     if shanten_check_new.shanten_check(self, taku.hash_table) == -1:
         point[4] = True
         hai = self.tehai[len(self.tehai) - 1]
         temp_point = tensu_calc.tensu_calc(self, taku, hai)
         if len(temp_point) == 0:
             point[4] = False
         else:
             print(teyaku_check.teyaku_check(self, taku, hai))
             if self.kaze == 0:
                 for i in range(4):
                     if teban != i:
                         point[i] = temp_point[0]
             else:
                 #ここもっとましな書き方できるかも
                 for i in range(4):
                     if i == (4 - self.kaze + teban) % 4:
                         point[i] = temp_point[1]
                     elif i == teban:
                         pass
                     else:
                         point[i] = temp_point[0]
     return point
def eval_tehai_ens(janshi, taku, janshi_list, bakyou_list):
    #まずシャンテン数を求める
    shanten_suu = shanten_check_new.shanten_check(janshi, taku.hash_table)
    maximum_eval_index = False
    if shanten_suu > 2:
        point = eval_tehai_point(janshi, taku)
        point = point / np.sum(point)
        point = point**3
        point = point / np.sum(point)
        temp_max = np.max(point)
        defense_point = defense.eval_defense(janshi_list, taku, shanten_suu,
                                             temp_max,
                                             [1000] * len(janshi.tehai),
                                             bakyou_list)
        tehai_point_list = defense_point + point
        print_Top3(tehai_point_list, janshi.tehai)
        maximum_eval_index = np.argmax(tehai_point_list)
        #print(point)
        #print(defense_point)

    else:  # shanten_suu <= 2:
        yuukouhai = np.array(new_yuukouhai_explore(shanten_suu, janshi, taku))
        point = np.array(eval_tehai_point(janshi, taku))

        for i in range(len(yuukouhai[0])):
            if yuukouhai[0][i] == 0:
                point[i] = 0

        point = point / np.sum(point)
        point = point**3
        point = point / np.sum(point)
        point = point**3
        point = point / np.sum(point)

        temp = yuukouhai[0] + point
        temp_max = np.max(temp)
        pure_point_list = yuukouhai[2]

        #temp_minを求める
        temp_min = 10000
        #for i in range(len(pure_point_list)):
        #    if temp_min > pure_point_list[i] and pure_point_list[i] != 0:
        #        temp_min = pure_point_list[i]

        #for i in range(len(pure_point_list)):
        #    if pure_point_list[i] == 0:
        #        pure_point_list[i] = temp_min

        defense_point = np.array(
            defense.eval_defense(janshi_list, taku, shanten_suu, temp_max,
                                 pure_point_list, bakyou_list))
        keiten_point = np.array(
            eval_keiten.eval_keiten(shanten_suu, janshi, taku, temp_max))

        tehai_point_list = yuukouhai[0] + defense_point + keiten_point + point
        print(yuukouhai)
        print(point)
        #print(yuukouhai_point)
        print(defense_point)
        print(keiten_point)
        print(tehai_point_list)
        print_Top3(tehai_point_list, janshi.tehai)
        maximum_eval_index = np.argmax(tehai_point_list)
        maximum_eval_index = int(maximum_eval_index)
        #print(type(maximum_eval_index))

    return maximum_eval_index
Exemple #14
0
import shanten_check_new
import time

janshi0 = majang.Janshi_p(2)
janshi1 = majang.Janshi_e(1)
janshi2 = majang.Janshi_e(2)
janshi3 = majang.Janshi_e(3)
janshi = [janshi0, janshi1, janshi2, janshi3]

taku = majang.Taku()

janshi0.janshi_reset()
taku.taku_reset()

janshi0.kaze = 1
taku.yama_nokori = 20
janshi0.tehai = [
    '4m', '5m', '2p', '3p', '7p', '8p', '2s', '3s', '7s', '1z', '2z', '2z',
    '6z'
]
janshi0.riipai()
taku.dorahyouji = ["2s"]
janshi0.init_vertual_yama(taku)
print(janshi0.tehai)
print(shanten_check_new.shanten_check(janshi0, taku.hash_table))

start = time.time()
#print(janshi0.pon(taku, "6z", janshi))
print(janshi0.chii(taku, "6p", janshi))
print(str(time.time() - start))
def riichi_hantei(janshi, taku):
    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4)
    nokori_tsumo_kaisuu2 = nokori_tsumo_kaisuu - 1

    #閾値 場況によって変える予定
    thresh = 1000

    yuukou_sutehai = find_yuukou_sutehai(janshi, 0, taku.hash_table)

    itr = int(3000.0 / (len(yuukou_sutehai) * max(nokori_tsumo_kaisuu, 1)))
    itr2 = itr
    #print(itr)

    agari_sum_list = np.zeros(38)
    agari_sum_list2 = np.zeros(38)
    #agari_sum_list[yuukou_sutehai] = 0.1
    temp_taku = copy.deepcopy(taku)
    dora_mem = temp_taku.dorahyouji.copy()
    len_dora = len(temp_taku.dorahyouji)
    dora_memory_list = []
    yama_memory_list = []

    #裏ドラリストを作成
    for j in range(itr):
        temp_vertual_yama = janshi.vertual_yama.copy()
        dora_temp = []
        for k in range(len_dora):
            rand_index = random.randrange(len(temp_vertual_yama))
            dora_temp.append(temp_vertual_yama[rand_index])
            del temp_vertual_yama[rand_index]
        dora_memory_list.append(dora_temp)
        random.shuffle(temp_vertual_yama)
        yama_memory_list.append(temp_vertual_yama[0:nokori_tsumo_kaisuu])

    #保存用
    yama_memory_list2 = copy.deepcopy(yama_memory_list)

    for index in yuukou_sutehai:
        #バグ防止
        agari_sum_list[index] += 1
        yama_memory_list = copy.deepcopy(yama_memory_list2)
        for j in range(itr):
            temp_janshi = copy.deepcopy(janshi)
            temp_janshi.tehai.remove(function.hai_convert_reverse(index))
            temp_janshi.riichi = 1
            temp_taku.dorahyouji = dora_mem.copy()
            #フリテンの場合は減点
            #furiten_flag = function.furiten_hantei(temp_janshi, temp_taku)

            #裏ドラをランダムで設定
            temp_taku.dorahyouji.extend(dora_memory_list[j])

            #if furiten_flag:
            #    furiten_penalty = 0.7
            #else:
            #    furiten_penalty = 1.0

            agari_sum_list[index] += monte_carlo_riichi(
                temp_janshi, temp_taku, nokori_tsumo_kaisuu,
                yama_memory_list[j])  #*furiten_penalty

    mean_list = agari_sum_list / float(itr)
    max_index = np.argmax(mean_list)
    print("立直時打点期待値: " + str(mean_list[max_index]) + "点")

    for index in yuukou_sutehai:
        yama_memory_list = copy.deepcopy(yama_memory_list2)
        #バグ防止
        agari_sum_list2[index] += 1
        for j in range(itr2):
            temp_janshi = copy.deepcopy(janshi)
            temp_janshi.tehai.remove(function.hai_convert_reverse(index))
            temp_taku.dorahyouji = dora_mem.copy()

            #裏ドラをランダムで設定
            temp_taku.dorahyouji.extend(dora_memory_list[j])

            temp_janshi.tehai.append(yama_memory_list[j][0])
            del yama_memory_list[j][0]

            if shanten_check_new.shanten_check(temp_janshi,
                                               taku.hash_table) == -1:
                point = tensu_calc.tensu_calc(temp_janshi, temp_taku,
                                              temp_janshi.tehai[-1])
                if janshi.kaze == 0:
                    agari_point = point[0] * 3
                else:
                    agari_point = point[0] * 2 + point[1]
                agari_sum_list2[index] += agari_point
            else:
                yuukou_sutehai2 = find_yuukou_sutehai(temp_janshi, 0,
                                                      taku.hash_table)
                temp2 = random.choice(yuukou_sutehai2)
                temp_janshi.tehai.remove(function.hai_convert_reverse(temp2))
                temp_janshi.riichi = 1
                #フリテンの場合は減点
                #furiten_flag = function.furiten_hantei(temp_janshi, temp_taku)
                #if furiten_flag:
                #   furiten_penalty = 0.7
                #else:
                #    furiten_penalty = 1.0
                agari_sum_list2[index] += monte_carlo_riichi(
                    temp_janshi, temp_taku, nokori_tsumo_kaisuu2,
                    yama_memory_list[j])  #*furiten_penalty

    mean_list2 = agari_sum_list2 / float(itr2)

    max_index2 = np.argmax(mean_list2)

    print("立直保留時打点期待値: " + str(mean_list2[max_index2]) + "点")

    if max(mean_list2[max_index2], mean_list[max_index]) < thresh:
        return [False, max_index, 0]

    if mean_list2[max_index2] > mean_list[max_index] + 175:
        return [False, max_index2, mean_list2[max_index]]
    else:
        if mean_list[max_index] > thresh:
            return [True, max_index, mean_list[max_index]]
    return [False, max_index, 0]
def eval_tehai_ens(old_shanten_suu, janshi, taku, kuikae_list, janshi_list_taple, bakyou_list):
    janshi_list = copy.deepcopy(janshi_list_taple)
    janshi_list[0] = janshi
    #まずシャンテン数を求める
    shanten_suu = shanten_check_new.shanten_check(janshi, taku.hash_table)
    maximum_eval_index = False 
    if shanten_suu > 2:
        maximum_eval_index = np.argmax(eval_tehai_point(janshi, taku))

    else: # shanten_suu <= 2:
        point = np.array(eval_tehai_point(janshi, taku))
        point_temp = copy.deepcopy(point)
        top4_list = []
        if shanten_suu == 2:
            yuukou_sutehai_temp = find_yuukou_sutehai(janshi, 2, taku.hash_table)
            temp_count = 0
            while temp_count < 4:
                if max(point_temp) == 0:
                    break
                max_arg = np.argmax(point_temp)
                add_index = function.hai_convert(janshi.tehai[max_arg])
                if add_index in top4_list or not (add_index in yuukou_sutehai_temp):
                    point_temp[max_arg] = 0
                else:
                    top4_list.append(add_index)
                    point_temp[max_arg] = 0
                    temp_count += 1
                
        #print(top4_list)
        yuukouhai = new_yuukouhai_explore(shanten_suu, janshi, taku, kuikae_list, top4_list, janshi_list, bakyou_list)

        for i in range(len(yuukouhai[0])):
            if yuukouhai[0][i] == 0:
                point[i] = 0

        point = point/np.sum(point)
        point = point**3
        point = point/np.sum(point)
        point = point**3
        point = point/np.sum(point)

        temp = yuukouhai[0] + point
        temp_max = np.max(temp)
        pure_point_list = yuukouhai[5]

        #temp_minを求める
        temp_min = 10000
        for i in range(len(pure_point_list)):
            if temp_min > pure_point_list[i] and pure_point_list[i] != 0:
                temp_min = pure_point_list[i]
        
        for i in range(len(pure_point_list)):
            if pure_point_list[i] == 0:
                pure_point_list[i] = temp_min

        defense_point = np.array(defense.eval_defense(janshi_list, taku, shanten_suu, temp_max, pure_point_list, bakyou_list))
        keiten_point = np.array(eval_keiten.eval_keiten(shanten_suu, janshi, taku, temp_max))
        keiten_list = np.array(eval_keiten.create_keiten_list(shanten_suu, janshi, taku))
        #元からテンパイしてたとき
        if old_shanten_suu == 0:
            keiten_list *= 0

        #print(keiten_list)

        tehai_point_list = yuukouhai[0] + point + defense_point + keiten_point
        #print(yuukouhai)
        #print(point)
        #print(tehai_point_list)
        maximum_eval_index = np.argmax(tehai_point_list)
        maximum_eval_index = int(maximum_eval_index)
        maximum_eval_hai_str = janshi.tehai[maximum_eval_index]
        maximum_eval_expect = yuukouhai[2][maximum_eval_index] + keiten_list[maximum_eval_index]

        #print(yuukouhai)

        if bakyou_list[0]:
            #オーラスでラス目
            if bakyou_list[0] == 4:
                if yuukouhai[3][maximum_eval_index] > bakyou_list[1] and yuukouhai[4][maximum_eval_index] > bakyou_list[1]*0.5:
                    maximum_eval_expect += 100000

        #print(type(maximum_eval_index))
    return maximum_eval_hai_str, maximum_eval_expect
Exemple #17
0
def create_dataset(input_file_name, target_file_name):

    janshi = majang.Janshi_p(2)
    taku = majang.Taku()
    yama = Yama()

    t = str(int(time.time()))

    path1 = os.getcwd() + "\data\inputs\\" + input_file_name + ".txt"
    path2 = os.getcwd() + "\data\\targets\\" + target_file_name + ".txt"

    input_file = open(path1, "w")
    target_file = open(path2, "w")

    #create data
    for ep in range(1000):
        input_file.close()
        input_file.close()
        input_file = open(path1, "a")
        target_file = open(path2, "a")
        print()
        print("episode = " + str(ep))
        yama.reset()
        janshi.janshi_reset()
        taku.taku_reset()

        #配牌
        for _ in range(14):
            temp1 = random.randrange(len(yama.nokori_yama))
            janshi.tehai.append(yama.nokori_yama[temp1])
            del yama.nokori_yama[temp1]

        #ドラ表
        temp2 = random.randrange(len(yama.nokori_yama))
        taku.dorahyouji = [yama.nokori_yama[temp2]]
        del yama.nokori_yama[temp2]

        #仮想山更新
        janshi.init_vertual_yama(taku)
        #print("ドラ表示" + taku.dorahyouji[0])

        #風
        taku.kaze_honba[0] = random.randrange(8)
        janshi.kaze = random.randrange(4)

        #ゲーム開始
        for junme in range(50):
            #print(str(junme) + "巡目")
            janshi.riipai()
            #print(janshi.tehai)
            shanten_suu = shanten_check_new.shanten_check(
                janshi, taku.hash_table)
            taku.yama_nokori = 50
            if shanten_suu >= 0:
                temp = np.argmax(eval_ensemble.eval_tehai_point(
                    janshi, taku))  #temp:手牌中における打牌のindex
            #elif shanten_suu == 1 or shanten_suu == 0:
            #    temp = np.argmax(eval_ensemble.new_yuukouhai_explore(shanten_suu, janshi, taku)[0])
            else:
                break
            #print("打 " + janshi.tehai[temp])

            ###inputs
            input_str = []
            input_str.extend(
                function.tehai_convert_binary(
                    function.tehai_convert(janshi.tehai)))
            input_str.extend(
                function.bin_convert(
                    function.tehai_convert(taku.dorahyouji)[0], 5))
            input_str.extend(function.bin_convert(janshi.kaze, 2))
            input_str.extend(function.bin_convert(taku.kaze_honba[0], 3))
            input_str = input_string_convert(input_str)
            input_file.write(input_str)
            print(input_str)

            temp_str = janshi.tehai[temp]
            temp_list = function.tehai_convert([temp_str])
            #for i in range(14):
            #    if janshi.tehai[i] == temp_str:
            #        temp_list.append(1)
            #    else:
            #        temp_list.append(0)
            target_str = input_string_convert(temp_list)
            target_file.write(target_str)

            del janshi.tehai[temp]
            temp3 = random.randrange(len(yama.nokori_yama))
            #print("ツモ " + yama.nokori_yama[temp3])
            janshi.tehai.append(yama.nokori_yama[temp3])
            janshi.vertual_yama.remove(yama.nokori_yama[temp3])
            del yama.nokori_yama[temp3]

            if janshi.vertual_yama != yama.nokori_yama:
                print("ERROR")

    input_file.close()
    target_file.close()
if __name__ == "__main__":
    janshi = majang.Janshi_p(2)
    janshi1 = majang.Janshi_e(1)
    janshi2 = majang.Janshi_e(2)
    janshi3 = majang.Janshi_e(3)
    taku = majang.Taku()
    janshi_list = [janshi, janshi1, janshi2, janshi3]

    janshi.janshi_reset()
    taku.taku_reset()
    taku.dorahyouji = ["1z"]
    #taku.hash_table = None
    janshi.tehai = [
        '1m', '4m', '5m', '6m', '7m', '2p', '2p', '3p', '4p', '5p', '6p', '7p',
        '7p', '7p'
    ]
    #janshi.fuurohai = [[2,2,1]]

    janshi.init_vertual_yama(taku)
    janshi.vertual_yama.remove("3p")
    janshi.vertual_yama.remove("3p")
    #janshi.vertual_yama.remove("3p")
    #janshi.vertual_yama.remove("3p")
    taku.yama_nokori = 58
    shanten_suu = shanten_check_new.shanten_check(janshi, taku.hash_table)

    #start = time.time()
    #print(eval_ensemble.new_yuukouhai_explore(1, janshi, taku))
    new_yuukouhai_explore(shanten_suu, janshi, taku)
    #print(str(time.time()-start))
def new_yuukouhai_explore(shanten_suu, janshi, taku):
    #print("aaaaaaaaaaaaaaaaaaaaa")
    global sum_list, pure_point_sum
    global janshi_global, yama_global, taku_global, shanten_suu_global, itr_global
    hash_table = taku.hash_table
    tehai = np.array(function.tehai_convert(janshi.tehai))

    #ツモって来る牌に赤ドラは考慮しない
    yama = np.array(
        function.tehai_convert(
            function.akadora_convert(janshi.vertual_yama)[0]))
    init_shanten_suu = shanten_suu
    #index_list = [0]*len(tehai)
    sum_list = [0] * len(tehai)
    pure_point_sum = [0] * len(tehai)
    print(len(sum_list))
    #mean_list = [0]*len(tehai)
    if shanten_suu >= 2:
        hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    #テンパイならシャンテン戻しも考える
    else:
        hai_list = function.tehai_convert3(janshi.tehai)

    #print(hai_list)
    #副露した時でアガリ役なしの場合
    if len(hai_list) == 0:
        #print("no_hai_list_error")
        return [0.001] * len(janshi.tehai), [0.001] * len(
            janshi.tehai), [0.001] * len(janshi.tehai)

    #バグ防止用
    for i in hai_list:
        sum_list[i] += 0.001

    #print(hai_list)
    if init_shanten_suu >= 2:
        itr = 25
    elif init_shanten_suu == 1:
        itr = 20
    else:
        itr = 15
    itr_global = itr

    janshi_global = janshi
    yama_global = yama
    taku_global = taku
    taku.hash_table = None
    shanten_suu_global = shanten_suu

    temp_list = [[hai_id, janshi, yama, taku, shanten_suu, itr]
                 for hai_id in reversed(hai_list)]
    p = Pool(multi.cpu_count())
    print(multi.cpu_count())
    print(hai_list)
    #print(time.time())
    p.starmap(temp_process, temp_list)
    #p.map(test_process, hai_list)
    p.close()

    taku.hash_table = hash_table

    for i in hai_list:
        print(i)
        for j in range(itr):
            count = 1.0
            temp_janshi = copy.deepcopy(janshi)
            #temp_tehai = tehai.copy()
            temp_yama = yama.copy()
            #temp_tehai[i] -= 1
            temp_janshi.tehai.remove(function.hai_convert_reverse(
                i))  # = function.tehai_convert_reverse(temp_tehai)
            temp_janshi.sutehai.append(function.hai_convert_reverse(i))
            if j == 0:
                init_shanten_suu = shanten_check_new.shanten_check(
                    temp_janshi, taku.hash_table)
            a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                     hash_table, temp_janshi, taku)
            #index_list[i] += 1
            sum_list[i] += a
            pure_point_sum[i] += b
        #shanten_suu + 1で平均打点を割る
        pure_point_sum[i] /= max(init_shanten_suu + 1, 1) * itr
def new_yuukouhai_explore(shanten_suu, janshi, taku):
    hash_table = taku.hash_table
    tehai = np.array(function.tehai_convert(janshi.tehai))

    #ツモって来る牌に赤ドラは考慮しない
    yama = np.array(
        function.tehai_convert(
            function.akadora_convert(janshi.vertual_yama)[0]))
    init_shanten_suu = shanten_suu
    #index_list = [0]*len(tehai)
    sum_list = [0] * len(tehai)
    pure_point_sum = [0] * len(tehai)
    #mean_list = [0]*len(tehai)
    if shanten_suu >= 2:
        hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    #テンパイならシャンテン戻しも考える
    else:
        hai_list = function.tehai_convert3(janshi.tehai)

    #print(hai_list)
    #副露した時でアガリ役なしの場合
    if len(hai_list) == 0:
        #print("no_hai_list_error")
        return [0.001] * len(janshi.tehai), [0.001] * len(
            janshi.tehai), [0.001] * len(janshi.tehai)

    #バグ防止用
    for i in hai_list:
        sum_list[i] += 0.001

    #print(hai_list)
    if init_shanten_suu >= 2:
        itr = 25
    elif init_shanten_suu == 1:
        itr = 20
    else:
        itr = 15

    for i in hai_list:
        for j in range(itr):
            count = 1.0
            temp_janshi = copy.deepcopy(janshi)
            #temp_tehai = tehai.copy()
            temp_yama = yama.copy()
            #temp_tehai[i] -= 1
            temp_janshi.tehai.remove(function.hai_convert_reverse(
                i))  # = function.tehai_convert_reverse(temp_tehai)
            temp_janshi.sutehai.append(function.hai_convert_reverse(i))
            if j == 0:
                init_shanten_suu = shanten_check_new.shanten_check(
                    temp_janshi, taku.hash_table)
            a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                     hash_table, temp_janshi, taku)
            #index_list[i] += 1
            sum_list[i] += a
            pure_point_sum[i] += b
        #shanten_suu + 1で平均打点を割る
        pure_point_sum[i] /= max(init_shanten_suu + 1, 1) * itr

    #print(np.max(sum_list))

    normalized_index_list = np.array(sum_list) / np.sum(np.array(sum_list))
    normalized_list = np.zeros(len(janshi.tehai))
    sum_list_for_tehai_str = np.zeros(len(janshi.tehai))
    pure_point_sum_for_tehai_str = np.zeros(len(janshi.tehai))

    for i in range(len(janshi.tehai)):
        normalized_list[i] = normalized_index_list[function.hai_convert(
            janshi.tehai[i])]
        sum_list_for_tehai_str[i] = sum_list[function.hai_convert(
            janshi.tehai[i])]
        pure_point_sum_for_tehai_str[i] = pure_point_sum[function.hai_convert(
            janshi.tehai[i])]

    sum_list_for_tehai_str = np.array(sum_list_for_tehai_str)
    mean_list_for_tehai_str = sum_list_for_tehai_str / float(itr)
    pure_point_sum_for_tehai_str = np.array(pure_point_sum_for_tehai_str)

    return normalized_list, mean_list_for_tehai_str, pure_point_sum_for_tehai_str
def eval_tehai_point(janshi, taku):

    #デバッグモード
    debug_mode = 0

    #パラメータ関連

    #各シャンテン数に対する平均有効牌枚数
    mean_list = [
        4.575752953784895, 12.18668553881974, 23.338351152742664,
        40.50627978155267, 60.56931288649266, 77.81782501846193,
        100.03097486813587
    ]

    shanten_bonus = 5
    yuukouhai_bonus = 2.0
    yuukouhai_pow_const = 1.0
    dora_bonus0 = 1.1  #ドラインデックスの牌
    dora_bonus1 = 0.6  #ドラインデックス前後の牌
    dora_bonus2 = 0.3  #ドラインデックスから2枚離れた牌
    yakuhai_bonus = [0, 0.2, 0.7, 1.2]  #0枚~3枚以上
    ryanmen_bonus = 0.3
    penchan_penalty = -0.5
    koritsu_yaochu_penalty = -0.25  #1,9
    koritsu_suuhai_penalty2 = -0.05  #2,8
    koritsu_suuhai_penalty3 = -0.01  #3~7
    koritsu_jihai_penalty = -0.33
    koritsu_nokori_yakuhai_penalty = [-0.5, -0.35, -0.2, 0.0]
    toitsu_nokori_yakuhai_penalty = [-1.2, -0.7, 0.0, 0.0]
    koritsu_nokori_jihai_penalty = [-0.3, -0.2, -0.1, 0.0]
    toitsu_nokori_jihai_penalty = [-0.4, -0.3, 0.0, 0.0]
    tanyao_bonus = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3, 0.6, 1.0]
    ittsuu_bonus = [0, 0, 0, 0, 0, 0, 0.2, 0.7, 1.1, 1.4]
    sansyoku_bonus = [0, 0, 0, 0, 0, 0, 0.2, 0.8, 1.2, 1.6]
    honitsu_bonus = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 1.0, 2.0, 3.0]
    yipeko_param1 = 1.0  #222
    yipeko_param2 = 0.8  #122, 221
    yipeko_param3 = 0.6  #212
    yipeko_param4 = 0.5  #212(1,9含む)
    yipeko_param5 = 0.4  #221, 122(1,9含む)
    furiten_penalty = [-0.2, -0.5, -0.2]
    furiten_penalty_for_yuukouhai = -0.4
    mentsu_bonus = 1.0

    #メイン
    eval_point_list = [0] * len(janshi.tehai)
    old_shanten_suu = shanten_check_new.shanten_check(janshi, taku.hash_table)
    for i in range(len(janshi.tehai)):

        if debug_mode:
            print("捨てる牌: " + janshi.tehai[i])

        #コピーして手牌を1つ削除
        temp_janshi = copy.deepcopy(janshi)
        temp_janshi.sutehai.append(temp_janshi.tehai[i])
        del temp_janshi.tehai[i]

        #赤ドラだけ抜き出してあとは赤ナシで考える
        temp = function.akadora_convert(temp_janshi.tehai)
        akadora_maisuu = temp[1]
        temp_janshi.tehai = temp[0]
        tehai = function.tehai_convert(temp_janshi.tehai)

        #vertual_yama
        vertual_yama_index = function.tehai_convert(temp_janshi.vertual_yama)
        #print(vertual_yama_index)

        #メンツカウント
        mentsu_suu = mentsu_count.mentsu_count(temp_janshi)
        mentsu_point = mentsu_suu * mentsu_bonus
        eval_point_list[i] += mentsu_point
        if debug_mode:
            print("メンツボーナス: " + str(mentsu_point))

        #シャンテン数関連

        new_shanten_suu = shanten_check_new.shanten_check(
            temp_janshi, taku.hash_table)
        if old_shanten_suu == new_shanten_suu:
            eval_point_list[i] += shanten_bonus
            if debug_mode:
                print("シャンテンアップボーナス: " + str(shanten_bonus))
        else:
            if debug_mode:
                print("シャンテンアップボーナス: " + str(0))
        #print(eval_point_list[i])

        #有効牌関連
        yuukouhai_maisuu = function.calc_yuukouhai_maisuu(
            temp_janshi, new_shanten_suu, taku.hash_table)
        yuukouhai_point = ((yuukouhai_maisuu /
                            (len(temp_janshi.vertual_yama) / 123.0 *
                             mean_list[new_shanten_suu]))**
                           yuukouhai_pow_const) * yuukouhai_bonus
        eval_point_list[i] += yuukouhai_point
        if debug_mode:
            print("有効牌ボーナス: " + str(yuukouhai_point))
        #print(eval_point_list[i])

        #ドラ関連とりあえず1枚の時だけ
        dora_index = []
        dora_hyouji_index = function.tehai_convert2(
            function.akadora_convert(taku.dorahyouji)[0]).copy()
        for j in range(len(taku.dorahyouji)):
            ##まずドラのインデックスを求める
            if dora_hyouji_index[j] < 30:
                if dora_hyouji_index[j] % 10 == 9:
                    dora_index.append(dora_hyouji_index[j] - 8)
                else:
                    dora_index.append(dora_hyouji_index[j] + 1)
            else:
                if dora_hyouji_index[j] == 34:
                    dora_index.append(31)
                elif dora_hyouji_index[j] == 37:
                    dora_index.append(35)
                else:
                    dora_index.append(dora_hyouji_index[j] + 1)

        dora_point = 0

        #赤ドラ
        dora_point += akadora_maisuu * dora_bonus0

        for j in range(len(dora_index)):
            if dora_index[j] < 30:
                if dora_index[j] % 10 == 1:
                    dora_point += tehai[dora_index[j]] * dora_bonus0
                    dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1
                    dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2
                elif dora_index[j] % 10 == 2:
                    dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus2
                    dora_point += tehai[dora_index[j]] * dora_bonus0
                    dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1
                    dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2
                elif dora_index[j] % 10 == 8:
                    dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2
                    dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1
                    dora_point += tehai[dora_index[j]] * dora_bonus0
                    dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus2
                elif dora_index[j] % 10 == 1:
                    dora_point += tehai[dora_index[j]] * dora_bonus0
                    dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1
                    dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2
                else:
                    dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2
                    dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1
                    dora_point += tehai[dora_index[j]] * dora_bonus0
                    dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1
                    dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2
            else:
                dora_point += tehai[dora_index[j]] * dora_bonus0

        eval_point_list[i] += dora_point
        if debug_mode:
            print("ドラボーナス: " + str(dora_point))
        #print(eval_point_list[i])

        #役牌
        if taku.kaze_honba[0] < 4:
            bakaze_index = 31
        else:
            bakaze_index = 32
        jikaze_index = temp_janshi.kaze + 31

        yakuhai_point = 0
        yakuhai_point += yakuhai_bonus[tehai[bakaze_index]]
        yakuhai_point += yakuhai_bonus[tehai[jikaze_index]]
        yakuhai_point += yakuhai_bonus[tehai[35]]
        yakuhai_point += yakuhai_bonus[tehai[36]]
        yakuhai_point += yakuhai_bonus[tehai[37]]

        #ペナ
        if tehai[bakaze_index] == 1:
            yakuhai_point += koritsu_nokori_yakuhai_penalty[
                vertual_yama_index[bakaze_index]]
        elif tehai[bakaze_index] == 2:
            yakuhai_point += toitsu_nokori_yakuhai_penalty[
                vertual_yama_index[bakaze_index]]

        if tehai[jikaze_index] == 1:
            yakuhai_point += koritsu_nokori_yakuhai_penalty[
                vertual_yama_index[jikaze_index]]
        elif tehai[jikaze_index] == 2:
            yakuhai_point += toitsu_nokori_yakuhai_penalty[
                vertual_yama_index[jikaze_index]]

        for j in range(3):
            if tehai[35 + j] == 1:
                yakuhai_point += koritsu_nokori_yakuhai_penalty[
                    vertual_yama_index[35 + j]]
            elif tehai[35 + j] == 2:
                yakuhai_point += toitsu_nokori_yakuhai_penalty[
                    vertual_yama_index[35 + j]]

        #役牌以外の字牌に対するペナ
        for j in range(4):
            if 31 + j != bakaze_index and 31 + j != jikaze_index:
                if tehai[31 + j] == 1:
                    yakuhai_point += koritsu_nokori_jihai_penalty[
                        vertual_yama_index[31 + j]]
                elif tehai[31 + j] == 2:
                    yakuhai_point += toitsu_nokori_jihai_penalty[
                        vertual_yama_index[31 + j]]

        eval_point_list[i] += yakuhai_point
        if debug_mode:
            print("役牌ボーナス: " + str(yakuhai_point))
        #print(eval_point_list[i])

        #リャンメンボーナス(テスト)
        ryanmen_point = 0
        for j in range(30):
            if 2 <= j % 10 <= 7:
                if tehai[j - 1] == 0 and tehai[j] >= 1 and tehai[
                        j + 1] >= 1 and tehai[j + 2] == 0:
                    ryanmen_point += ryanmen_bonus
        eval_point_list[i] += ryanmen_point
        if debug_mode:
            print("リャンメンボーナス: " + str(ryanmen_point))
        #print(eval_point_list[i])

        #ペンチャンペナルティ
        penchan_point = 0
        for j in range(30):
            if j % 10 == 1 or j % 10 == 8:
                if tehai[j - 1] == 0 and tehai[j] == 1 and tehai[
                        j + 1] == 1 and tehai[j + 2] == 0:
                    penchan_point += penchan_penalty
                elif tehai[j - 1] == 0 and tehai[j] >= 1 and tehai[
                        j + 1] >= 1 and tehai[j + 2] == 0:
                    penchan_point += penchan_penalty * 0.1
        if debug_mode:
            print("ペンチャンペナルティ: " + str(penchan_point))
        eval_point_list[i] += penchan_point

        #孤立牌ペナルティandフリテンペナルティ
        koritsu_suuhai_point = 0
        koritsu_jihai_point = 0
        koritsu_list = function.tehai_koritsu_hantei(temp_janshi.tehai)
        for j in koritsu_list:
            koritsu_index = function.hai_convert(temp_janshi.tehai[j])
            if koritsu_index < 30:
                if (koritsu_index % 10 == 2) or (koritsu_index % 10 == 8):
                    koritsu_suuhai_point += koritsu_suuhai_penalty2
                elif 3 <= koritsu_index % 10 <= 7:
                    koritsu_suuhai_point += koritsu_suuhai_penalty3
                else:
                    koritsu_suuhai_point += koritsu_yaochu_penalty
            else:
                koritsu_jihai_point += koritsu_jihai_penalty

        eval_point_list[i] += koritsu_suuhai_point
        if debug_mode:
            print("孤立数牌ペナルティ: " + str(koritsu_suuhai_point))
        eval_point_list[i] += koritsu_jihai_point
        if debug_mode:
            print("孤立字牌ペナルティ: " + str(koritsu_jihai_point))
        #print(eval_point_list[i])

        #フリテンペナルティ 孤立牌がフリテン絡みand有効牌がフリテン絡み
        furiten_point = 0
        kawa_no_akadora = function.tehai_convert(
            function.akadora_convert(temp_janshi.sutehai)[0])
        for j in range(len(kawa_no_akadora)):
            kawa_no_akadora[j] = bool(kawa_no_akadora[j])

        #孤立牌に対して
        for j in koritsu_list:
            koritsu_index = function.hai_convert(temp_janshi.tehai[j])
            if koritsu_index < 30:
                if 2 <= koritsu_index % 10 <= 8:
                    if kawa_no_akadora[koritsu_index - 2]:
                        furiten_point += furiten_penalty[2]
                    if kawa_no_akadora[koritsu_index - 1]:
                        furiten_point += furiten_penalty[1]
                    if kawa_no_akadora[koritsu_index]:
                        furiten_point += furiten_penalty[0]
                    if kawa_no_akadora[koritsu_index + 1]:
                        furiten_point += furiten_penalty[1]
                    if kawa_no_akadora[koritsu_index + 2]:
                        furiten_point += furiten_penalty[2]
                elif koritsu_index % 10 == 1:
                    if kawa_no_akadora[koritsu_index]:
                        furiten_point += furiten_penalty[0]
                    if kawa_no_akadora[koritsu_index + 1]:
                        furiten_point += furiten_penalty[1]
                    if kawa_no_akadora[koritsu_index + 2]:
                        furiten_point += furiten_penalty[2]
                elif koritsu_index % 10 == 9:
                    if kawa_no_akadora[koritsu_index - 2]:
                        furiten_point += furiten_penalty[2]
                    if kawa_no_akadora[koritsu_index - 1]:
                        furiten_point += furiten_penalty[1]
                    if kawa_no_akadora[koritsu_index]:
                        furiten_point += furiten_penalty[0]
            else:
                if kawa_no_akadora[koritsu_index]:
                    furiten_point += furiten_penalty[0]

        #有効牌に対して
        yuukouhai_index_list = function.find_yuukouhai(temp_janshi,
                                                       new_shanten_suu,
                                                       taku.hash_table)
        for index in yuukouhai_index_list:
            if kawa_no_akadora[index]:
                furiten_point += furiten_penalty_for_yuukouhai
        eval_point_list[i] += furiten_point
        if debug_mode:
            print("フリテンペナルティ: " + str(furiten_point))

        #タンヤオボーナス
        tanyao_point = 0
        tanyao_sum = function.tanyao_sum_up(temp_janshi)
        tanyao_point = tanyao_bonus[tanyao_sum]
        eval_point_list[i] += tanyao_point
        if debug_mode:
            print("タンヤオボーナス: " + str(tanyao_point))
        #print(eval_point_list[i])

        #一通ボーナス
        ittsuu_point = 0
        for j in range(3):
            ittsuu_point += ittsuu_bonus[function.ittsuu_sum_up(
                temp_janshi, j)]
        eval_point_list[i] += ittsuu_point
        if debug_mode:
            print("一通ボーナス: " + str(ittsuu_point))
        #print(eval_point_list[i])

        #三色ボーナス
        sansyoku_point = 0
        for j in range(1, 8):
            sansyoku_point += sansyoku_bonus[function.sansyoku_sum_up(
                temp_janshi, j)]
        eval_point_list[i] += sansyoku_point
        if debug_mode:
            print("三色ボーナス: " + str(sansyoku_point))

        #ホンイツボーナス
        honitsu_point = 0
        for j in range(3):
            honitsu_point += honitsu_bonus[function.honitsu_sum_up(
                temp_janshi, j)]
        eval_point_list[i] += honitsu_point
        if debug_mode:
            print("ホンイツボーナス: " + str(honitsu_point))

        #一盃口ボーナス
        yipeko_point = 0
        for j in range(3):
            yipeko_point += function.yipeko_eval(janshi, j, yipeko_param1,
                                                 yipeko_param2, yipeko_param3,
                                                 yipeko_param4, yipeko_param5)
        eval_point_list[i] += yipeko_point
        if debug_mode:
            print("一盃口ボーナス: " + str(yipeko_point))

        if debug_mode:
            print("  トータルポイント: " + str(eval_point_list[i]))
            print()
    eval_point_array = np.array(eval_point_list)
    normalized_eval_point_array = eval_point_array / np.sum(eval_point_array)
    return normalized_eval_point_array
Exemple #22
0
def jicha_tsumo(janshi, taku, splitted_read_text):
    output = ""
    start = time.time()
    taku.yama_nokori -= 1
    hai_136 = int(splitted_read_text[1].strip("T"))
    #print(hai_136)
    print("ツモ牌:" + function_tenhou.hai_convert_136_to_str(hai_136))
    print("残りツモ回数:" + str(int(taku.yama_nokori / 4)) + "回")
    hai_str = function_tenhou.hai_convert_136_to_str(hai_136)
    janshi[0].tsumo(hai_str, hai_136)
    print(janshi[0].tehai)

    print("シャンテン数: " +
          str(shanten_check_new.shanten_check(janshi[0], taku.hash_table)))

    #暗槓&カカン
    temp_ankan = janshi[0].ankan(taku)
    if temp_ankan != -1:
        print("AI 暗槓: " + function.hai_convert_reverse(temp_ankan))
        output = function.hai_convert_reverse(temp_ankan)
        #天鳳に出力
        if time.time() - start < taku.sleep_time_thresh:
            time.sleep(taku.sleep_time)
        gui_click("Kan", output)
        return None

    temp_kakan = janshi[0].kakan(taku)
    if temp_kakan[0] != -1:
        print("AI 加槓: " + function.hai_convert_reverse(temp_kakan[1]))
        if temp_kakan[2]:
            output = function.hai_convert_reverse(temp_kakan[1] - 5)
        else:
            output = function.hai_convert_reverse(temp_kakan[1])

        #天鳳に出力
        if time.time() - start < taku.sleep_time_thresh:
            time.sleep(taku.sleep_time)
        gui_click("Kan", output)
        return None

    #ツモアガリか立直
    if len(splitted_read_text) > 2:
        #ツモアガリ
        if splitted_read_text[3] == "64":
            if shanten_check_new.shanten_check(janshi[0],
                                               taku.hash_table) >= 3:
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                print("AI 九種九牌流局")
                gui_click("Kyuusyu")
                return None

        if splitted_read_text[3] == "16" or splitted_read_text[
                3] == "48" or splitted_read_text[3] == "112":
            #とりあえずツモアガリする
            print("AI ツモアガリ")
            #天鳳に出力
            if time.time() - start < taku.sleep_time_thresh:
                time.sleep(taku.sleep_time)
            gui_click("Agari")
            return None
        #立直
        if splitted_read_text[3] == "32":
            #a→点数がthreshに届いてるか, b→立直時or保留時の打牌index, c→保留するかどうか
            a, b, c = riichi_hantei3.riichi_hantei(janshi[0], taku)
            #オーラスなら条件考慮
            if taku.bakyou_list[0]:
                hai_str = function.hai_convert_reverse(b)
                #アガリ点の平均値
                dama_point = function.dama_hantei(janshi[0], taku, hai_str)
                if a:
                    #全ての待ち牌に対してダマでロンアガリできる
                    if dama_point:
                        if taku.bakyou_list[0] == 1 or taku.bakyou_list[0] == 3:
                            print("AI ダマテン")
                            print("AI 打:" + hai_str)
                            output = hai_str
                            if time.time() - start < taku.sleep_time_thresh:
                                time.sleep(taku.sleep_time)
                            gui_click("Dahai", output)
                            janshi[0].riipai()
                            return None
                        else:
                            #ダマでは点数が足りない
                            if taku.bakyou_list[1] > dama_point:
                                print("AI リーチ")
                                taku.riichi_dahai = hai_str
                                print("AI 打:" + taku.riichi_dahai)
                                #天鳳に出力
                                if time.time(
                                ) - start < taku.sleep_time_thresh:
                                    time.sleep(taku.sleep_time)
                                gui_click("Riichi")
                                janshi[0].riipai()
                                return None
                            #ダマでも点数が足りる
                            else:
                                print("AI ダマテン")
                                print("AI 打:" + hai_str)
                                output = hai_str
                                if time.time(
                                ) - start < taku.sleep_time_thresh:
                                    time.sleep(taku.sleep_time)
                                gui_click("Dahai", output)
                                janshi[0].riipai()
                                return None
                    #ダマでロンアガリできない待ち牌がある
                    else:
                        print("AI リーチ")
                        taku.riichi_dahai = hai_str
                        print("AI 打:" + taku.riichi_dahai)
                        #天鳳に出力
                        if time.time() - start < taku.sleep_time_thresh:
                            time.sleep(taku.sleep_time)
                        gui_click("Riichi")
                        janshi[0].riipai()
                        return None
                elif c:
                    print("AI リーチ保留")
                    temp_index = 0
                    print("AI 打:" + hai_str)
                    output = hai_str
                    if time.time() - start < taku.sleep_time_thresh:
                        time.sleep(taku.sleep_time)
                    gui_click("Dahai", output)
                    janshi[0].riipai()
                    return None
                #threshに足りてない(aとほぼ同じ。ラスの時だけ立直)
                else:
                    pass
                    #全ての待ち牌に対してダマでロンアガリできる
                    if dama_point:
                        if taku.bakyou_list[0] == 1 or taku.bakyou_list[0] == 3:
                            print("AI ダマテン")
                            print("AI 打:" + hai_str)
                            output = hai_str
                            if time.time() - start < taku.sleep_time_thresh:
                                time.sleep(taku.sleep_time)
                            gui_click("Dahai", output)
                            janshi[0].riipai()
                            return None
                        else:
                            #ダマでは点数が足りない
                            if taku.bakyou_list[1] > dama_point:
                                print("AI リーチ")
                                taku.riichi_dahai = hai_str
                                print("AI 打:" + taku.riichi_dahai)
                                #天鳳に出力
                                if time.time(
                                ) - start < taku.sleep_time_thresh:
                                    time.sleep(taku.sleep_time)
                                gui_click("Riichi")
                                janshi[0].riipai()
                                return None
                            #ダマでも点数が足りる
                            else:
                                print("AI ダマテン")
                                print("AI 打:" + hai_str)
                                output = hai_str
                                if time.time(
                                ) - start < taku.sleep_time_thresh:
                                    time.sleep(taku.sleep_time)
                                gui_click("Dahai", output)
                                janshi[0].riipai()
                                return None
                    #ダマでロンアガリできない待ち牌がある
                    else:
                        #ラスの時だけ立直
                        if taku.bakyou_list[0] == 4:
                            print("AI リーチ")
                            taku.riichi_dahai = hai_str
                            print("AI 打:" + taku.riichi_dahai)
                            #天鳳に出力
                            if time.time() - start < taku.sleep_time_thresh:
                                time.sleep(taku.sleep_time)
                            gui_click("Riichi")
                            janshi[0].riipai()
                            return None
            #オーラス以外
            else:
                if a:
                    print("AI リーチ")
                    b_str = function.hai_convert_reverse(b)
                    temp_index = 0
                    for j in range(len(janshi[0].tehai)):
                        if b_str == janshi[0].tehai[j]:
                            temp_index = j
                            break

                    taku.riichi_dahai = janshi[0].tehai[temp_index]
                    print("AI 打:" + taku.riichi_dahai)
                    #janshi[0].func_riichi(taku)
                    #天鳳に出力
                    if time.time() - start < taku.sleep_time_thresh:
                        time.sleep(taku.sleep_time)
                    gui_click("Riichi")
                    janshi[0].riipai()
                    return None
                elif c:
                    print("AI リーチ保留")
                    b_str = function.hai_convert_reverse(b)
                    temp_index = 0
                    for j in range(len(janshi[0].tehai)):
                        if b_str == janshi[0].tehai[j]:
                            temp_index = j
                            break
                    print("AI 打:" + b_str)
                    output = b_str
                    if time.time() - start < taku.sleep_time_thresh:
                        time.sleep(taku.sleep_time)
                    gui_click("Dahai", output)
                    janshi[0].riipai()
                    return None

    #ツモアガリも立直もしない時
    max_index = int(janshi[0].dahai(taku, janshi, taku.bakyou_list))
    hai_str = janshi[0].tehai[max_index]
    print("AI 打:" + hai_str)
    #天鳳に出力 立直時はしない
    if not janshi[0].riichi:
        output = hai_str
        if time.time() - start < taku.sleep_time_thresh:
            time.sleep(taku.sleep_time)

        gui_click("Dahai", output)
    janshi[0].riipai()