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