[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: staticの使い方(メソッド)




前橋です。

小薮さん:
>> (Playerの説明)
>> >>・Boardに対してポインタを持ちます。
>> >「Boardのインスタンスを保持します」かな。
>>
>> Playerが、それぞれにBoardを抱え込んでいたりしていたら、ゲー
>> ムになりませんってば。(^^;
>
>コンピュータの思考ルーチンには、先読みのために、
>自分自身のBoardインスタンスを持たせたくないですか?

そうですね。

ただ、それは、「次、君の番ね」と言われた時点でBoardからコピー
すればいい話ですから、ComputerPlayerのインスタンスメンバに持
つのではなくて、ローカル変数に生成して、引数で持って回る形に
なるような。
# ひとつ前の手番で先読みした結果を保持して効率化を図る、とい
# うことをしないという前提ですが。

そういや、C++では、盤面の状態を表現する構造体を、引数として
スタックに積んで先読みしましたが、Javaだと、呼び出しの度に
clone()かな(遅そう)。

真剣にチューニングするなら、先読みの深度だけの配列を用意して、
それをスタック代わりにした方がいいかもしれない...
# もっとチューニングするなら、Boardのコピーは1個だけにして、
# 先読みの手を打つ度に、その差分をスタックに積んだ方が高速ら
# しいんですが、その方法だとタチの悪いバグを生んでしまいそう
# です。

だんだん余談になりますが、以前、私がC++で書いた時には、Board
と、ComputerPlayerが先読みのために持つ盤面とでは、違う持ち方
をしました。

Boardの側では、「先手のセル」「後手のセル」「空欄のセル」の3
つの要素からなるenumなのですが、ComputerPlayerで持つのは、
「自分のセル」「敵のセル」「空欄のセル」のenumにしました。
Boardからコピーする時点で読み換えるわけです。先手でも後手で
も同じ思考ルーチンを使用したので(手抜き)、その方が手が抜ける
のでした。あと、実行効率の都合上、ComputerPlayerは、盤面の状
態をいちいちメソッドを介さず直接読みたいってのもありますし...

>Judgeのインスタンスが「正式盤面」としてBoardのインスタンスを
>一つ持ち、各プレイヤーはそのコピーの取得が許されている、
>とかそんな形になるかと思いますが。

その場合、Playerさんは、「正式盤面」へのポインタを保持するこ
とは許されていないのでしょうか。Boardの内容をコピーするのは
もちろん、「コマを置く」メソッドをコールするのも、全てJudge
経由で行なう、と。

それはそれで正しい設計だと思います。ちょっと面倒そうではあり
ますが。

------------------------------------------------------------
  de 前橋和弥            maebashi@xxxxxxxxxx
                         http://member.nifty.ne.jp/maebashi/
------------------------------------------------------------