プログラミング
〜テーマ【カードゲーム】〜
まずは昔からまず作ってみるのがPokerなんだけど、今回はもう少し簡単なブラックジャック(21ともいいますか?)からいってみることにした。
ただ、あとからポーカーもやれるようにその辺も工夫しながら進めることにする。今のところ、Transcriptと、ポップアップでのゲーム展開ですが、そのうちViewerを替えればGUIにもできるはずです。そのうち...
また実際にどうかわっていったかは、プログラミング豆記録に最新版から載せてるので、下からたどってみて下さい。いろいろ悩んだ中身も記録してあります。
現在の最新版↓では、ポーカーもできるようになってマス。コンピュータも少し考えて自分の手札をより良くするために交換します。ただ、まだポイントを競ったり、賭けるポイントで駆け引きをしたり、といったところまでは実装してません。
《Version 4, 5》
ダウンロード:
 |
(Version5)
KunCardGame5.cs |
 |
(Version4)
KunCardGameOK4.cs |
|
Squeakのメニューで、 <Open...><File List>からダウンロードしたファイルを選んで、 [filein]ボタンをクリック。これでファイルイン完了。 →ポーカーするには「KunPoker run」を「Do it」して下さい。
→ブラックジャックをするには「KunBlackJack run」をワークスペースなどで「Do it」して下さい。
|
Ver5では、手持ちカード(KunCardOnHand)にローカル変数「cards」を用意して、そこに複数のカードを束縛するためのSortedCollectionのインスタンスを束縛。 で、手持ちカードがCollection系のメッセージに答えられるように、メッセージを委譲(Delegation)するようにした。
他に余計に持ってた手持ちカードの枚数を廃止、人間プレーヤのカード交換を外に出してちょっと汎用化などをしました。
--
Ver4では、これまでとはがらっと変えて、よりオブジェクト同士の独立性を高めることができた。
どうしたかというと、コンピュータの戦略決定メソッドはComputerPlayerに、人間がカードを選択するメソッドはHumanPlayerに格納した。
(1) 環境:
ゲームの環境として、手持ちカードの枚数やジョーカーの枚数などを定義している。
また全プレーヤを知っている。
他のオブジェクトのインスタンスを作って、命を吹き込むこともする。
(2) aPlayer:
他のaPlayerと役の強さで比較ができる。
自分がコンピュータなら、手役をさらに強くするためにはどうしたらいいか知っている。
(ブラックジャックではもう一回カードを引いたほうがいいか、
ポーカーではどれを捨てたらいいかが判る)
自分が人間なら、ユーザと対話してカードの取捨を決める。
環境を知っている。
(3) myHand:
役が何であるか判定できる。
BlackJackとPokerそれぞれにサブクラスがあり、それぞれの役判定ができる。
(4) viewer:
手持ちカードの表示(Transcriptにですが)ができる。
(5) aDeck:
指定された枚数のカードを生成することができる。
(内部的に重複なくトランプのカードを一枚ずつ生成することができる)
ここで、(1)〜(4)は、ゲームごと(ポーカー,ブラックジャック)にサブクラスを作って、それぞれに特別な動作をする。(5)だけはゲームに関わらず同じオブジェクト。
fig.2 カードゲームのオブジェクト(Version4)

《Version 1〜3》
ダウンロード:
 |
(Version3)
KunCardGameOK3.cs |
 |
(Version2)
KunCardGameOK1.cs |
 |
(Version1)
KunCardGameOK0.cs |
|
Squeakのメニューで、 <Open...><File List>からダウンロードしたファイルを選んで、 [filein]ボタンをクリック。これでファイルイン完了。 →「KunPoker run」を「Do it」して下さい。
|
最初にやったが、下のfig.1のようにオブジェクトを作ってみた。
(1) 環境:
ゲームの環境として、手持ちカードの枚数やジョーカーの枚数などを定義している。
また全プレーヤを知っていて、aDealer, aPlayerが使うメソッドを格納している。
他のオブジェクトのインスタンスを作って、命を吹き込むこともする。
(2) myHand:
役が何であるか判定できる。
BlackJackとPokerそれぞれにサブクラスがあり、それぞれの役判定ができる。
(3) aDealer:
aDeckを知っていて、指定された枚数のカードを生成することができる。
普通のプレーヤでもある(CardPlayerのサブクラス)。
(4) aPlayer:
他のaPlayerと役の強さで比較ができる。
環境を知っている。
(5) aDeck:
重複なくトランプのカードを一枚ずつ生成することができる。
ここで、(1)と(2)は、ゲームごと(ポーカー,ブラックジャック)にサブクラスを作って、それぞれに特別な動作をする。