読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

急に将棋のアルゴリズムに興味湧いたからPythonでやってみた その1

Python

駒の動かし方くらいしか知らないけど、急に将棋のアルゴリズムに興味湧いたのでPythonでやってみることにした。

ググったら「うさぴょん 〜将棋を革命する力を〜」将棋プログラムの作り方という丁度良いサイトがあったから、これで勉強してみる。
元が初めて触れるC++なのでC言語入門(Cも知らないからC++入門ではなく)を見ながらやってみた。

# #!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

##将棋プログラムの基礎
#駒と局面の内部表現を決める(とりあえず)
OUT_OF_BOARD = 64
EMPTY = 0
FU = 1
KY = 2
KE = 3
GI = 4
KI = 5
KA = 6
HI = 7
OU = 8
PROMOTED = 8
TO = PROMOTED + FU
NY = PROMOTED + KY
NK = PROMOTED + KE
NG = PROMOTED + GI
UM = PROMOTED + KA
RY = PROMOTED + HI
ENEMY = 16
EFU = ENEMY + FU
EKY = ENEMY + KY
EKE = ENEMY + KE
EGI = ENEMY + GI
EKI = ENEMY + KI
EKA = ENEMY + KA
EHI = ENEMY + HI
EOU = ENEMY + OU
ETO = ENEMY + TO
ENY = ENEMY + NY
ENK = ENEMY + NK
ENG = ENEMY + NG
EUM = ENEMY + UM
ERY = ENEMY + RY

komastr = [" ・","△歩","△香","△桂","△銀","△金","△角","△飛","△玉",
           "△と","△杏","△圭","△全","△金","△馬","△竜",
           " ・","▼歩","▼香","▼桂","▼銀","▼金","▼角","▼飛","▼王",
           "▼と","▼杏","▼圭","▼全","▼金","▼馬","▼竜"]

def is_enemy_retn(koma):
    return koma + ENEMY
def is_self_retn(koma):
    return FU <= koma and koma <= RY

def is_enemy(sengo, koma):
    if sengo == 0:
        return is_enemy_retn(koma)
    return is_self_retn(koma)
def is_self(sengo, koma):
    if sengo == 0:
        return is_self_retn(koma)
    return is_enemy_retn(koma)

hand = [[0 for j in range(HI + 1)] for i in range(2)]
#board = [[0 for j in range(11)] for i in range(11)]
board = [[EKY,EKE,EGI,EKI,EOU,EKI,EGI,EKE,EKY],
               [EMPTY,EHI,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EKA,EMPTY],
               [EFU,EFU,EFU,EFU,EFU,EFU,EFU,EFU,EFU],
               [EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY],
               [EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY],
               [EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY],
               [FU,FU,FU,FU,FU,FU,FU,FU,FU],
               [EMPTY,KA,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,HI,EMPTY],
               [KY,KE,GI,KI,OU,KI,GI,KE,KY]]

class KYOKUMEN():
    display_li_str = []

    display_li_str.append("先手 持ち駒 \n")
    for koma in range(FU, HI + 1):
        if hand[0][koma] == 1:
            display_li_str.append("%s " % komastr[koma])
        elif hand[0][koma] > 1:
            display_li_str.append("%s%d " % (komastr[koma], hand[1][koma]))
    display_li_str.append("   9 8 7 6 5 4 3 2 1 \n")
    display_li_str.append(" +−−−−−−−−−−−−−−−−−−+\n")
    for dan in range(0, 9):
        display_li_str.append("%s|" % [
                "一","二","三","四","五","六","七","八","九"][dan])
        for suji in range(8,-1,-1):
            display_li_str.append("%s" % komastr[board[dan][suji]])
        display_li_str.append("|\n")
    display_li_str.append(" +−−−−−−−−−−−−−−−−−−+\n")
    display_li_str.append("後手 持ち駒 \n")
    for koma in range(FU, HI + 1):
        if hand[1][koma] == 1:
            display_li_str.append("%s " % komastr[koma])
        elif hand[1][koma] > 1:
            display_li_str.append("%s%d " % (komastr[koma], hand[1][koma]))
    
    print "".join(display_li_str)

実行してみる

先手 持ち駒 
   9 8 7 6 5 4 3 2 1 
 +−−−−−−−−−−−−−−−−−−+
一|▼香▼桂▼銀▼金▼王▼金▼銀▼桂▼香|
二| ・▼角 ・ ・ ・ ・ ・▼飛 ・|
三|▼歩▼歩▼歩▼歩▼歩▼歩▼歩▼歩▼歩|
四| ・ ・ ・ ・ ・ ・ ・ ・ ・|
五| ・ ・ ・ ・ ・ ・ ・ ・ ・|
六| ・ ・ ・ ・ ・ ・ ・ ・ ・|
七|△歩△歩△歩△歩△歩△歩△歩△歩△歩|
八| ・△飛 ・ ・ ・ ・ ・△角 ・|
九|△香△桂△銀△金△玉△金△銀△桂△香|
 +−−−−−−−−−−−−−−−−−−+
後手 持ち駒 

とりあえずここまで

少し訂正