スポンサーリンク

Scratchでモンテカルロ法を使ったリバーシを作ってみた【スクラッチ】

当サイトではアフィリエイト広告を利用して商品を紹介しています。

AI

今回は、自分がScratchで作った、モンテカルロ法を使ったリバーシについて解説していこうと思います。

Scratchでモンテカルロ法を使ったリバーシを作ってみた

そもそも、どんな作品なんだ?という方も多いと思うので、百聞は一件にしかず。

実際にプレイしてみてください。音が出るので音量にはご注意ください。

作品のリンク⬇️
https://scratch.mit.edu/projects/553272221/

遊び方

先手か後手を選んでクリックすると対決が始まります。ピンクのところが自分の置けるマスです。

仕組み解説

このプログラムは、相手がAIで、AIにはモンテカルロ法というものを使っています。

モンテカルロ法で有名なのは、円周率を求めたりすることだと思います。そのモンテカルロ方をリバーシで使ってみたのが今回の作品です。

仕組みとしては、コンピューターの番になると全てのおけるマスから乱数で一つだけマスを選びます。そしてそこに置き、今度はコンピューターの色とは違う色でまた乱数でおいていきます。

これをくり返し、両方の色がおけなくなるまでを計算しおわると1ステップの完了です。そしてこのステップを10回ほどやり、一番勝率が高かったものを選んで、実際におきます。

乱数なので偏りがでてしまいますが、このステップ数を増やせば増やすほど勝率は上がるので、強さを簡単に調整することができます。これが面白いポイントです。

ただ、一定の回数からあまり強くならなくなるので、単純に強さを求めるのなら、ディープラーニングなどの他の方法を使う方がいいと思いました。

プログラム解説

さて、それではアルゴリズムも軽く説明できたので実際にScratchのプログラムを解説していきます。

盤面&石を描画

これが盤面と石を描画するプログラムです。

今回は、スプライトではなく、PENで全て描写してみました。100%PENでしっかりとしたゲームを作ったのは初めてなので意外と苦戦したりしました。

メイン処理

これはメイン処理です。ゲーム全体の流れを処理しています。

マウスの座標から盤面のどの位置か計算する

マウスのx座標y座標を盤面のマスサイズで割り、綺麗に位置がもとめられるように計算するプログラムです。

ただ、x座標y座標が盤面を超えてしまったとき、盤面の位置の値が上限を超えてしまうので上限を設定しています。

勝率が一番高いものを探す

これは勝率が一番高いものを最終的に保存するプログラムです。

ランダムに石をうつ

これは意外と簡単なプログラムで、8x8の中から乱数を使ってランダムに打つ位置を決めます。

石を打つ&ひっくり返す

これは、指定した座標に石をおいて、そして石をおいた後に、全方向を探索して、置いた石と同じ色で挟まれていたら、挟まれていた石をひっくり返すプログラムです。

全方向を二重ループで動かすのですが、かなり少ないコードなのにちゃんと動くのがかなり感動しました。

打てるマスがあるかどうか調べる

これは打てるマスがあるかどうか調べるプログラムです。

アルゴリズムはめちゃくちゃ簡単で、8x8のマスを調べて、マスが打てるなら戻り値をうてるにして、そうでなければ戻り値をうてないにします。

Scratch3.0にはまだ定義に戻り値がないので、変数に戻り値の結果を入れています。

セーブ&ロード

これはセーブとロードをするプログラムです。

モンテカルロ法で、コンピューターが乱数で石を置けなくなるまでおいて行くときにはバックアップのデータを用いて計算します。

なので、本当にデータを管理している方には影響なく計算できます。

石の数を数える

これも簡単なプログラムで、二重ループで盤面に白と黒の石がそれぞれ何個ずつおいてあるか調べます。これによって勝敗がわかるようになります。

まとめ

すべてを詳しく解説することはできませんでしたが、なんとなく作品についてわかったでしょうか。

この作品が、少しでも参考になれば嬉しいです。

ぜひSNSシェアよろしくお願いします!

Scratchで拡張機能などを一切使わずにニューラルネットワ...
外部ライブラリなどを使わずにニューラルネットワークを作ってみました。P...
【凄すぎる】Scratchで作られた2D版マイクラの再現度が...
Scratchで作られた2D版のマインクラフトをご紹介します。Scra...
【勉強方法も解説】Progateの周回ダメなのは嘘です【初心...
初心者の方、Progateの周回ダメだと思ってませんか?初心者の方でも...

 

コメント

タイトルとURLをコピーしました