def pon_add(self, taku, hai_arr, teban): #tehaiとtehai_136の操作 for i in range(3): if hai_arr[i] in self.tehai_136: self.tehai_136.remove(hai_arr[i]) self.tehai.remove( function_tenhou.hai_convert_136_to_str(hai_arr[i])) #副露リストへの追加 #先頭が赤ドラ if hai_arr[0] == 16 or hai_arr[0] == 52 or hai_arr[0] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[1]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #真ん中が赤ドラ elif hai_arr[1] == 16 or hai_arr[1] == 52 or hai_arr[1] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[2]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #最後が赤ドラ elif hai_arr[2] == 16 or hai_arr[2] == 52 or hai_arr[2] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[0]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #赤ドラなし else: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[0]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(False)
def ankan_add(self, taku, hai_arr): for i in range(4): self.tehai_136.remove(hai_arr[0] + i) self.tehai.remove( function_tenhou.hai_convert_136_to_str(hai_arr[0] + i)) ankan_index = function.hai_convert( function_tenhou.hai_convert_136_to_str(hai_arr[1])) self.ankan_list.append(ankan_index)
def daiminkan_add(self, taku, hai_arr, last_dahai, teban): last_hai_str = function_tenhou.hai_convert_136_to_str(last_dahai) last_hai_index = function.hai_convert( function.akadora_hai_convert(last_hai_str)) #手牌から削除 for i in range(3): if hai_arr[i] in self.tehai_136: self.tehai_136.remove(hai_arr[i]) self.tehai.remove( function_tenhou.hai_convert_136_to_str(hai_arr[i])) #副露リストに追加 self.fuurohai.append([3, last_hai_index, teban]) if last_hai_index % 10 == 5 and last_hai_index < 30: self.fuuro_akadora_list.append(True) else: self.fuuro_akadora_list.append(False)
def kakan_add(self, taku, hai_arr): #元からソートされているはず #カカンした牌の種類(hai_arr[1]としているので赤の可能性なし) kakan_index = function.hai_convert( function_tenhou.hai_convert_136_to_str(hai_arr[1])) #実際に加えられた牌のID(赤の可能性あり) temp_arr = hai_arr kakan_hai_id = 6 + temp_arr[0] - ( temp_arr[0] % 4) * 2 - temp_arr[1] % 4 - temp_arr[2] % 4 kakan_hai_str = function_tenhou.hai_convert_136_to_str(kakan_hai_id) #remove self.tehai.remove(kakan_hai_str) self.tehai_136.remove(kakan_hai_id) #副露リスト更新 for i in range(len(self.fuurohai)): if self.fuurohai[i][1] == kakan_index and self.fuurohai[i][0] == 2: self.fuurohai[i][0] = 3 #kakan_indexが5,15,25なら赤ドラあり if kakan_index % 10 == 5 and kakan_index < 30: self.fuuro_akadora_list[i] = True
def chii_add(self, taku, hai_arr, last_dahai): last_hai = function_tenhou.hai_convert_136_to_str(last_dahai) #tehaiとtehai_136の操作。tehai_136の中にhai_arrのIDがあれば削除 #print(hai_arr) #print(self.tehai_136) for i in range(3): if hai_arr[i] in self.tehai_136: self.tehai_136.remove(hai_arr[i]) self.tehai.remove( function_tenhou.hai_convert_136_to_str(hai_arr[i])) #print(self.tehai_136) #print(self.tehai) #副露リストへの追加 last_hai_index = function.hai_convert( function.akadora_hai_convert(last_hai)) temp = function.akadora_convert( function_tenhou.tehai_convert_136_to_str(hai_arr)) #print(temp) temp_arr_str = temp[0] #print(temp_arr_str) akadora_flag = temp[1] #枚数 hai_arr_index = sorted(function.tehai_convert2(temp_arr_str)) #print(hai_arr_index) #print(last_hai_index) if hai_arr_index[0] == last_hai_index: self.fuurohai.append([1, last_hai_index, 2]) elif hai_arr_index[1] == last_hai_index: self.fuurohai.append([1, last_hai_index, 1]) else: #hai_arr_index[2] == last_hai_index: self.fuurohai.append([1, last_hai_index, 0]) if akadora_flag: self.fuuro_akadora_list.append(True) else: self.fuuro_akadora_list.append(False)
def init_game(janshi, taku, splitted_read_text): #卓 taku.taku_reset() kaze_honba_index = function_tenhou.find_str(splitted_read_text, "seed") taku.kaze_honba[0] = int(splitted_read_text[kaze_honba_index]) taku.kaze_honba[1] = int(splitted_read_text[kaze_honba_index + 1]) taku.kyoutaku_tensuu = int(splitted_read_text[kaze_honba_index + 2]) * 1000 taku.dorahyouji.append( function_tenhou.hai_convert_136_to_str( int(splitted_read_text[kaze_honba_index + 5]))) print() print() print(kyoku_to_str[int(splitted_read_text[kaze_honba_index])] + " " + splitted_read_text[kaze_honba_index + 1] + "本場") print("ドラ表示牌: " + taku.dorahyouji[0]) #雀士 oya = int(splitted_read_text[function_tenhou.find_str( splitted_read_text, "oya")]) ten_index = function_tenhou.find_str(splitted_read_text, "ten") for i in range(4): janshi[i].janshi_reset() janshi[i].kaze = (-oya + i) % 4 janshi[i].tensuu = int(splitted_read_text[ten_index + i]) * 100 janshi[0].tehai_136 = function_tenhou.get_haipai_136(splitted_read_text) janshi[0].tehai = function_tenhou.get_haipai_str(splitted_read_text) janshi[0].riipai() janshi[0].init_vertual_yama(taku) taku.bakyou_list = function_tenhou.create_bakyou_list(janshi, taku) print("自家: " + kaze_to_str[janshi[0].kaze] + " 点数: " + str(janshi[0].tensuu) + " 段位: " + janshi[0].dan + " レーティング: " + str(janshi[0].rating) + " ポイント: " + str(janshi[0].dan_point)) print("下家: " + kaze_to_str[janshi[1].kaze] + " 点数: " + str(janshi[1].tensuu)) print("対面: " + kaze_to_str[janshi[2].kaze] + " 点数: " + str(janshi[2].tensuu)) print("上家: " + kaze_to_str[janshi[3].kaze] + " 点数: " + str(janshi[3].tensuu)) print() print("初期手牌") print(janshi[0].tehai)
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()
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 naki(janshi, taku, splitted_read_text): who = int(splitted_read_text[3]) m = int(splitted_read_text[5]) m_decoded_list = decode_m.decode_m(m) if m_decoded_list[0] == 1: #ポン #他家がポン→バーチャル山更新 if who: janshi[who].fuurosuu += 1 print(who_to_str[who] + ": ポン") for i in range(3): if taku.last_dahai != m_decoded_list[1][i]: janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str( m_decoded_list[1][i])) #自家がポン→副露リスト更新 else: print(who_to_str[who] + ": ポン") janshi[0].pon_add(taku, m_decoded_list[1], taku.last_teban) #打牌出力 naki_dahai gui_click("Dahai", taku.naki_dahai) #print(janshi[0].fuurohai) elif m_decoded_list[0] == 2: #ダイミンカン #他家がダイミンカン→バーチャル山更新 if who: janshi[who].fuurosuu += 1 print(who_to_str[who] + ": ダイミンカン") #最初の牌 temp = m_decoded_list[1][0] - m_decoded_list[1][0] % 4 for i in range(4): if function_tenhou.hai_convert_136_to_str( temp + i) in janshi[0].vertual_yama: janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(temp + i)) #自家がダイミンカン else: print(who_to_str[who] + ": ダイミンカン") janshi[0].daiminkan_add(taku, m_decoded_list[1], taku.last_dahai, taku.last_teban) elif m_decoded_list[0] == 3: #チー #他家がチー→バーチャル山更新 if who: janshi[who].fuurosuu += 1 print(who_to_str[who] + ": チー") for i in range(3): if taku.last_dahai != m_decoded_list[1][i]: janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str( m_decoded_list[1][i])) #自家がチー→副露リスト更新 else: print(who_to_str[who] + ": チー") janshi[0].chii_add(taku, m_decoded_list[1], taku.last_dahai) #打牌出力 naki_dahai gui_click("Dahai", taku.naki_dahai) #print(janshi[0].fuurohai) elif m_decoded_list[0] == 4: #アンカン #他家が暗槓→バーチャル山更新 if who: janshi[who].fuurosuu += 1 print(who_to_str[who] + ": 暗槓") #ソートされているので赤は最初に来る(はず) janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(m_decoded_list[1][0])) janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(m_decoded_list[1][1])) janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(m_decoded_list[1][1])) janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(m_decoded_list[1][1])) #自家が暗槓→暗槓リストを更新 else: print(who_to_str[who] + ": 暗槓") janshi[0].ankan_add(taku, m_decoded_list[1]) else: #m_decoded_list[0] == 5: #加カン #他家がカカン→バーチャル山更新 if who: print(who_to_str[who] + ": 加槓") #カカンした牌IDを求める temp_arr = m_decoded_list[1] kakan_hai_id = 6 + temp_arr[0] - ( temp_arr[0] % 4) * 2 - temp_arr[1] % 4 - temp_arr[2] % 4 janshi[0].vertual_yama.remove( function_tenhou.hai_convert_136_to_str(kakan_hai_id)) #自家がカカン→副露リストを更新 else: print(who_to_str[who] + ": 加槓") janshi[0].kakan_add(taku, m_decoded_list[1])
tag_index] == "V" or splitted_read_text[ tag_index] == "W": taku.yama_nokori -= 1 #牌をツモってきたとき if splitted_read_text[1][0] == "T": ingame_func.jicha_tsumo(janshi, taku, splitted_read_text) continue #自家打牌時 if splitted_read_text[1][ 0] == "D" and splitted_read_text[1] != "DORA": hai_136 = int(splitted_read_text[1].strip("D")) print("自家 打:" + function_tenhou.hai_convert_136_to_str(hai_136)) hai_str = function_tenhou.hai_convert_136_to_str( hai_136) janshi[0].tehai.remove(hai_str) janshi[0].tehai_136.remove(hai_136) janshi[0].sutehai.append(hai_str) taku.last_dahai = hai_136 #直前の打牌。鳴きに利用する。 taku.last_teban = 0 #直前の打牌をしたプレイヤー continue #他家打牌時 #下家 if splitted_read_text[1][0] == "E": ingame_func.tacha_dahai("E", janshi, taku, splitted_read_text)
def naki(self, m, last_dahai, last_teban): naki_info = decode_m(m) self.fuurosu += 1 self.tsumoHai = -1 #自摸切りかどうかの確認。鳴きなのでリセット。 #アンカン if naki_info[0] == 4: #[1][0]だと赤ドラになる可能性があるため[1][1] self.ankan_list.append(convert_mjlog_to_index(naki_info[1][1])) for h in naki_info[1]: if h in self.tehai: self.tehai.remove(h) #チー elif naki_info[0] == 3: hai_arr = naki_info[1] #tehaiから鳴きに使った牌の削除 for h in naki_info[1]: if h in self.tehai: self.tehai.remove(h) #副露リストへの追加 last_hai_index = convert_mjlog_to_index(int(last_dahai)) temp = function.akadora_convert( function_tenhou.tehai_convert_136_to_str(hai_arr)) temp_arr_str = temp[0] akadora_flag = temp[1] hai_arr_index = sorted(function.tehai_convert2(temp_arr_str)) if hai_arr_index[0] == last_hai_index: self.fuurohai.append([1, last_hai_index, 2]) elif hai_arr_index[1] == last_hai_index: self.fuurohai.append([1, last_hai_index, 1]) else: #hai_arr_index[2] == last_hai_index: self.fuurohai.append([1, last_hai_index, 0]) if akadora_flag: self.fuuro_akadora_list.append(True) else: self.fuuro_akadora_list.append(False) #ポン elif naki_info[0] == 1: hai_arr = naki_info[1] teban = last_teban #tehaiの操作 for h in naki_info[1]: if h in self.tehai: self.tehai.remove(h) #副露リストへの追加 #先頭が赤ドラ if hai_arr[0] == 16 or hai_arr[0] == 52 or hai_arr[0] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[1]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #真ん中が赤ドラ elif hai_arr[1] == 16 or hai_arr[1] == 52 or hai_arr[1] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[2]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #最後が赤ドラ elif hai_arr[2] == 16 or hai_arr[2] == 52 or hai_arr[2] == 88: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[0]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #赤ドラなし else: hai_str = function_tenhou.hai_convert_136_to_str(hai_arr[0]) hai_index = function.hai_convert(hai_str) self.fuurohai.append([2, hai_index, teban]) self.fuuro_akadora_list.append(True) #ダイミンカン elif naki_info[0] == 2: hai_arr = naki_info[1] teban = last_teban last_hai_str = function_tenhou.hai_convert_136_to_str( int(last_dahai)) last_hai_index = function.hai_convert( function.akadora_hai_convert(last_hai_str)) #手牌から削除 for h in naki_info[1]: if h in self.tehai: self.tehai.remove(h) #副露リストに追加 self.fuurohai.append([3, last_hai_index, teban]) if last_hai_index % 10 == 5 and last_hai_index < 30: self.fuuro_akadora_list.append(True) else: self.fuuro_akadora_list.append(False) #カカン elif naki_info[0] == 5: hai_arr = naki_info[1] #元からソートされているはず #カカンした牌の種類(hai_arr[1]としているので赤の可能性なし) kakan_index = function.hai_convert( function_tenhou.hai_convert_136_to_str(hai_arr[1])) #実際に加えられた牌のID(赤の可能性あり) temp_arr = hai_arr.copy() kakan_hai_id = 6 + temp_arr[0] - ( temp_arr[0] % 4) * 2 - temp_arr[1] % 4 - temp_arr[2] % 4 #remove self.tehai.remove(kakan_hai_id) #副露リスト更新 for i in range(len(self.fuurohai)): if self.fuurohai[i][1] == kakan_index and self.fuurohai[i][ 0] == 2: self.fuurohai[i][0] = 3 #kakan_indexが5,15,25なら赤ドラあり if kakan_index % 10 == 5 and kakan_index < 30: self.fuuro_akadora_list[i] = True