2016-03-20 12 views
-1

私はスカラのスキルを養成する方法としてブラックジャックゲームをしたいと思います。機能的にはval属性だけを使用したいと思います。(機能的な)Scalaを使ったブラックジャックテーブルのモデル化

私は自分自身にカードのリストを含む靴を含むテーブルを持っています。 私はカードを扱うと、カードがなくても新しいカードリストを作り直す必要があります。変更できないので、靴が変更できないので、新しいカードリストで新しい靴を再構築する必要があります。しかし、テーブル自体が変化しないので、新しい靴でテーブルを再構築する必要があります。 私はこれが間違っていると感じています。テーブル自体はカジノなどの一部であるゲームフロアの一部です。カードが処理されるたびに、またはベットが行われるたびに、プレーヤーが参加または退室するたびに、すべてを再構築する必要がありますか?

誰かがこれを設計する最良の方法についていくつかの洞察を与えることができますか?

オブジェクトの代わりにデータベースにゲームの状態を保存する必要がありますか?

答えて

2

私は3つの提案が、

最初は「Functional Programming in Scalaは」それは、このを見て非常に貴重なだろう機能状態をカバー章を持って本を読むことです。

State Monadを見ると、S =>(A、S)から基本的に現在の状態を入力とし、出力として新しい状態を生成する関数であるモナドです。

最後に、機能的なレンズを見ることですが、いくつかの実装がありますが、深くネストされた属性の値が変更された不変構造のコピーを作成することができます。私は個人的に使っていますlens implementation in Shapeless

最後に、機能性の高いプログラムは、最も外側のレイヤーで、IOやデータベースのやりとりなどの変更や副作用を処理するように構築されています。基本的にあなたが可変状態を使用していることを意味します。

+0

レンズ(かなり便利)を見ると、それは私が持っているのと同じ問題です、つまり、私は 'val cardListLens = lens [Casino] .cardRoom.table.shoeのようなレンズを作ったとしましょう。私はそれを使用してカードリストを更新すると、私はフロントエンドでデータを表示するために使用する新しいカジノを手に入れましたが、これはすべてを再構築しなければならないということです。 (私の場合ではないかもしれませんが、より大きなプロジェクトで) – Bentaye

+0

あなたが使用するデータ構造とその特性に大きく依存します。たとえば、単独リンクされたリストでは、項目を追加するときに新しいオブジェクトを割り当てる必要はありません。Functional Data Structuresの周りにはいくつかの文献がありますが、現時点では便利なものはありません –

0

Clojure(またはその他の(半)関数言語)では、通常、ゲームの状態全体を表す不変のデータ構造を保持する変更可能な格納場所である1つのアトムを使用してこれを解決します。ゲーム状態は通常、さまざまなエントリを持つ不変ハッシュマップを使用してモデル化されます。おそらくケースクラスになるScalaで。 1つの場所で分離されていて、前の状態を次の状態にマッピングする関数を使用して更新が原子的に行われる限り、機能プログラムに突然変異を持つことには何も問題はありません。 UI全体を1つのデータ構造として表すReduxのようなReact実装の多くで、同じアイデアを見つけるでしょう。 ScalaがClojureの原子のようなものを持っていて、それが慣用的であると考えられるのかどうかはわかりません。 変更可能な参照の代わりに、再帰を使用できます。プレイヤーがプレイするたびに、新しいゲーム状態で新しい再帰を入力します。

+0

私があなたに従うならば、私は一番外側のオブジェクト(私の例ではカジノ)をとり、カジノの状態のリストを持っていますそれは、変更が発生するたびに、私は新しいカジノを作成し、それをリストに追加し、リストの最後のエントリは私の現在のカジノでしょうか? – Bentaye

関連する問題