7.5~7.7 read_kifu.py read_kifu() Argument: un fichier texte qui répertorie les chemins du fichier de partition Sortie: ("Diagramme de phase", "Déplacer", "Victoire / Perte") est calculé pour chaque phase, une phase est ajoutée à la liste comme un élément, et lorsque tout le score est lu, il est généré sous forme d'une liste. Les données pour une phase se composent des cinq éléments suivants. -piece_bb: 15 éléments -occupé: 2 éléments -pieces_in_hand: 2 éléments -move_label: 1 élément -win: 1 élément Le résultat final est [([15 éléments], [2 éléments], [2 éléments], [1 élément], [1 élément]), (même ensemble), ... est le nombre d'étapes x le nombre de jeux]
python-dlshogi\pydlshogi\read_kifu.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import shogi
import shogi.CSA
import copy
from pydlshogi.features import *
from pydlshogi.common import * ##################test
# read kifu
def read_kifu(kifu_list_file):
i = 0
positions = []
with open(kifu_list_file, 'r') as f:
for line in f.readlines():
filepath = line.rstrip('\r\n')
i += 1
print(i)
#Attribuez les données de score à la variable kifu.
#Les données de score sont un dictionnaire avec quatre clés: noms, sfen, coups et victoire.
#Ce dictionnaire est inclus dans la liste en tant qu'élément.[0]Sortez uniquement le dictionnaire avec.
kifu = shogi.CSA.Parser.parse_file(filepath)[0]
win_color = shogi.BLACK if kifu['win'] == 'b' else shogi.WHITE
board = shogi.Board()
for move in kifu['moves']:
# ■board:print(board)Vous pouvez afficher le tableau en deux dimensions avec.
# ■piece_bb: un tableau de 15 éléments. Chaque élément indique la disposition de chaque pièce. 0:Vierge, 1:Ayumu, 2:Encens ...
#carte de bit. La carte de bits est la suivante.
#Chaque élément a 81 chiffres (=C'est un affichage décimal d'un nombre binaire (c'est-à-dire une carte de bits) de 81 carrés).
#Imprimez si vous souhaitez afficher 81 chiffres binaires('{:0=81b}'.format(Valeur décimale))Peut être fait avec.
#■ occupé: un tableau de deux éléments. Chaque élément est la position de la pièce occupée par les première et seconde mains. carte de bit.
# ■pieces_in_hand: Un tableau de deux éléments. Quelle pièce est la première et la seconde pour chaque élément(=key)Combien(=value)Un type de dictionnaire qui indique si vous l'avez.
if board.turn == shogi.BLACK:
piece_bb = copy.deepcopy(board.piece_bb)
occupied = copy.deepcopy((board.occupied[shogi.BLACK], board.occupied[shogi.WHITE]))
pieces_in_hand = copy.deepcopy((board.pieces_in_hand[shogi.BLACK], board.pieces_in_hand[shogi.WHITE]))
else:
piece_bb = [bb_rotate_180(bb) for bb in board.piece_bb]
occupied = (bb_rotate_180(board.occupied[shogi.WHITE]), bb_rotate_180(board.occupied[shogi.BLACK]))
pieces_in_hand = copy.deepcopy((board.pieces_in_hand[shogi.WHITE], board.pieces_in_hand[shogi.BLACK]))
# move label
i_move = shogi.Move.from_usi(move) #Créer une instance de la classe Move avec la variable move comme argument
move_label = make_output_label(i_move, board.turn)
#■ Déplacer la classe
# from_variable carrée: valeur de la source de mouvement lorsque la surface de la planche est représentée par une valeur numérique comprise entre 0 et 80.
#Le quotient divisé par 9 est la coordonnée y et le reste est la coordonnée x. La coordonnée xy est 0 origine.
# to_variable carrée: comme ci-dessus (destination).
#
#coordonnée x
# 0 1 2 3 4 5 6 7 8
#
#0 1 2 3 4 5 6 7 8 0 coordonnées y
# 9 10 11 12 13 14 15 16 17 1
# 18 19 20 21 22 23 24 25 26 2
# 27 28 29 30 31 32 33 34 35 3
# 36 37 38 39 40 41 42 43 44 4
# 45 46 47 48 49 50 51 52 53 5
# 54 55 56 57 58 59 60 61 62 6
# 63 64 65 66 67 68 69 70 71 7
# 72 73 74 75 76 77 78 79 80 8
#
# print(board)
#
# try:
# y_from, x_from = divmod(s.from_square, 9)
# y_to, x_to = divmod(s.to_square, 9)
# print('from:',x_from, y_from)
# print('to :',x_to, y_to)
#
# move_direction = DOWN
# print('moved:', move_direction)
# except:
# pass
# result
win = 1 if win_color == board.turn else 0
#Ajout d'aspects (trois premières variables), évolue dans cet aspect et gagne / perd aux positions variables
positions.append((piece_bb, occupied, pieces_in_hand, move_label, win))
#1 aller de l'avant
board.push_usi(move)
return positions
Recommended Posts