コード例 #1
0
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
コード例 #2
0
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]
コード例 #3
0
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
コード例 #4
0
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_val = 0
    #mean_list = [0]*len(tehai)
    #hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table)
    #print(hai_list)

    #print(hai_list)
    if init_shanten_suu >= 3:
        itr = 15
    else:
        itr = 25

    for j in range(itr):
        count = 1.
        temp_janshi = copy.deepcopy(janshi)
        if len(temp_janshi.fuurohai) == 0:
            temp_janshi.riichi = 1
        temp_yama = yama.copy()
        sum_val += yuukouhai_explore(temp_yama, init_shanten_suu, count,
                                     hash_table, temp_janshi, taku)
    sum_val /= float(itr)
    return sum_val
コード例 #5
0
def jm_convert(tehai_exc_fuuro, fuurohai, ankan):

    #手牌を面子と雀頭に分解し、フウロしている面子とともに手役計算用表示に変換したリストにする。
    #出力は可能なすべての分解パターンのリスト。
    #ひとつの分解パターン[n,[[i1,j1,k1],[i2,j2,k2],[i3,j2,k2],[i3,j3,k3]]]
    #(雀頭):n (n=牌のインデックス)
    #(面子):[i,j,k]
    # i=0(暗) ,1(明)
    # j=0(順子),1(刻子),2(槓子)
    # k=(順子なら)先頭の牌のインデックス,(刻子なら)その牌のインデックス
    tehai = function.tehai_convert(tehai_exc_fuuro)
    fuurosu = len(fuurohai) + len(ankan)

    rets = decomp_tehai(tehai, fuurosu)
    for ret in rets:
        if len(fuurohai) >= 1:
            for f in fuurohai:
                if f[0] == 1:
                    ret[1].append([1, 0, f[1] - 2 + f[2]])
                elif f[0] == 2:
                    ret[1].append([1, 1, f[1]])
                elif f[0] == 3:
                    ret[1].append([1, 2, f[1]])
        if len(ankan) >= 1:
            for a in ankan:
                ret[1].append([0, 2, a])

    return rets
コード例 #6
0
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
コード例 #7
0
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]
コード例 #8
0
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]
コード例 #9
0
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
コード例 #10
0
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)
コード例 #11
0
def mentsu_count(janshi):
    global mentsu_suu
    global maximum_mentsu_suu
    mentsu_suu = len(janshi.fuurohai)

    temp_tehai = function.tehai_convert(janshi.tehai)

    for j in range(31,38):
        if temp_tehai[j] >= 3:
            mentsu_suu += 1
    
    mentsu_suu_copy = mentsu_suu
    maximum_mentsu_suu = mentsu_suu
    
    for i in range(1, 30):
        mentsu_suu = mentsu_suu_copy
        mentsu_cut(temp_tehai, i)
    
    return maximum_mentsu_suu
コード例 #12
0
def tehai_fuuro_mix_convert(tehai_str, fuurohai, ankan):

    #手牌と副露牌を混ぜて[0,0,1,2,0,...]形式にする

    mix = function.tehai_convert(tehai_str)
    for f in fuurohai:
        if f[0] == 1:
            mix[f[1] - 2 + f[2]] += 1
            mix[f[1] - 1 + f[2]] += 1
            mix[f[1] + f[2]] += 1
        elif f[0] == 2:
            mix[f[1]] += 3
        elif f[0] == 3:
            mix[f[1]] += 4
    if len(ankan) >= 1:
        for a in ankan:
            mix[a] += 4

    return mix
