ニンテンドー 3DS プチコン3号 SmileBASIC 版 チェスプログラム YOS_CHESS [Chess Program] 公開

以前、ブログを書いてから一年ぐらい経ちますが、色々取り組んでいました。ニンテンドー 3DS ダウンロードソフト ‘プチコン3号’ でコンピュータと対戦できるチェスプログラムを作ってみました。

公開キー、実行画面、動画を載せておきます。

YOS_CHESS (YKChess)
チェス
コンピュータと対戦できるチェスプログラム。
公開キー W2E433R4

実行画面

動画

麗の小屋 - Phono Transceiver PetitModem -
http://rei.to/petitmodem.html

上記 PetitModem Ver. 1.2.7 の使い方を解説した PDF ファイルと Mac 上のテキストエディタ CotEditor でプチコン3号のソースをカラーリング化する定義ファイルなどをまとめた SmileBASIC.zip も公開します。

PetitModem Ver. 1.2.7 の使い方、SmileBASIC 用 CotEditor 定義ファイル
[ SmileBASIC.zip ]
http://kyoshiaki.sakura.ne.jp/osx/Sample/SmileBASIC.zip

上記 URL に含まれる PetitModem Ver. 1.2.7 の使い方を解説した PDF ファイルは、結構苦労して作成しました。良かったらぜひダウンロードして読んでみてください。

チェスプログラム YOS_CHESS.PRG は、

Chess Engine In C - YouTube
https://www.youtube.com/playlist?list=PLZ1QII7yudbc-Ky058TEaOstZHVbT-2hg
Vice (Video Instructional Chess Engine)
Sources (ソース)
http://bluefever.net/Downloads/ViceReadMe.html

上記 URL の YouTube のチェスプログラミング講座とソースを参考に作成しました。

chessprogramming - home
https://chessprogramming.wikispaces.com/
Chessprogramming wiki
https://www.chessprogramming.org/Main_Page

チェスプログラミングの用語、変数名は、上記 URL の Wiki で検索し、理解しました。

プチコン3号の変数は

整数型…変数名末尾が %
32ビット符号あり
データ型 #
倍精度実数型…変数名末尾が #
(省略可能・デフォルト)
64ビット

上記のように整数型とデータ型があります。64ビット整数型の変数が使えないので、局面を64ビットのハッシュ値で表すことができません。そのため、

three-fold repetition (同局面三反復、3レピティション)
同じ局面が3度現れるとドローを主張できる。

Threefold repetition には対応していません。

YOS_CHESS (YKChess) の強さは、Level 5 でも Xboard に一度も勝つことができませんでした。非常に弱いので、初心者向けです。

macOS Sierra バージョン 10.12 付属のチェス (バージョン 3.13) で、2手先まで考えるように設定し、3回対戦しました。YOS_CHESS (level 5) の2勝1引き分けでした。

英語が苦手なのでメッセージの英語表記には、おかしな箇所があるかもしれません。

チェスプログラムを作成してみて、以前より理解が深まったので

2005/06/15(Wed)
リバーシアルゴリズム C++&Java対応—「探索アルゴリズム」「評価関数」の設計と実装 - Seal Software
¥ 1,995
リバーシのアルゴリズム C++&Java対応―「探索アルゴリズム」「評価関数」の設計と実装 (I・O BOOKS)

リバーシのアルゴリズム C++&Java対応―「探索アルゴリズム」「評価関数」の設計と実装 (I・O BOOKS)

2005/03/08(Tue)
コンピュータ将棋のアルゴリズム—最強アルゴリズムの探求とプログラミング - 池 泰弘
¥1,995
コンピュータ将棋のアルゴリズム―最強アルゴリズムの探求とプログラミング (I・O BOOKS)

コンピュータ将棋のアルゴリズム―最強アルゴリズムの探求とプログラミング (I・O BOOKS)

以前購入した上記2冊を読み返してみようと思いました。ただし、書籍「コンピュータ将棋のアルゴリズム」は紛失してしまいました。

ところが最近、最新刊が

2016/09/07(Wed)
Java将棋のアルゴリズムアルゴリズムの強化手法を探る (I・O BOOKS)
池 泰弘
¥ 2,484

発売されていました。上記、書籍とソースを参考に理解を深めています。

最後に YOS_CHESS (YKChess) の取扱説明書 README_JA.PRG の内容を添付しておきます。

===== README_JA.PRG =====

