前回のカードゲーム スピードをつくる クリックしたらカードを出す(1)の続きです。今回はコンピュータにカードを出させます。

コンピュータがカードを出す処理

具体的な方法ですが、タイマーのTickイベントが発生するたびにカードが出せるのであればカードを出させます。また

人間であるプレイヤーは場から台札にカードを出すときは出せるカードを連続で出して後から山札のカードで場を埋めるような出し方をしてもかまわない、ただしコンピュータは場から台札にカードを出したら山札から場のカードを補うように動作させます。このような設定にしたのはコンピュータに本気を出されると人間に勝ち目がないからです。

下の動画は動作確認というよりネタ動画です。コンピュータの動作を速くしているので人間は手の出しようがありません。そこでユーザーが自分でコンピュータの動作速度を自由に設定できる機能を追加してもいいかもしれません。

ではコンピュータにカードを出させる機能を追加していきましょう。

まずはTimer.Tickイベントが発生したときの処理です。

ゲームの勝敗がついてしまった(IsGameSet == true)場合、どちらもカードを出せない(CanPutNextCard() == false)場合はタイマーをいったん止めます。

そうでない場合はコンピュータはカードを出せる(ここでは台札に出すだけでなく山札のカードを場に移動させる動作も含む)ということなのでカードを出させる、または移動させます。

コンピュータの動作に関するメソッドです。

コメントにあるように山札がある場合は、場が空いているなら山札からカードを補充し、場が空いていいないなら場から出せるカードを出します。山札がすでになくなっている場合は、山札からカードを補充できないので場から出せるカードを探して出させます。

以上で終わります。・・・では短すぎるので設定を変更できるようにします。まずはコンピュータがカードを出す処理をする間隔です。上記の動画のように速すぎると無理ゲーになり、簡単すぎてもクソゲーとなります。どれくらいの間隔がいいかはユーザーに決めてもらいましょう。

設定でコンピュータの速度を調整できるようにする

メニューに[設定]を追加します。そしてこれをクリックしたら設定のダイアログが出てくるようにします。

設定のダイアログをつくる

ここではトラックバーを表示させて、これをスライドさせるとコンピュータの着手の間隔を0.1秒から10秒の間で好きな値を設定できるようにします。

設定された値をTimer.Intervalにセットする

Form1クラス側では以下の処理をおこないます。

メニューの[設定]が選択されたらFormConfigクラスで生成されるダイアログが表示されます。設定のダイアログは複数表示されることはないので最初にフィールド変数としてオブジェクトを生成し、これを使い回します。

設定をファイルとして保存する

一度アプリを終了してまた設定するのは面倒くさいので設定を保存します。

普通はアプリの実行ファイルが保存されている場所に保存すればいいのですが、設定によってはできない場合もあるのでユーザーアプリケーションデータのパスを取得して、そこに保存します。そのパソコンは自分ひとりしか使っていないというのであれば実行ファイルが存在するフォルダで問題ありません。

保存するものは1つだけなのですが、あとになって気が変わって他の設定も保存したくなるのはよくある話です。そこでDocというクラスを作成しています。

SetConfigメソッドにXMLファイルとして設定を保存するコードを追加します。

そしてアプリが起動したときに保存しておいた設定を読み出せるようにします。そうしないとファイルとして保存した意味がないので・・・。

まあまあの文字数になったのでこれで終わります。