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 ankan_convert(janshi, hai_str): janshi.tsumohai_list.append(hai_str + "暗槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 4 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return hai_index
def daiminkan_convert(janshi, hai_str, teban): janshi.tsumohai_list.append(hai_str + "大明槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 3 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [3, hai_index, teban]
def pon_convert(janshi, hai_str, teban, akadora_flag): janshi.tsumohai_list.append(hai_str + "ポン") janshi.fuuro_akadora_list.append(akadora_flag) temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(function.akadora_hai_convert(hai_str)) temp_tehai[hai_index] -= 2 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [2, hai_index, teban]
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
def kakan_convert(janshi, hai_str, fuuro_index): if janshi.fuurohai[fuuro_index][1] % 10 == 5 and janshi.fuurohai[ fuuro_index][1] < 30: janshi.fuuro_akadora_list[fuuro_index] = True janshi.tsumohai_list.append(hai_str + "加槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [3, hai_index, 0]
def chii_convert(janshi, hai_str, chii_index, akadora_flag): janshi.tsumohai_list.append(hai_str + "チー") janshi.fuuro_akadora_list.append(akadora_flag) temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(function.akadora_hai_convert(hai_str)) if chii_index == 0: temp_tehai[hai_index - 2] -= 1 temp_tehai[hai_index - 1] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index] elif chii_index == 1: temp_tehai[hai_index - 1] -= 1 temp_tehai[hai_index + 1] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index] elif chii_index == 2: temp_tehai[hai_index + 1] -= 1 temp_tehai[hai_index + 2] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index]
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
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
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