Yunfi

Yunfi

tg_channel
github
email

囲碁プログラムの作成プロセスを記録する

前提条件#

これは私の大学のコンピュータ導論の課題の一つであり、去年の先輩は五目並べを作成しましたが、なぜか今年は囲碁に変わりました。しかも、先生も助教も私と同じく囲碁を打つことができないようです... さらに、囲碁 AI の作成を追加問題として加点するというのは、大学 1 年生にとってはかなり無茶だと思います。

プロジェクトのリンクを貼ります...#

yy4382/StupidGo | GitHub

課題の要件#

任意のプログラミング言語を選んで、囲碁のゲームを設計し、実装してください。自動的に石を取り、勝敗を判定する機能が必要です。
追加問題:

  1. タイマー機能、タイムアウトで負けと判定する機能。
  2. 人間対 AI の機能(AI は人間と対戦せず、他の学生が作成した AI と比較します。)

課題の提出要件:最終的なコードと説明文書を提出してください。文書は設計思想とコードの使用方法を主に説明します(注意:文書は評価の重要な指標です)

私の評価:

  1. 課題では任意のプログラミング言語を選ぶことができますが、実際には先生は Python の tkinter を使用して実装することを望んでいました。また、私たちは C++ しか学んでいないので、C++ の GUI プログラムは書くのが難しいようです(私は Qt を指していますが、先学期に作成したC++ Qt プロジェクトを見ればわかると思います)。JavaScript などを書くわけにもいかないので、tkinter が唯一の選択肢です。
  2. その他の要件については、タイマー機能は簡単な機能ですので、簡単に解決できます。自動的に石を取る機能は少し複雑ですが、一晩で実装できます。一番面倒なのは勝敗の判定ですが、さまざまなルールの混乱は置いておいても、石を取るだけでも機械学習が必要です。最終的には完全に自動化することはできませんでしたが、手動で石を取り、自動的に勝敗を判定することはできました。

開発プロセス#

具体的なルールと実装方法については、ドキュメントに記載しました。GitHub リポジトリの readme にリンクがあります。

プログラム全体には 4 つのクラスがあります:

  1. GoBasicAttributes:現在の盤面の属性を記録するためのクラスで、盤面のサイズやピクセルサイズ、特定の位置にある石の種類、盤面の過去の状態などが含まれます。
  2. GoCore:最も重要なロジック処理を行うクラスで、ほとんどのコアロジックはこのクラスで処理されます。AI 対戦のための API も用意されていますが、最終的には AI は実装しませんでした。
  3. GoBoardtkinter.frameを継承したクラスで、囲碁盤を描画するために使用されます。
  4. GoControlGoCoreGoBoardを統合し、囲碁盤以外のコントロールも描画します。

元々はGoCoreGoBoardをできるだけ切り離して設計したかったのですが、後で混ざってしまい、最後はお互いに影響し合ってしまいました。でも、私は数日間しか書かなかったし、課題を提出した後はもう見ないつもりなので、保守性がどうのこうのは関係ありません(笑)

GUI を作成するときは非常に便利で、このような階層構造のものは、GitHub Copilot を開いてコメントを書くだけで自動的に書き上げてくれますが、ロジックを書くときは Copilot は純粋に時間の無駄ですので、無効にして書いた方が早いです。

最初に実装した機能は自動的に石を取る機能です。つまり、石を置いた後に自動的に呼吸点のない石を取り除く機能です。この機能には一晩かかりましたが、関連する知識は主に囲碁のルールをコンピュータが理解できるように抽象化することと、BFS です。実装の詳細は具体的な実装 - StupidGoを参照してください。

2 番目の機能は勝敗の判定です。これはプロジェクト全体で最も複雑な機能であり、数日間かかりました。ここでは中国ルールの数子法を採用しました。具体的には、死石を取り除くことと数子を行います。ここでの死石とは、その時点で呼吸点がない石ではなく、どのように石を置いても必ず 2 つの眼を形成しない石のことです。いろいろ調べましたが、私が理解できるアルゴリズムで死石を判断する方法は見つかりませんでしたので、半自動版を作成しました。死石をクリックすると、関連する死石が自動的に取り除かれます。通常、2〜3 回クリックすれば完了します。死石を取り除いた後、空白の点からなるブロックは 1 つの色の石とだけ接しているため、数子は非常に簡単になります。

その後、主にユーザビリティの改善を行い、チェスクロックを追加しましたが、秒数の計算方法が理解できなかったので、便利なパッケージを使用して簡単なタイムキープ方式にしました。

なぜプロジェクトを StupidGo と名付けたのかというと、元々は人間対 AI の機能を作りたかったのですが、AI の石の配置ロジックを書くのは非常に愚かなことだと思ったので、Stupid と名付けました。しかし、最終的には締め切りまでまだ数日あったのに、開始する気力がなくなりました。

効果#

効果の画像

最終的な効果はまあまあだと思います。インターフェースの美化は気にしませんが、私は使わないので(笑)

全体的に高度なアルゴリズムやテクニックは必要ありませんでしたが、実際の問題をコンピュータで解決するという要件には少し満たしていると思います。コンピュータ導論の授業の位置づけにはかなり合っていると思います(笑)

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。