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 つの目を形成しない石のことです。いくつか調べましたが、私が理解できるアルゴリズムで死石を判断する方法は見つかりませんでしたので、半自動版を作成しました:死石をクリックすると、それに関連する死石を自動的に取り除きます。通常、2〜3 回クリックすれば完了します。死石を取り除いた後、空白の点からなるブロックは一つの色の石とだけ接しているため、数子は非常に簡単になります。

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

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

効果#

効果図

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

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

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