プログラミング
〜テーマ【カードゲーム】〜

まずは昔からまず作ってみるのがPokerなんだけど、今回はもう少し簡単なブラックジャック(21ともいいますか?)からいってみることにした。

ただ、あとからポーカーもやれるようにその辺も工夫しながら進めることにする。今のところ、Transcriptと、ポップアップでのゲーム展開ですが、そのうちViewerを替えればGUIにもできるはずです。そのうち...

また実際にどうかわっていったかは、プログラミング豆記録に最新版から載せてるので、下からたどってみて下さい。いろいろ悩んだ中身も記録してあります。
現在の最新版↓では、ポーカーもできるようになってマス。コンピュータも少し考えて自分の手札をより良くするために交換します。ただ、まだポイントを競ったり、賭けるポイントで駆け引きをしたり、といったところまでは実装してません。

《Version 4, 5》
ダウンロード:
ダウンロード:KunCardGame5.cs (Version5)
KunCardGame5.cs
ダウンロード:KunCardGameOK4.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》
ダウンロード:
ダウンロード:KunCardGameOK3.cs (Version3)
KunCardGameOK3.cs
ダウンロード:KunCardGameOK1.cs (Version2)
KunCardGameOK1.cs
ダウンロード:KunCardGameOK0.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)は、ゲームごと(ポーカー,ブラックジャック)にサブクラスを作って、それぞれに特別な動作をする。

fig.1 カードゲームのオブジェクト(Version1)

《Version 2》
・aDeckを独立したオブジェクトに格上げ。
・aDealerは廃止。
・各aPlayerは直接aDeckにカードの生成を依頼する。

《Version 3》
・インスタンス化する時の初期化を見直し。
・コンピュータの戦略を実装。