*All archives* |  *Admin*

<<08  2017/09  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  10>>
麻雀ゲーム・麻雀AI製作その2・ツモ切りゲーム2
前回で他家(CPU)はツモ切りするものとしてツモって捨てる動作までできたのですが、
今後CPUがAIとして前に作った計算機をベースに最適打牌・行動を計算するのに時間がかかることは明らかなので、
CPUの思考部分をバックグラウンド処理することを考えます。

ただ、CPUが3人いる関係で、3つのバックグラウンド処理を同時並行ですることが想定される
(基本的には自分のツモ順のときにのみ最適打牌を考慮しておけばいいのであれば、同時に処理されるバックグラウンド処理は1個までになるが、ロンと鳴きに関するところを計算時間を短時間で済ませることを考えれば、他家、特に自分の手番のときにも思考の処理をすることは有効になり得る…かもしれない。)
ということで、問題点が1個あります。

現状のプログラムだとどこからでもアクセスできるグローバル変数を多用していますが、それだと、
複数のバックグラウンド処理からグローバル変数にアクセス(特に値の書き換え)があった時にデータの不整合が発生する可能性が極めて高いということです。

これを防ぐために変数のスコープをバックグラウンド処理内での宣言で完結させて、他のバックグラウンド処理からはさわれないようにする必要があります。
ということで、今まで計算機のために作った大量の関数をグローバル変数を使わないで、単純に引数を渡し、戻り値を返すだけの設計に全部書き換える必要が出てきました(既存の計算機部分は現状それなりに動いていて新たなバグを作りたくないので、書き換えではなく、関数の新設になる)。かなり分量が多いので大変です。

今回はバックグランド処理に関する情報の受け渡し関係をなんとかやりました。

backgroundworkerの引数(e.Argument)として、今までの履歴(各プレイヤーのツモ、打牌)を渡し、
それを手牌情報、捨て牌情報のローカル変数に代入し、(もちろん考慮者以外の手牌情報は不明なので、その分の情報は切り捨てられる)
計算はそのローカル変数に対して行い
戻り値(e.Result)に思考した結果の最適打牌を返すというプログラムです。(今は単純にツモ切り。)

現状はただのツモ切りだけなので、自分以外のツモ番が回ってきたときに、各手番者のbackgroundworkerを起動させて、打牌が決定したらbackgroundworker処理を完結させるというだけです。
鳴きについてはまだまだ全く考慮できてないので、他家の手番中は考慮はさせません。(1回につき1個のbackgroundworkerのみを起動する)

というわけで、今回は見た目と機能は全く同じですが、かなり設計の中身を書き換えました、という話でした。
まだ完成は遠いけど、方向性は見えたかなー。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード