
2025/12/31 0:03
「チェスで自らに挑み、苦しむ」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改訂サマリー:
著者は自分よりも強くなることができるコンパクトで携帯可能なチェスエンジンを構築し、https://jaredkrinke.github.io/cm-chessboard/ でオンライン公開しました。外部ライブラリを一切使用せずに600行未満のCコードで書かれたコアは固定サイズバッファ(動的割り当てなし)を利用し、WebAssemblyにコンパイルすると6 KB以下になります。このエンジンはPentium PC、Raspberry Pi B、DOS、Amigaなどの古いハードウェア上で動作します。開発はAsus EeeBook X205T のクラシックターミナルツールから始まり、UI は ASCII から XBoard/CECP、そして最終的に Web フロントエンドへと進化しました。ブラウザと WebAssembly 間の通信では、手を9ビット整数(ランク3ビット + ファイル3ビット + プロンーション3ビット)として符号化します。当初はテストがなく、後にフレームワークでエンパッサンとキャスリングロジックのバグが検出されました。デモではチェックメイトやステールメイトも通知しません。著者はチェスが苦手だと認めつつ、自身のプレイを向上させた結果、AI を二度打ち負かしました。今後の作業は未定で、このプロジェクトは主に「創造的なバッテリーを再充電するため」のクリエイティブな離れ道でした。バグ報告や提案は著者へメールで送ってください。
本文
2025年12月29日
私に勝てるチェスAIを作るのは、ずっとバケットリストに載っていたことです—信じられないかもしれませんが。
ネタバレ: 私はチェスがひどく、だから「自分」を倒すAIを作るのはそれほど難しくありませんでした。
ブラウザ上でAIと対戦するには以下からどうぞ:
https://jaredkrinke.github.io/cm-chessboard/
予期せぬ注目を受けた後の修正
- デモは現在、チェックメイト/スコアルムを告知しません ― まあ、ほぼ使える製品と言えます。
- 少なくとも一つはバグがあるようです。もし他に見つかったらメールで教えてください(あるいは提案でも構いません)。
- 私はやっとチェスの腕を上げて、AIに連続で勝利しました(少なくともひとつ大きなミスがあっても)。
- 今後さらに改善するかどうかは未定です――AIを改良するか、自分自身のプレイを向上させるか。今回は「創造的エネルギーを充電」するための楽しいサイドプロジェクトに過ぎません。
動機
静的サイトジェネレーターと同様、私が書く新しいチェスエンジンを求めている人はいません。主な動機は次の通りです:
- 開発環境を試す
- 可能な限りシンプルに保つ
- 結果を古い遅いコンピュータへ移植するかもしれない
できるだけ準備を少なくし、コードを書き始めました!
開発環境
常時オンのインターネットがない昔の頃に懐かしさを覚えつつ、絶え間ない誘惑とバグから解放されたい。私はAsus EeeBook X205T netbook を復活させ、90年代末期のツール群――GNU Screen, Vim, entr, w3m のターミナルモードを選びました。小さくて軽い netbook でコンソールに入力するのは最高の「居心地の良いコーディング」体験です。
シンプルさを保つ
シンプルさと古いコンピュータへの移植性を重視し、C を使ってできるだけ依存関係を削減しました。
- コアチェスエンジン+AI(フロントエンド除く)は完全に依存なしです。
- 固定メモリ使用;動的割り当てはありません。
- エンジン全体 < 600 行、AI < 150 行。
- WebAssembly にコンパイル:総サイズ 6 KB 未満。
Pentium のノートPCや Raspberry Pi B、さらに DOS や Amiga でも動くことを期待しました!
完璧に行ったわけではありません。プロジェクトを急いでテストは必須になるまで先送りし、最終的にはエンパッサン・キャスリングなどの難しい移動コードをリファクタリングせざるを得ませんでした。途中でテストフレームワークをゼロから構築し、元実装に複数のバグがあることが判明しました。子どもたちよ、テストを書くことをスキップするな!
統合
最初はターミナルで ASCII 文字を使った UI を試したものの、正方形でない VGA フォントではピースの動きをイメージしにくかったです(ANSI エスケープコードで白いマスを反転させる実験も行いましたが、最終的には機能は放棄しました)。
グラフィカルインターフェイスを一から作らずに済むよう、次のツールと統合しました:
- XBoard(CECP/「XBoard プロトコル」)
- Web ブラウザ、cm‑chessboard と WebAssembly を使用
XBoard
XBoard は行ベースのテキストプロトコルを使います。ライブで実験するには netcat を利用し、まず
feature sigint=0 done=1 を送信してください(そうしないと XBoard が SIGINT を送り、netcat が終了してしまいます)。私は標準的なチェス記法を学んだことがないので、XBoard の一貫した構文 (
a7a8q など) は完璧でした。クライアントは主にプレイヤーの手(例:e2e4)を受け取り、AI の手(例:e7e5)で応答します。全体は C で100 行未満です。
ブラウザ
ブラウザ統合には WebAssembly が必要でした。移動情報を整数にエンコードし(3 ビットでランク、3 ビットでファイル、3 ビットでプロモーション)、複雑な文字列の marshalling を回避しました。
私はモバイルフレンドリーな HTML+JavaScript のチェスボード (
cm-chessboard) を見つけましたが、特殊なビルドシステムや NPM は不要でした。単一ファイルのボードを期待していましたが、存在しませんでした。
私に勝てるか?
はい――AI と対戦すると毎回致命的ミスを犯し、クイーンまたはルークを失います。最初に有利になると、次第に馬鹿げたブラインドサートが増えて、続ける価値がなくなります。
まだ私のプログラムが世界で一番弱いチェスプレイヤー以外の誰かを倒せるかは分かりません。
まとめ: 使命達成――少なくとも私がひどいチェスプレイヤーでいる限りです!
このプロジェクト全体は十分に楽しく、プログラミングを練習したい人や新しい言語(またはパラダイム)を試したい人にはおすすめです。