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)
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 yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi, taku):

    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4) + 1
    yuukouhai_boost = 1.45
    shanten_const = np.sum(yama) / nokori_tsumo_kaisuu * 10

    yuukouhai_list = find_yuukouhai(janshi, shanten_suu, hash_table)
    yuukouhai_prob_list = create_yuukouhai_prob_list(yuukouhai_list, yama)
    #yuukouhai_prob_listの要素がない場合
    if len(yuukouhai_prob_list) == 0:
        yuukouhai_prob_list = yuukouhai_list
    index = random.choice(yuukouhai_prob_list)
    janshi.tehai.append(function.hai_convert_reverse(index))
    yuukouhai_num = 0.001
    for i in yuukouhai_list:
        yuukouhai_num += yama[i]

    #ツモって来る牌が自身の捨て牌にあれば補正
    if function.hai_convert_reverse(index) in janshi.sutehai:
        furiten_hosei = 0.25
    else:
        furiten_hosei = 1.0

    #テンパイ時に待ち牌に対してブーストを行う
    if shanten_suu == 0:
        count *= yuukouhai_num**(
            yuukouhai_boost) / shanten_const * furiten_hosei
    else:
        count *= yuukouhai_num / shanten_const * furiten_hosei
    yama[index] -= 1

    shanten_suu -= 1

    if shanten_suu == -1:
        agarihai_str = function.hai_convert_reverse(index)
        #tehai_str = function.tehai_convert_reverse(tehai)
        ##temp_janshi = copy.deepcopy(janshi)
        #temp_janshi.tehai =  tehai_str
        #print(tehai_str)
        #print(temp_janshi.fuurohai)
        #print(count)
        point_temp = tensu_calc.tensu_calc(janshi, taku, agarihai_str)
        if len(point_temp) == 0:
            point = 0
        elif point_temp[0] == point_temp[1]:
            point = point_temp[0] * 3
        else:
            point = point_temp[0] * 2 + point_temp[1]
        #print(point)
        return count * point
        #return count*teyaku_check.teyaku_check(janshi, taku, agarihai_str)[0]

    yuukou_sutehai_index_list = find_yuukou_sutehai(janshi, shanten_suu,
                                                    hash_table)
    index2 = random.choice(yuukou_sutehai_index_list)
    janshi.tehai.remove(function.hai_convert_reverse(index2))
    return yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi,
                             taku)
def yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi, taku , janshi_list, bakyou_list, danger_degree_list):
    
    nokori_tsumo_kaisuu = int(taku.yama_nokori/4)+1
    yuukouhai_boost = 1.45
    shanten_const = np.sum(yama) / nokori_tsumo_kaisuu * 10

    yuukouhai_list = find_yuukouhai(janshi, shanten_suu, hash_table)
    yuukouhai_prob_list = create_yuukouhai_prob_list(yuukouhai_list, yama)
    #yuukouhai_prob_listの要素がない場合
    if len(yuukouhai_prob_list) == 0:
        yuukouhai_prob_list = yuukouhai_list
    index = random.choice(yuukouhai_prob_list)
    janshi.tehai.append(function.hai_convert_reverse(index))
    yuukouhai_num = 0.001
    for i in yuukouhai_list:
        yuukouhai_num += yama[i]

    #ツモって来る牌が自身の捨て牌にあれば補正
    if function.hai_convert_reverse(index) in janshi.sutehai:
        furiten_hosei = 0.25
    else:
        furiten_hosei = 1.0

    #テンパイ時に待ち牌に対してブーストを行う
    if shanten_suu == 0:
        count *= yuukouhai_num**(yuukouhai_boost)/shanten_const/danger_degree_list[function.akadora_hai_convert2(index)]*furiten_hosei
        #print(yuukouhai_num)
        #print(np.sum(yama))
    else:
        count *= yuukouhai_num/shanten_const/danger_degree_list[function.akadora_hai_convert2(index)]*furiten_hosei
    yama[index] -= 1
    
    shanten_suu -= 1
    
    if shanten_suu == -1:
        agarihai_str = function.hai_convert_reverse(index)
        #ロンアガリを想定(三暗刻防止)
        del janshi.tehai[-1]
        point_temp = tensu_calc.tensu_calc(janshi, taku, agarihai_str)
        if len(point_temp) == 0:
            point = 0
        else:
            point = point_temp[0]
        #print(point)
        #print(count*point)
        if point > 0:
            #条件判断用
            fixed_point = point + taku.kyoutaku_tensuu + taku.kaze_honba[1] * 300.0
        else:
            fixed_point = point
        return count * point, fixed_point, point
    
    yuukou_sutehai_index_list = find_yuukou_sutehai(janshi, shanten_suu, hash_table) 
    index2 = random.choice(yuukou_sutehai_index_list)
    janshi.tehai.remove(function.hai_convert_reverse(index2))
    return yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi, taku, janshi_list, bakyou_list, danger_degree_list)
