Home > Erlang > A card game in Erlang

A card game in Erlang


Tornato dalla Finlandia ho iniziato a pensare ad un nuovo progetto da sviluppare in erlang.

Visto che i miei amici italiani sono diventati dei super fanatici del gioco della scopa, ho pensato che sarebbe stata una buona sfida creare un server che gestisse delle partite a 4 giocatori (in coppie di 2) e mi sono scervellato sulla struttura da implementare, partendo dall’idea di usare piu moduli basati sul gen_server behaviour.

La prima cosa che ho iniziato a sviluppare consiste in un gen_server che gestisce il mazzo e il tavolo di gioco, tale server deve creare un mazzo, gestire le richieste di 10 carte da parte di ogni giocatore e gestire le carte giocate e i tentativi di presa.

Ho identificato alcuni records su cui iniziare l’implementazione..

-record(card, {value, seed}).
-record(deck, {cards=[card]}).
-record(state, {deck, table=[]}).

Tutto si basa sull’idea che ogni carta venga rappresentata come un record a due valori: una value che ne indica il numero (da 1 a 10) e un seed, ovvero un seme.
Ho creato anche un record per il deck (ovvero il mazzo): tale record contiene ha solo un valore, che viene identificato come una lista di carte….alla fine ho deciso che lo stato del mio gen_server per il mio momento sia dato da un record contenente un deck e un table (rappresentante le carte sul tavolo) che di default è una lista vuota….ora, stavo effettivamente pensando che deck e table potrebbero essere basati su di un unico record (una lista di carte)…ma come ho detto tutto questo è ancora uno stub…🙂

Nella funzione di init del mio gen_server devo creare un mazzo e mescolarlo…ecco la mia prima implementazione:

init([]) ->
  Coppe = create_cards("Coppe"),
  Denari = create_cards("Denari"),
  Bastoni = create_cards("Bastoni"),
  Spade = create_cards("Spade"),
  ShuffledDeck = #deck{cards=shuffle(lists:append([Coppe, Denari, Bastoni, Spade]))},
  {ok, #state{deck=ShuffledDeck}}.

create_cards(Seed) ->
  lists:foldl(fun(Number, Acc) ->
                                 [#card{value=Number, seed=Seed} | Acc]
              end, [], lists:seq(1, 10)).

La funzione create_cards(Seed) non fa altro che creare dieci carte (da 1 a 10) per un seme dato in ingresso, usando un accumulalore e il metodo lists:seq/2 che dati due numeri crea una lista di interi dal primo al secondo di passo 1.

Tuttavia a vederlo ora, il codice interno a init([]) non mi sembra molto elegante, quindi forse qualcosa del genere sarebbe meglio:

init([]) ->
  Cards = lists:fold(fun(Seed, Acc) ->
                                      [create_cards(Seed) | Acc]
                     end, [], ["Coppe, "Denari", "Spade", "Bastoni"]),
  ShuffledDeck = #deck{cards=shuffle(lists:append(Cards))},
  {ok, #state{deck=ShuffledDeck}}.

L’ultimo codice tuttavia è solo un abbozzo scritto su due piedi qui sul computer della facolta…quindi potrebbe benissimo non compilare🙂 ma l’idea mi sembra migliore…se vi va provatelo e ditemi….io intanto continuo nell’implementazione e nel prossimo post spero di potervi spiegare come mescolare il mazzo, ovvero come randomizzare una lista in erlang!

Categories: Erlang
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: