【将棋ネタ】【Python】ただPCとの対戦を繰り返しているだけでは棋力向上は無理っぽい。アプリを作って手筋を暗記しよう。

はじめに

7月はPCとの対戦を約300局行いました。対局を繰り返すことで棋力が向上することを期待していました。しかし現実はそう甘くないようです。はっきり言って最近行き詰っています。

そこで本で学習することにしました。
さっそく1冊購入しました。「最重要手筋104」とタイトルに書かれています。どうしてこの本を選んだか?104の手筋を全部暗記してしまおうと考えたからです。
子供でも百人一首が暗記できるくらいなのだから大人が将棋の手筋104覚えることは難しくないのではないか?そう考えました。

暗記のためのアプリ作成

ただ単に何回も読み返して暗記するのは難しいと思います。そこで単語帳アプリの発展として手筋暗記アプリを作ることにしました。
touch-sp.hatenablog.com

完成したアプリはこんな感じです。

f:id:touch-sp:20210809120919p:plain:w300

ボタンは一つもありません。Enterキーを連打するだけでどんどん出題が繰り返される単純なものです。
解答表示機能はついていません。解けなかったら本を調べることになります。

Pythonスクリプト

データの作成とアプリの作成の二つが必要です。
完成したデータ(問題データ)を公開すると著作権に違反すると思うので公開できません。
局面図はShogiGUIでひとつずつ作成しました。
アプリのPythonスクリプトはこちらになります。

import pandas as pd
import random

import os
import sys
import random
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QFont, QImage, QPixmap

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.df = pd.read_csv('titles.txt', index_col=0)
        self.initUI()
        self.question = ''
        self.new_question = True
        
    def initUI(self):
        
        font = QFont()
        font.setFamily('Times')
        font.setPointSize(20)
        font.setBold(True)

        self.start_button = QPushButton('start')
        self.start_button.setFont(font)
        self.label_q = QLabel()
        self.label_q.setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.label_q.setFont(font)

        self.label_a = QLabel()
        self.label_a.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.label_a.setFont(font)

        self.label_pic = QLabel()
        self.label_pic.setAlignment(Qt.AlignmentFlag.AlignCenter)
        
        layout = QVBoxLayout()
        layout.addWidget(self.label_q, 1)
        layout.addWidget(self.label_a, 1)
        layout.addWidget(self.label_pic, 4)
        self.setLayout(layout)
        self.show()

    def keyPressEvent(self, e):
        
        if e.key() == Qt.Key.Key_Return:
            if self.new_question == True:
                self.label_a.clear()
                self.label_pic.clear()
                self.q_num = random.randint(1, len(self.df))
                self.label_q.setText(str(self.q_num))
                self.new_question = False
            else:
                self.label_a.setText(self.df.loc[self.q_num]['Title'])
                self.img = QImage(os.path.join('img', '%d.png'%self.q_num))
                self.label_pic.setPixmap(QPixmap.fromImage(self.img))
                self.new_question = True

app = QApplication(sys.argv)
ex =Window()
ex.setWindowTitle('詰みと寄せの手筋104')
ex.setGeometry(100,100,500,700)
sys.exit(app.exec())

最後に

データの作成とアプリの作成にはそれなりの時間が必要です。しかし「急がば回れ」とのことわざがあるように作り終わったあとの効率が全然違います。
目標は「8月中に104の手筋すべてを暗記する」こととしました。