Exemple #5
0
    def renew_vertual_yama_pon(self, hai_str, janshi_pon):
        hai_index = function.hai_convert(hai_str)

        #hai_strが5でjanshi_ponのfuuro_akadora_list[-1]がTrueなら赤ドラを追加
        if hai_index % 10 == 5 and janshi_pon.fuuro_akadora_list[-1]:
            self.vertual_yama.remove(hai_str)
            self.vertual_yama.remove(
                function.hai_convert_reverse(hai_index - 5))
        #赤5が鳴かれたとき
        elif hai_index % 10 == 0:
            self.vertual_yama.remove(
                function.hai_convert_reverse(hai_index + 5))
            self.vertual_yama.remove(
                function.hai_convert_reverse(hai_index + 5))
        else:
            self.vertual_yama.remove(hai_str)
            self.vertual_yama.remove(hai_str)
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)
    #mean_list = [0]*len(tehai)
    hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    #print(hai_list)
    #副露した時でアガリ役なしの場合
    if len(hai_list) == 0:
        return random.choice(range(len(janshi.tehai))), 0

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

    #print(hai_list)
    itr = 25

    for i in hai_list:
        for j in range(itr):
            count = 1.
            temp_janshi = copy.deepcopy(janshi)
            temp_tehai = tehai.copy()
            temp_yama = yama.copy()
            temp_tehai[i] -= 1
            temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai)
            a = yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                  hash_table, temp_janshi, taku)
            #index_list[i] += 1
            sum_list[i] += a
        sum_list[i] /= float(itr)

    #for i in range(len(tehai)):
    #    mean_list[i] = sum_list[i]/float(itr)

    maximum_index_num = -1
    #print(janshi.tehai)
    #print(np.round(sum_list,2))

    maximum_expect = np.max(sum_list)
    return_hai_str = function.hai_convert_reverse(np.argmax(sum_list))
    #print(return_hai_str)

    for i in range(len(janshi.tehai)):
        if janshi.tehai[i] == return_hai_str:
            maximum_index_num = i
            break
    #print(maximum_index_num)
    assert maximum_index_num >= 0
    return maximum_index_num, maximum_expect
Exemple #7
0
 def renew_vertual_yama_ankan(self, hai_str):
     hai_index = function.hai_convert(hai_str)
     if hai_index % 10 == 5 and hai_index < 30:
         aka_hai_str = function.hai_convert_reverse(hai_index - 5)
         self.vertual_yama.remove(aka_hai_str)
         self.vertual_yama.remove(hai_str)
         self.vertual_yama.remove(hai_str)
         self.vertual_yama.remove(hai_str)
     else:
         self.vertual_yama.remove(hai_str)
         self.vertual_yama.remove(hai_str)
         self.vertual_yama.remove(hai_str)
         self.vertual_yama.remove(hai_str)
def yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi, taku):
    
    yuukouhai_boost = 1.45
    
    yuukouhai_list = find_yuukouhai(janshi, shanten_suu, hash_table)
    yuukouhai_prob_list = create_yuukouhai_prob_list(yuukouhai_list, yama)
    #yuukouhai_prob_listの要素がない場合
    if len(yuukouhai_prob_list) == 0:
        yuukouhai_prob_list = yuukouhai_list
    index = random.choice(yuukouhai_prob_list)
    tehai = function.tehai_convert(janshi.tehai)
    tehai[index] += 1  
    yuukouhai_num = 0
    for i in yuukouhai_list:
        yuukouhai_num += yama[i]
    #テンパイ時に待ち牌に対してブーストを行う
    if shanten_suu == 0:
        count *= yuukouhai_num**(yuukouhai_boost)/len(yama)
    else:
        count *= yuukouhai_num/len(yama)
    yama[index] -= 1
    
    shanten_suu -= 1
    
    if shanten_suu == -1:
        agarihai_str = function.hai_convert_reverse(index)
        tehai_str = function.tehai_convert_reverse(tehai)
        temp_janshi = copy.deepcopy(janshi)
        temp_janshi.tehai =  tehai_str
        point_temp = tensu_calc.tensu_calc(temp_janshi, taku, agarihai_str)
        if len(point_temp) == 0:
            point = 0
        elif point_temp[0] == point_temp[1]:
            point  = point_temp[0]*3
        else:
            point = point_temp[0] * 2 + point_temp[1]
        return count * point
    
    temp_janshi2 = copy.deepcopy(janshi)
    temp_tehai = tehai.copy()
    temp_janshi2.tehai = function.tehai_convert_reverse(temp_tehai)
    
    yuukou_sutehai_index_list = find_yuukou_sutehai(temp_janshi2, shanten_suu, hash_table) 
    index2 = random.choice(yuukou_sutehai_index_list)
    tehai[index2] -= 1
    temp_tehai = tehai.copy()
    temp_janshi2.tehai = function.tehai_convert_reverse(temp_tehai)
    return yuukouhai_explore(yama, shanten_suu, count, hash_table, temp_janshi2, taku)
def new_yuukouhai_explore(shanten_suu, janshi, taku, kuikae_list):
    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
    sum_list = [0]*len(tehai)
    hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    
    #hai_listからkuikae_listを削除
    temp_hai_list = hai_list.copy()
    for i in range(len(hai_list)):
        if temp_hai_list[i] in kuikae_list:
            hai_list.remove(temp_hai_list)
    
    #副露した時でアガリ役なしの場合
    if len(hai_list) == 0:
        return random.choice(range(len(janshi.tehai))), 0
    
    #バグ防止用
    for i in hai_list:
        sum_list[i] += 0.001
    
    itr = 25
    
    for j in range(itr):
        count = 1.      
        for i in hai_list:
            temp_janshi = copy.deepcopy(janshi)
            temp_tehai = tehai.copy()
            temp_yama = yama.copy()       
            temp_tehai[i] -= 1
            temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai)
            a = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku)
            sum_list[i] += a
    
    maximum_index_num = -1
    
    maximum_expect = np.max(sum_list)
    return_hai_str = function.hai_convert_reverse(np.argmax(sum_list))
    
    for i in range(len(janshi.tehai)):
        if janshi.tehai[i] == return_hai_str:
            maximum_index_num = i
            break
    assert maximum_index_num >= 0
    return maximum_index_num, maximum_expect
Exemple #10
0
]
taku.dorahyouji = ["1m"]
janshi.tehai = input_data

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)
print(input_str)

#2→41 3→124 4→データ型改善
main_nn = N_network(124, 38)
main_nn.model.load_weights("v1.hdf5")

x = convert(input_str)

x = np.array(x)
y = x.reshape(1, 124)  #重要

print("input")
print(y)
result = main_nn.model.predict(y)
print("result")
print(result)

print("AI 打:" + function.hai_convert_reverse(np.argmax(result)))
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, kuikae_list, top4_list, janshi_list, bakyou_list):
    hash_table = taku.hash_table
    tehai = np.array(function.tehai_convert(janshi.tehai))
    danger_degree_list = danger_degree.create_danger_degree_list(janshi_list, taku, bakyou_list)
    #print(danger_degree_list)
    
    #ツモって来る牌に赤ドラは考慮しない
    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)
    pure_pure_point_sum = [0]*len(tehai)
    max_point = [0]*len(tehai)
    #mean_list = [0]*len(tehai)
    if init_shanten_suu >= 2:
        hai_list = top4_list
    else:
        hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    #print(hai_list)

    #hai_listからkuikae_listを削除
    temp_hai_list = hai_list.copy()
    for i in range(len(hai_list)):
        if temp_hai_list[i] in kuikae_list:
            hai_list.remove(temp_hai_list[i])

    #副露した時でアガリ役なしの場合
    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), [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 = 20
    else:
        itr = 25

    for i in hai_list:
        for j in range(itr):
            count = 1.
            temp_janshi = copy.deepcopy(janshi)
            temp_yama = yama.copy()      
            temp_janshi.tehai.remove(function.hai_convert_reverse(i))
            temp_janshi.sutehai.append(function.hai_convert_reverse(i))
            #評価用の修正されたpoint, 普通の点数
            a, b, c = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku , janshi_list, bakyou_list, danger_degree_list)
            #オーラス用max_pointの更新など
            if b > max_point[i]:
                max_point[i] = b
            pure_point_sum[i] += b
            pure_pure_point_sum[i] += c
                        
            #index_list[i] += 1
            sum_list[i] += a
        pure_pure_point_sum[i] /= max(init_shanten_suu + 1, 1)*itr


    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_mean = np.array(pure_point_sum)/float(itr)
    max_point_list = np.zeros(len(janshi.tehai))
    pure_point_mean_list = 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])]
        max_point_list[i] = max_point[function.hai_convert(janshi.tehai[i])]
        pure_point_mean_list[i] = pure_point_mean[function.hai_convert(janshi.tehai[i])]
        pure_point_sum_for_tehai_str[i] = pure_pure_point_sum[function.hai_convert(janshi.tehai[i])]

    mean_list_for_tehai_str = sum_list_for_tehai_str/float(itr)
   
    return normalized_list, sum_list_for_tehai_str, mean_list_for_tehai_str, max_point_list, pure_point_mean_list, pure_point_sum_for_tehai_str