コード例 #13
0
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
コード例 #14
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]
コード例 #15
0
def shanten_check(janshi, hash_table):
    tehai = function.tehai_convert(function.akadora_convert(janshi.tehai)[0])
    fuurosu = len(janshi.fuurohai) + len(janshi.ankan_list)

    #国士無双形
    Sh_kokushi = 13  # ここから1、9、字牌の数を引いていく
    kokushi_l = [1, 9, 11, 19, 21, 29, 31, 32, 33, 34, 35, 36, 37]
    kokushi_toitsu = 0
    for i in kokushi_l:
        if tehai[i] >= 1:
            Sh_kokushi -= 1
        if kokushi_toitsu == 0 and tehai[i] >= 2:  #1,9、字牌の対子があれば1つだけシャンテン数が下がる
            kokushi_toitsu = 1
    Sh_kokushi -= kokushi_toitsu

    #七対子形
    Sh_chiitoi = 6  #ここから対子の数だけ引く
    haisyu = 0  #牌の種類
    for i in range(0, 38):
        if tehai[i] >= 1:
            haisyu += 1
            if tehai[i] >= 2:
                Sh_chiitoi -= 1
    if haisyu < 7:
        Sh_chiitoi += 7 - haisyu

    #4面子1雀頭形
    #tehaiを色ごとにハッシュ化
    manzu_hash = 0  #萬子部分のハッシュ値
    for i in range(1, 10):
        manzu_hash = manzu_hash * 5 + tehai[i]
    pinzu_hash = 0  #筒子部分のハッシュ値
    for i in range(11, 20):
        pinzu_hash = pinzu_hash * 5 + tehai[i]
    souzu_hash = 0  #索子部分のハッシュ値
    for i in range(21, 30):
        souzu_hash = souzu_hash * 5 + tehai[i]
    zihai_hash = 0  #字牌部分のハッシュ値
    for i in range(31, 38):
        zihai_hash = zihai_hash * 5 + tehai[i]

    #各ハッシュ値をキーにハッシュテーブルにある部分置換数t,uを取得
    t_manzu = []  #萬子部分の部分置換数tの配列
    u_manzu = []  #萬子部分の部分置換数uの配列
    for i in range(0, 5):
        t_manzu.append(int(hash_table[0][manzu_hash].split()[i]))
    for i in range(5, 10):
        u_manzu.append(int(hash_table[0][manzu_hash].split()[i]))
    t_pinzu = []  #筒子部分の部分置換数tの配列
    u_pinzu = []  #筒子部分の部分置換数uの配列
    for i in range(0, 5):
        t_pinzu.append(int(hash_table[0][pinzu_hash].split()[i]))
    for i in range(5, 10):
        u_pinzu.append(int(hash_table[0][pinzu_hash].split()[i]))
    t_souzu = []  #索子部分の部分置換数tの配列
    u_souzu = []  #索子部分の部分置換数uの配列
    for i in range(0, 5):
        t_souzu.append(int(hash_table[0][souzu_hash].split()[i]))
    for i in range(5, 10):
        u_souzu.append(int(hash_table[0][souzu_hash].split()[i]))
    t_zihai = []  #字牌部分の部分置換数tの配列
    u_zihai = []  #字牌部分の部分置換数uの配列
    for i in range(0, 5):
        t_zihai.append(int(hash_table[1][zihai_hash].split()[i]))
    for i in range(5, 10):
        u_zihai.append(int(hash_table[1][zihai_hash].split()[i]))

    t = [t_manzu, t_pinzu, t_souzu, t_zihai]
    u = [u_manzu, u_pinzu, u_souzu, u_zihai]

    #計算部分
    x = [[0 for m in range(0, 5)] for n in range(0, 4)]
    y = [[0 for m in range(0, 5)] for n in range(0, 4)]
    for m in range(0, 5):
        x[0][m] = t[0][m]
        y[0][m] = u[0][m]
    for n in range(1, 4):
        for m in range(0, 5):
            x_temp = 15
            y_temp = 15
            for l in range(0, m + 1):
                x_temp = min(x_temp, x[n - 1][l] + t[n][m - l])
                y_temp = min(
                    y_temp,
                    min(y[n - 1][l] + t[n][m - l], x[n - 1][l] + u[n][m - l]))
            x[n][m] = x_temp
            y[n][m] = y_temp
    Th_temp = 15
    for l in range(0, 5 - fuurosu):
        Th_temp = min(
            Th_temp,
            min(x[2][l] + u[3][(4 - fuurosu) - l],
                y[2][l] + t[3][(4 - fuurosu) - l]))
    Sh_normal = Th_temp - 1

    #最終的なシャンテン数
    Shanten_su = min(Sh_normal, Sh_kokushi, Sh_chiitoi)
    return Shanten_su