'
' YKChess (YOS_CHESS.PRG)
' Version 1.0 Programmed by KYoshiaki
'
'【概要】
'
' YouTube のチェスプログラミング講座とソースを参考に、プチコン3号で
' コンピュータと対戦できるチェスプログラムを作ってみました。思考ルーチンは、
' 単純なアルファ・ベータ法を使用しています。非常に弱いので、チェスを始めてみたい
' 人向けです。
'
'【説明】
'
' YKChess には、3つのモード
'
' ・プレイモード
' ・プレイヤーのタイプ、レベル選択モード
' ・棋譜再生モード
'
' があります。
'
' YOS_CHESS.PRG を実行すると `プレイモード´ に入ります。
'
' New ボタンをタッチすると `プレイヤーのタイプ、レベル選択モード´、
' Play ボタンをタッチすると `プレイモード´、
' `プレイモード´ でゲームが終了するか、Resign ボタンをタッチすると
' `棋譜再生モード´ に入ります。
'
'■ プレイモード
' 駒を動かして、ゲームをプレイできます。
'
' 駒の移動は、駒をタッチして選択し、次に移動したいマス目をタッチしてください。
' Assistant ラジオボタンがオンなら、選択した駒の移動可能なマス目が緑色で
' 表示されます。
' Assistant ラジオボタンをタッチしてオフにすると、移動可能なマス目は表示
' されません。
'
'■ プレイヤーのタイプ、レベル選択モード
' New ボタンをタッチするとプレイヤーのタイプ、レベル選択モードに入ります。
'
' White(白), Black(黒) それぞれのプレイヤーの Type (タイプ)、
' Level (レベル) をポップアップメニューをタッチして選択できます。
'
' Type は、2種類あります。
'
' You: あなた
' Machine: コンピュータ
'
' Level (レベル)は 1 から 5 まで選択できます。YKChess では
' レベル 5 が最強です。
'
' コンピュータ同士の対戦を終了したい場合は、START ボタンを押して強制終了
' してください。
'
' Eval は、思考ルーチンの情報を表示します。
'
' Material:
' 駒ごとに割り当てた点数の合計で評価する関数を使用します。
'
' Table:
' 駒の点数と盤上の位置に割り当てた点数の合計で評価する関数を使用します。
'
' Depth:
' 先読み数(半手)。
' チェスの1手先読みが、Depth 2 になります。
'
' Level: 2
' Eval:
' Material
' Depth: 2
'
' この場合、思考ルーチンは、1手先読みのアルファ・ベータ法で、評価関数は
' Material 使用しています。
'
'■ 棋譜再生モード。
'
' |<
' 棋譜の最初に移動。
' <
' 半手戻す。
' >
' 半手進める。
' >|
' 棋譜の最後に移動。
'
'【ボタンの解説】
'
' New
' 新規のゲーム
'
' Play
' ゲームの開始
'
' Undo
' 1手戻す
'
' Flip
' チェス盤の反転
'
' Resign
' リザイン
' 投了
'
' Quit
' プログラムの終了。
'
' 【情報】
' Ply: half-move
' 半手数。
' 白と黒のどちらか半手動くと Ply が 1 増えます。
'
' チェスの1手は、Ply では 2 になります。チェスでは、白、黒、両方動いて
' 1手になります。
'
'
' DIALOG
'
RESTORE @DIALOG
READ NUM
FOR I=0 TO NUM-1
READ TEMP$
TEXT$=TEXT$+TEMP$+CHR$(13)
NEXT
DIALOG TEXT$,0
@DIALOG
DATA 3
DATA "取扱説明書は README_JA.PRG に記載されています。"
DATA "作業用プロジェクトを YOS_CHESS に変更し、'SmileBASICでプログラムを作る' から"
DATA "ファイル README_JA.PRG を読み込んで閲覧してください。"

Kindle 版書籍 Cocoa Design Patterns (Developer's Library) 購入。

今月はあまり書くことがないので、本の紹介です。
iOS、OS X のプログラミングを続けていると、Appleフレームワークの出来の良さに舌を巻きます。デザインパターンについては、良書だと評判の

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

を随分前に読んだきりです。それで、もう少し理解を深めようと

Cocoa Design Patterns (Developer's Library)

Cocoa Design Patterns (Developer’s Library)

を購入してみました。読んでいる途中ですが

Memory Zones
Category
Informal Procotols
Fast Enumrators
Accessors
Copying
Notifications

など、より深く理解することが出来ました。ただし、Objective-C 2.0 には対応していますが、新たに追加された Objective-C value literal syntax

NSNumber *longNumber = @42l;
NSDictionary *dictionary = @{
@"anObject" : someObject,
@"helloString" : @"Hello, World!",
@"magicNumber" : @42,
@"aValue" : someValue
};
NSArray *someArray = @[firstObject, secondObject, thirdObject];

などには対応していません。情報としては少し古いかもしれませんが、十分に通用する内容です。

はてなポイントが余っていたので、アマゾンギフト券に交換し、次の Kindle版書籍とコミックを買ってみました。

進撃の巨人(1): 1 (少年マガジンKC)

進撃の巨人(1): 1 (少年マガジンKC)

進撃の巨人(2): 2 (講談社コミックス)

進撃の巨人(2): 2 (講談社コミックス)

テルマエ・ロマエI: 1 (ビームコミックス)

テルマエ・ロマエI: 1 (ビームコミックス)

テルマエ・ロマエII: 2 (ビームコミックス)

テルマエ・ロマエII: 2 (ビームコミックス)

Kindle 版書籍やコミックは手軽に買えるので、 注意しないといけませんね!
いくらお金があっても足りません!

Apple Education Event、Land of Lisp

随分遅くなりましたが、本年も宜しくお願いします。

Apple Education Event, January 2012
http://events.apple.com.edgesuite.net/1201oihbafvpihboijhpihbasdouhbasv/event/index.html
Apple Keynotes - iTunes Podcast
http://itunes.apple.com/jp/podcast/apple-keynotes/id275834665

1月19日、Apple はニューヨークで開催したメディアイベントで、「iBook 2」、電子書籍作成アプリ「Books Author」、iOS向けに「iTunes U」のアプリを発表しました。

早速、iBooks Author をダウンロードし、試してみました。ウィジェットを追加できる仕組みは、可能性を感じますね。OS 純正の Calculator.wdgt を追加して遊んでみました。ウィジェクト作成ソフト Dashcode も随分進歩しています。すっかり、使い方を忘れてしまったので、

ヘルプ/Dashcode User Guide
▼ デュアルプロダクトWebアプリケーションチュートリアル
▼ プロジェクトを開始する
▼ ウィジェットまたはWebアプリケーションのユーザインターフェイスをデザインする
▼ テストする/共有する
Webアプリケーションを動作形式で保存する

を拾い読みし、基本操作を学びました。

Dashcode で Dashboard のテンプレートから、カスタムを選びます。プロジェクトウインドウ左側 (ナビゲータ) の ‘実行と共有’ をクリックします。ウインドウ右下に ‘ディスクに保存…’ ボタンが現れるのでクリックすると、拡張子が wdgt 形式のファイルで保存されます。iBooks Author では、中央の ‘ウィジェット‘ ボタンから ‘HTML’ を選択します。現れたエリアにウィジェットをドラッグ・ドロップすれば追加できます。プレビューするには、iPad が必要になります。拙作 YKMinesweeper.wdgt を作り直してみたいですね!

Land of LISP: Learn to Program in Lisp, One Game at a Time!

Land of LISP: Learn to Program in Lisp, One Game at a Time!

以前にも書いたように、Land of Lisp [ asin:1593272812 ] を読書中です。サンプル orc-battle.lispsbcl で実行してみました。sbcl については Homebrew

brew update
brew install sbcl

を利用してインストールしました。

sbcl を起動し、 load 関数で orc-battle.lisp を読み込み、(orc-battle) で実行しました。

~ $ sbcl
This is SBCL 1.0.53, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (load "~/lisp/Land of Lisp/orc-battle.lisp")
T
* (orc-battle)
You are a valiant knight with a health of 30, an agility of 30, and a strength of 30
Your foes:
1. (Health=3) A fierce BRIGAND
2. (Health=6) A malicious hydra with 6 heads.
3. (Health=2) A fierce BRIGAND
4. (Health=6) A slime mold with a sliminess of 4
5. (Health=6) A wicked orc with a level 6 club
6. (Health=7) A fierce BRIGAND
7. (Health=1) A wicked orc with a level 8 club
8. (Health=8) A fierce BRIGAND
9. (Health=10) A malicious hydra with 10 heads.
10. (Health=4) A slime mold with a sliminess of 5
11. (Health=7) A malicious hydra with 7 heads.
12. (Health=4) A fierce BRIGAND

キーの入力状態になるのですが、入力状態の前に出力した文字列が表示されません。sbcl の場合 (read) を呼ぶ前に (force-output) を呼ぶ必要があります。

orc-battle.lisp の場合

(defun player-attack ()
(fresh-line)
(princ "Attack style: [s]tab [d]ouble swing [r]oundhouse:")
(force-output)
(case (read)
(s (monster-hit (pick-monster)
(+ 2 (randval (ash *player-strength* -1)))))
(defun pick-monster ()
(fresh-line)
(princ "Monster #:")
(force-output)
(let ((x (read)))

上記のように (read) の前に、(force-output) を2箇所、追加しました。これで正しく動作しました。

* (orc-battle)
You are a valiant knight with a health of 30, an agility of 30, and a strength of 30
Your foes:
1. (Health=3) A fierce BRIGAND
2. (Health=6) A malicious hydra with 6 heads.
3. (Health=2) A fierce BRIGAND
4. (Health=6) A slime mold with a sliminess of 4
5. (Health=6) A wicked orc with a level 6 club
6. (Health=7) A fierce BRIGAND
7. (Health=1) A wicked orc with a level 8 club
8. (Health=8) A fierce BRIGAND
9. (Health=10) A malicious hydra with 10 heads.
10. (Health=4) A slime mold with a sliminess of 5
11. (Health=7) A malicious hydra with 7 heads.
12. (Health=4) A fierce BRIGAND
Attack style: [s]tab [d]ouble swing [r]oundhouse:

終了するには、(sb-ext:quit) を実行します。

 You have been killed. Game Over.
NIL
* (sb-ext:quit)
~ $ 

sbcl ではなく clisp も試したくなったのですが、Homebrew でインストールするとビルドに失敗します。llvm-gcc ではなく gcc が必要なようです。
自分で gcc をビルドするのは大変なので

kennethreitz/osx-gcc-installer - GitHub
https://github.com/kennethreitz/osx-gcc-installer

の osx-gcc-installer を利用しました。Xcode をインストールした状態で osx-gcc-installer をインストールしたので、問題があるかもしれません。

Homebrew で gcc を使ってビルドするには、環境変数 CC を設定するのではなく

brew install clisp --use-gcc

オプション –use-gcc を使うと良いようです。

clisp を使って orc-battle.lisp を実行するには、sbcl のような (force-output) を追加する必要はありません。

~ $ clisp
i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
I I I I I I I      8     8   8           8     8     o  8    8
I  \ `+' /  I      8         8           8     8        8    8
\  `-+-'  /       8         8           8      ooooo   8oooo
`-__|__-'        8         8           8           8  8
|            8     o   8           8     o     8  8
------+------       ooooo    8oooooo  ooo8ooo   ooooo   8
Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010
Type :h and hit Enter for context help.
[1]> (load "~/lisp/Land of Lisp/orc-battle.lisp")
;; Loading file /Users/yoshiaki/lisp/Land of Lisp/orc-battle.lisp ...
;; Loaded file /Users/yoshiaki/lisp/Land of Lisp/orc-battle.lisp
T
[2]> (orc-battle)
You are a valiant knight with a health of 30, an agility of 30, and a strength of 30
Your foes:
1. (Health=8) A wicked orc with a level 1 club
2. (Health=9) A malicious hydra with 9 heads.
3. (Health=1) A fierce BRIGAND
4. (Health=9) A slime mold with a sliminess of 3
5. (Health=9) A malicious hydra with 9 heads.
6. (Health=8) A wicked orc with a level 1 club
7. (Health=2) A slime mold with a sliminess of 5
8. (Health=7) A malicious hydra with 7 heads.
9. (Health=5) A fierce BRIGAND
10. (Health=2) A slime mold with a sliminess of 4
11. (Health=5) A malicious hydra with 5 heads.
12. (Health=5) A slime mold with a sliminess of 5
Attack style: [s]tab [d]ouble swing [r]oundhouse:
NIL
[3]> (exit)
Bye.
~ $ 

clisp を終了するに、(exit) を使ってください。

orc-battle.lisp は、簡単なプログラムです。それで、ゲームに勝つのもそんなに難しくないと思っていました。ところが、なかなか勝つことができません。それで、ソースを熟読して攻撃パターンや、ヘルスポイントの計算方法を理解し、ようやく勝てるようになりました。単純なゲームですが、熱中してしまいました。絶妙なバランスです。ソースの熟読には、別の理由もあったのですが!

orc-battle.lisp で勝利した動画を添付しておきます。後、おまけとして、最近取り組んでいたプログラムの動作模様も公開します。( 04 分 01 秒から始まります。)

現在、Kindle 版 Land of Lisp

IV. Lisp is Science
15. Dice of Doom, a Game Written in the Function Style
Implementing Dice of Doom, Version 1
P312
Location 7551
Calculating Passing Moves

まで読んだのですが、Common Lisp を理解するには、最良の本ですね!Practical Common Lisp も持っているのですが、Land of Lisp の方が基本的な知識を得ることができます。Practical Common Lisp では、途中で投げ出してしまったので、気付かなかったのですが、Common Lisp では、構造体も使えるのですね!

P163
Location 4314
Common Lisp Structures
> (defstruct person
name
age
waist-size
favorite-color)
PERSON
> (defparameter *bob* (make-person :name "Bob"
:age 35
:waist-size 32
:favorite-color "blue"))
> *bob*
#S(PERSON :NAME "Bob" :AGE 35 :WAIST-SIZE 32 :FAVORITE-COLOR "blue")
> (person-age *bob* )
35
> (setf (person-age *bob* ) 36)
> (person-age *bob* )
36