Exemple #13
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()
Exemple #14
0
def tacha_dahai(key, janshi, taku, splitted_read_text):

    output2 = ["", ""]

    start = time.time()
    hai_136 = int(splitted_read_text[1].strip(key))
    hai_str = function_tenhou.hai_convert_136_to_str(hai_136)
    janshi[0].vertual_yama.remove(hai_str)
    janshi[key_to_index[key]].sutehai.append(hai_str)
    janshi[key_to_index[key]].tedashi_flag.append(key.isupper)  #keyが大文字なら手出し
    janshi[key_to_index[key]].temp_genbutsu = []
    for k in range(1, 4):
        janshi[k].temp_genbutsu.append(hai_str)

    print(key_to_char[key] + " 打:" + hai_str)

    taku.last_dahai = hai_136  #直前の打牌。鳴きに利用する。
    taku.last_teban = key_to_index[key]  #直前の打牌をしたプレイヤー

    #以下鳴き 鳴きの基本方針→赤ドラを副露牌に含められるときは必ず含める
    if len(splitted_read_text) > 2:
        #ロン通知
        if int(splitted_read_text[3]) >= 8:
            #あがる
            print("AI ロン")
            #天鳳に出力
            if time.time() - start < taku.sleep_time_thresh:
                time.sleep(taku.sleep_time)
            gui_click("Agari")
            return None
        #ポン通知
        elif splitted_read_text[3] == "1" or splitted_read_text[3] == "3":
            #ポン打診
            pon_index = janshi[0].pon(taku, hai_str, janshi, taku.bakyou_list)
            if pon_index[0]:
                print("AI ポン")
                #ポンする
                #ポンする牌のindex
                pon_hai_index = function_tenhou.hai_convert_136_to_index(
                    taku.last_dahai)

                #赤なら普通の5に書き換え
                if pon_hai_index % 10 == 0:
                    pon_hai_index += 5

                #もし赤じゃない5をポンするなら
                if pon_hai_index % 10 == 5 and pon_hai_index < 30:
                    tehai_index = function.tehai_convert(janshi[0].tehai)
                    #もし同じ色の赤を持っていたら
                    if tehai_index[pon_hai_index - 5] == 1:
                        output2 = [
                            function.hai_convert_reverse(pon_hai_index - 5),
                            function.hai_convert_reverse(pon_hai_index)
                        ]
                    else:
                        output2 = [
                            function.hai_convert_reverse(pon_hai_index),
                            function.hai_convert_reverse(pon_hai_index)
                        ]
                else:
                    output2 = [
                        function.hai_convert_reverse(pon_hai_index),
                        function.hai_convert_reverse(pon_hai_index)
                    ]

                #print("ポンする牌:" + output2)
                #天鳳に出力
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                print(output2)
                gui_click("Pon_Chii", output2)

                #打牌時の情報を追加
                taku.naki_dahai = pon_index[1]
                print("AI 打:" + taku.naki_dahai)
                return None

            else:
                #鳴かない
                print("AI スルー")
                #天鳳に出力
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                gui_click("Cancel")
                return None
        #チー通知
        elif splitted_read_text[3] == "4":
            #チー打診
            chii_index = janshi[0].chii(taku, hai_str, janshi,
                                        taku.bakyou_list)
            if chii_index[0] != -1:
                print("AI チー: index = " + str(chii_index[0]))
                #チーする

                #チーする牌のindex
                chii_hai_index = function_tenhou.hai_convert_136_to_index(
                    taku.last_dahai)

                #赤をチー
                if chii_hai_index % 10 == 0:
                    chii_hai_index += 5
                    if chii_index[0] == 0:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 2)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                    elif chii_index[0] == 1:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                    else:  # chii_index[0] == 2:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 2)
                #赤以外をチー
                else:
                    if chii_index[0] == 0:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 2)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                    elif chii_index[0] == 1:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                    else:  # chii_index[0] == 2:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 2)

                    #赤の書き換え
                    if chii_index[2]:
                        for j in range(2):
                            if output2[j] == "5m":
                                output2[j] = "5M"
                            elif output2[j] == "5p":
                                output2[j] = "5P"
                            elif output2[j] == "5s":
                                output2[j] = "5S"
                #天鳳に出力
                print(output2)
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                gui_click("Pon_Chii", output2)

                #打牌時の情報を追加
                taku.naki_dahai = chii_index[1]
                print("AI 打:" + taku.naki_dahai)
                return None
            else:
                #鳴かない
                print("AI スルー")
                #天鳳に出力
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                gui_click("Cancel")
                return None
        #ポンチー通知#ポンチーダイミンカン通知
        elif splitted_read_text[3] == "5" or splitted_read_text[3] == "7":
            #ポンチー打診
            pon_index = janshi[0].pon(taku, hai_str, janshi, taku.bakyou_list)
            if pon_index[0]:
                print("AI ポン")
                #ポンする
                #ポンする牌のindex
                pon_hai_index = function_tenhou.hai_convert_136_to_index(
                    taku.last_dahai)

                #赤なら普通の5に書き換え
                if pon_hai_index % 10 == 0:
                    pon_hai_index += 5

                #もし赤じゃない5をポンするなら
                if pon_hai_index % 10 == 5 and pon_hai_index < 30:
                    tehai_index = function.tehai_convert(janshi[0].tehai)
                    #もし同じ色の赤を持っていたら
                    if tehai_index[pon_hai_index - 5] == 1:
                        output2 = [
                            function.hai_convert_reverse(pon_hai_index - 5),
                            function.hai_convert_reverse(pon_hai_index)
                        ]
                    else:
                        output2 = [
                            function.hai_convert_reverse(pon_hai_index),
                            function.hai_convert_reverse(pon_hai_index)
                        ]
                else:
                    output2 = [
                        function.hai_convert_reverse(pon_hai_index),
                        function.hai_convert_reverse(pon_hai_index)
                    ]
                #print("ポンする牌:" + output)
                #天鳳に出力
                print(output2)
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                gui_click("Pon_Chii", output2)

                #打牌時の情報を追加
                taku.naki_dahai = pon_index[1]
                print("AI 打:" + taku.naki_dahai)
                return None

            chii_index = janshi[0].chii(taku, hai_str, janshi,
                                        taku.bakyou_list)
            if chii_index[0] != -1:
                print("AI チー: index = " + str(chii_index[0]))
                #チーする
                #チーする牌のindex
                chii_hai_index = function_tenhou.hai_convert_136_to_index(
                    taku.last_dahai)

                #赤をチー
                if chii_hai_index % 10 == 0:
                    chii_hai_index += 5
                    if chii_index[0] == 0:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 2)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                    elif chii_index[0] == 1:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                    else:  # chii_index[0] == 2:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 2)
                #赤以外をチー
                else:
                    if chii_index[0] == 0:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 2)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                    elif chii_index[0] == 1:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index - 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                    else:  # chii_index[0] == 2:
                        output2[0] = function.hai_convert_reverse(
                            chii_hai_index + 1)
                        output2[1] = function.hai_convert_reverse(
                            chii_hai_index + 2)

                    #赤の書き換え
                    if chii_index[2]:
                        for j in range(2):
                            if output2[j] == "5m":
                                output2[j] = "5M"
                            elif output2[j] == "5p":
                                output2[j] = "5P"
                            elif output2[j] == "5s":
                                output2[j] = "5S"
                #天鳳に出力
                print(output2)
                if time.time() - start < taku.sleep_time_thresh:
                    time.sleep(taku.sleep_time)
                gui_click("Pon_Chii", output2)
                #打牌時の情報を追加
                taku.naki_dahai = chii_index[1]
                print("AI 打:" + taku.naki_dahai)
                return None

            #鳴かない
            print("AI スルー")
            #天鳳に出力
            if time.time() - start < taku.sleep_time_thresh:
                time.sleep(taku.sleep_time)
            gui_click("Cancel")
            return None
    return None
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
Exemple #16
0
    def renew_vertual_yama_chii(self, hai_str, chii_index, janshi_chii):
        hai_index = function.hai_convert(hai_str)

        #もし3が鳴かれてjanshi_chiiのfuuro_akadora_list[-1]がTrueならchii_indexは2で確定で5は赤
        if hai_index % 10 == 3 and janshi_chii.fuuro_akadora_list[-1]:
            hai_str1 = function.hai_convert_reverse(hai_index + 1)
            self.vertual_yama.remove(hai_str1)
            hai_str2 = function.hai_convert_reverse(hai_index - 3)
            self.vertual_yama.remove(hai_str2)
        #もし7が鳴かれてjanshi_chiiのfuuro_akadora_list[-1]がTrueならchii_indexは0で確定で5は赤
        elif hai_index % 10 == 7 and janshi_chii.fuuro_akadora_list[-1]:
            hai_str1 = function.hai_convert_reverse(hai_index - 1)
            self.vertual_yama.remove(hai_str1)
            hai_str2 = function.hai_convert_reverse(hai_index - 7)
            self.vertual_yama.remove(hai_str2)
        #もし4が鳴かれてjanshi_chiiのfuuro_akadora_list[-1]がTrueならchii_indexは1か2で5は赤
        elif hai_index % 10 == 4 and janshi_chii.fuuro_akadora_list[-1]:
            #345
            if chii_index == 1:
                hai_str1 = function.hai_convert_reverse(hai_index - 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index - 4)
                self.vertual_yama.remove(hai_str2)
            else:  #chii_index == 2
                hai_str1 = function.hai_convert_reverse(hai_index - 4)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 2)
                self.vertual_yama.remove(hai_str2)
        #もし6が鳴かれてjanshi_chiiのfuuro_akadora_list[-1]がTrueならchii_indexは0か1で5は赤
        elif hai_index % 10 == 6 and janshi_chii.fuuro_akadora_list[-1]:
            if chii_index == 0:
                hai_str1 = function.hai_convert_reverse(hai_index - 6)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index - 2)
                self.vertual_yama.remove(hai_str2)
            else:  #chii_index = 1
                hai_str1 = function.hai_convert_reverse(hai_index - 6)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 1)
                self.vertual_yama.remove(hai_str2)
        #もし赤5が鳴かれた場合
        elif hai_index % 10 == 0:
            hai_index += 5
            if chii_index == 0:
                hai_str1 = function.hai_convert_reverse(hai_index - 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index - 2)
                self.vertual_yama.remove(hai_str2)
            elif chii_index == 1:
                hai_str1 = function.hai_convert_reverse(hai_index - 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 1)
                self.vertual_yama.remove(hai_str2)
            elif chii_index == 2:
                hai_str1 = function.hai_convert_reverse(hai_index + 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 2)
                self.vertual_yama.remove(hai_str2)
        #それ以外
        else:
            if chii_index == 0:
                hai_str1 = function.hai_convert_reverse(hai_index - 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index - 2)
                self.vertual_yama.remove(hai_str2)
            elif chii_index == 1:
                hai_str1 = function.hai_convert_reverse(hai_index - 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 1)
                self.vertual_yama.remove(hai_str2)
            elif chii_index == 2:
                hai_str1 = function.hai_convert_reverse(hai_index + 1)
                self.vertual_yama.remove(hai_str1)
                hai_str2 = function.hai_convert_reverse(hai_index + 2)
                self.vertual_yama.remove(hai_str2)
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]