コード例 #16
0
def create_danger_degree_list(janshi, taku, bakyou_list):
    danger_degree_list = [0] * 38
    danger_degree_list_return = [1.0] * 38
    #オーラスで最下位ならぜんぶ1.0
    if bakyou_list[0] == 4:
        return danger_degree_list_return

    janshi_list = copy.deepcopy(janshi)
    janshi_p = janshi_list[0]
    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4)

    vertual_yama = janshi_p.vertual_yama
    vertual_yama_index = function.tehai_convert(vertual_yama)

    for i in range(1, 4):
        #とりあえず立直者だけ警戒
        if janshi_list[i].riichi:
            tenpai_prob = 1.0
        elif janshi_list[i].fuurosuu != 0:
            tenpai_prob = janshi_list[i].fuurosuu * 0.09 * math.exp(
                ((17 - nokori_tsumo_kaisuu) / 17 - 1) * math.sqrt(5))
        else:
            continue

        #max_pointの設定
        genbutsu_list = function.akadora_convert(
            janshi_list[i].sutehai)[0] + function.akadora_convert(
                janshi_list[i].temp_genbutsu)[0]

        #手出しリスト作成
        tedashi_list = []
        for j in range(len(janshi_list[i].sutehai)):
            if janshi_list[i].tedashi_flag:
                tedashi_list.append(janshi_list[i].sutehai[j])

        ############メイン#########################
        temp_list = list(range(len(danger_degree_list)))
        temp_list.remove(0)
        temp_list.remove(10)
        temp_list.remove(20)
        temp_list.remove(30)
        for j in temp_list:
            hai_index = j
            #現物ならcontinue
            temp_hai_str = function.akadora_hai_convert(j)
            if temp_hai_str in genbutsu_list:
                continue

            #字牌
            if hai_index > 30:
                if vertual_yama_index[hai_index] == 0:
                    continue
                elif vertual_yama_index[hai_index] == 1:
                    continue
                elif vertual_yama_index[hai_index] == 2:
                    danger_degree_list[j] += 0.05
                    continue
                elif vertual_yama_index[hai_index] == 3:
                    danger_degree_list[j] += 0.2
                    continue

            #筋牌ならばcontinue
            if suji_hantei(genbutsu_list, hai_index):
                continue

            #序盤に切れた数牌の外側ならばcontinue
            sutehai_len = len(janshi_list[i].sutehai)
            if sutehai_len > 6:
                sotohai_list = sotohai_find(janshi_list[i].sutehai,
                                            min(int(sutehai_len / 3), 4))
                if hai_index in sotohai_list:
                    continue

            #カベの外側continue
            if kabe_eval(vertual_yama_index, hai_index) != 0:
                continue

            #補正
            danger_degree_list[j] += tenpai_prob * 2.0

    danger_degree_list = np.array(danger_degree_list)
    danger_degree_list_return = np.array(danger_degree_list_return)

    return danger_degree_list + danger_degree_list_return
コード例 #17
0
#場風、自風
taku.kaze_honba[0] = random.randrange(8)
janshi.kaze = random.randrange(4)

#手牌、ドラ表示
input_data = [
    "5p", "5p", "7p", "8p", "8p", "8p", "9p", "3s", "3s", "3s", "4s", "7s",
    "8s", "8s"
]
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)  #重要
コード例 #18
0
def eval_defense(janshi, taku, shanten_suu, temp_max, pure_point_list,
                 bakyou_list):
    janshi_list = copy.deepcopy(janshi)
    janshi_p = janshi_list[0]
    nokori_tsumo_kaisuu = int(taku.yama_nokori / 4)

    vertual_yama = janshi_p.vertual_yama
    vertual_yama_index = function.tehai_convert(vertual_yama)
    tehai_len = len(janshi_p.tehai)
    eval_defense_point = np.zeros(tehai_len)

    for i in range(1, 4):
        #とりあえず立直者だけ警戒
        if janshi_list[i].riichi:
            tenpai_prob = 3.0
        elif janshi_list[i].fuurosuu != 0:
            tenpai_prob = janshi_list[i].fuurosuu * 0.1 * math.exp(
                ((17 - nokori_tsumo_kaisuu) / 17 - 1) * math.sqrt(5))
        else:
            continue

        #打点期待値を設定
        if janshi_list[i].kaze == 0:
            daten_expect = 10000
        else:
            daten_expect = 7000

        #max_pointの設定
        #オーラスで最下位なら防御をほとんどしない
        if bakyou_list[0] == 4:
            max_point = temp_max * 0.1
        else:
            max_point = temp_max
        #3シャンテン以上は倍
        #if shanten_suu >= 3:
        #    max_point *= 1.0
        genbutsu_list = function.akadora_convert(
            janshi_list[i].sutehai)[0] + function.akadora_convert(
                janshi_list[i].temp_genbutsu)[0]

        #危険牌枚数を計上
        temp_list = [
            "1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m", "1p", "2p",
            "3p", "4p", "5p", "6p", "7p", "8p", "9p", "1s", "2s", "3s", "4s",
            "5s", "6s", "7s", "8s", "9s", "1z", "2z", "3z", "4z", "5z", "6z",
            "7z"
        ]
        for j in range(len(genbutsu_list)):
            if genbutsu_list[j] in temp_list:
                temp_list.remove(genbutsu_list[j])
        kikenhai_maisuu = len(temp_list)

        #save_max_point = max_point

        #手出しリスト作成
        tedashi_list = []
        for j in range(len(janshi_list[i].sutehai)):
            if janshi_list[i].tedashi_flag:
                tedashi_list.append(janshi_list[i].sutehai[j])

        ############メイン#########################
        max_pure = max(pure_point_list)
        yuuido = max(
            (max_pure / (daten_expect * tenpai_prob / kikenhai_maisuu))**0.5,
            0.66)
        print(yuuido)
        max_point /= yuuido

        for j in range(tehai_len):

            hai_index = function.hai_convert(janshi_p.tehai[j])

            #現物ならmax_point与えてcontinue
            temp_hai_str = function.akadora_hai_convert(janshi_p.tehai[j])
            if temp_hai_str in genbutsu_list:
                eval_defense_point[j] += max_point
                continue

            #字牌
            if hai_index > 30:
                if vertual_yama_index[hai_index] == 0:
                    eval_defense_point[j] += max_point
                    continue
                elif vertual_yama_index[hai_index] == 1:
                    eval_defense_point[j] += max_point * 0.8
                    continue
                elif vertual_yama_index[hai_index] == 2:
                    eval_defense_point[j] += max_point * 0.5
                    continue
                elif vertual_yama_index[hai_index] == 3:
                    eval_defense_point[j] += max_point * 0.2
                    continue

            #牌の種類によって減点
            if hai_index < 30:
                if hai_index % 10 == 1 or hai_index % 10 == 9:
                    eval_defense_point[j] -= max_point * 0.1
                elif hai_index % 10 == 2 or hai_index % 10 == 2:
                    eval_defense_point[j] -= max_point * 0.2
                elif hai_index % 10 == 3 or hai_index % 10 == 4 or hai_index % 10 == 5 or hai_index % 10 == 6 or hai_index % 10 == 7:
                    eval_defense_point[j] -= max_point * 0.3
                #赤ドラ
                else:
                    eval_defense_point[j] -= max_point * 0.5

            #筋牌ならば加点。宣言牌の筋は知らん
            if suji_hantei(genbutsu_list, hai_index):
                eval_defense_point[j] += max_point * 0.5

            #最終手出しおよびその一つ前の手出しのマタギならば減点。マタギは赤ドラを考えない。
            matagi_list = matagi_henkan(hai_index)
            if len(tedashi_list) >= 1:
                if function.hai_convert(tedashi_list[-1]) in matagi_list:
                    eval_defense_point[j] -= max_point * 0.5
            if len(tedashi_list) >= 2:
                if function.hai_convert(tedashi_list[-2]) in matagi_list:
                    eval_defense_point[j] -= max_point * 0.5

            #裏筋ならば減点
            urasuji_list = urasuji_henkan(hai_index)
            sutehai_index_list = function.akadora_convert3(
                function.tehai_convert3(tedashi_list))[0]
            for k in range(len(urasuji_list)):
                if urasuji_list[k] in sutehai_index_list:
                    eval_defense_point[j] -= max_point * 0.4

            #序盤に切れた数牌の外側に対して加点
            sutehai_len = len(janshi_list[i].sutehai)
            if sutehai_len > 6:
                sotohai_list = sotohai_find(janshi_list[i].sutehai,
                                            min(int(sutehai_len / 3), 4))
                if hai_index in sotohai_list:
                    eval_defense_point[j] += max_point * 0.5

            #カベの外側に対して加点
            eval_defense_point[j] += max_point * kabe_eval(
                vertual_yama_index, hai_index)

            #max_pointに補正
            if abs(eval_defense_point[j]) > max_point:
                eval_defense_point[j] *= max_point / abs(eval_defense_point[j])

    return eval_defense_point
コード例 #19
0
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
コード例 #20
0
ファイル: ingame_func.py プロジェクト: KenyaItoh/MajangAI_pf
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
コード例 #21
0
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
コード例 #22
0
def new_yuukouhai_explore(shanten_suu, janshi, taku):
    #print("aaaaaaaaaaaaaaaaaaaaa")
    global sum_list, pure_point_sum
    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

    temp_list = [(hai_id, janshi, yama, taku, shanten_suu, pure_point_sum, itr)
                 for hai_id in hai_list]
    p = Pool(multi.cpu_count())
    p.map(test_process, range(1000))
    p.close()
    '''
    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
コード例 #23
0
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
コード例 #24
0
def create_dataset(input_file_name, target_file_name):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    input_file.close()
    target_file.close()