2009-07-01 4 views
10

Sto scrivendo un gioco di Mahjong in C# (il gioco tradizionale cinese, non il tipo di solitario). Mentre sto scrivendo il codice per l'intelligenza artificiale del robot bot, mi chiedo se un linguaggio funzionale come F # sarebbe una lingua più adatta di quella che uso attualmente, che è C# con un sacco di Linq. Non so molto di F # ed è per questo che chiedo qui.F # è un buon linguaggio per il gioco di carte AI?

Per illustrare quello che cerco di risolvere, ecco un breve riassunto di Mahjong:

Mahjong suona un po 'come Gin Rummy. Hai 13 tessere nella tua mano, e in ogni turno, peschi una tessera e ne scartane un'altra, cercando di migliorare la tua mano verso una mano Mahjong vincente, che consiste in 4 set e una coppia. I set possono essere un 3 di un tipo (pung), 4 di un tipo (kongs) o una sequenza di 3 tessere consecutive (chow). Puoi anche rubare gli scarti di un altro giocatore, se può completare uno dei tuoi set.

Il codice che ho dovuto scrivere per rilevare se il bot può dichiarare 3 set di tessere consecutive (chow) è piuttosto noioso. Devo trovare tutte le tessere uniche nella mano, e poi iniziare a controllare se c'è una sequenza di 3 tessere che contengono quella in mano. Rilevare se il bot può andare Mahjong è ancora più complicato dal momento che è una combinazione di rilevamento se ci sono 4 set e una coppia nella sua mano. E questa è solo una mano Mahjong standard. Ci sono anche numerose mani "speciali" che infrangono quelle regole ma sono ancora una mano del Mahjong. Ad esempio, "13 meraviglie uniche" è composto da 13 tessere specifiche, "Impero Giada" è composto solo da tessere colorate di verde, ecc.

In un mondo perfetto, mi piacerebbe poter solo indicare le "regole" di Mahjong, e avere la lingua in grado di abbinare un set di 13 tessere contro quelle regole per recuperare le regole che soddisfa, ad esempio, controllando se è una mano Mahjong o se include un 4 di un tipo. Questo è qualcosa che la caratteristica di abbinamento del modello di F # può aiutare a risolvere?

risposta

7

Se hai familiarità con i linguaggi funzionali, sono un ottimo modo per scrivere AI - e se non lo sei, la sfida di imparare uno ti aiuterà a crescere e ti lascerà un programmatore migliore di te erano. (Potrei dire sinceramente la stessa cosa per linguaggi dichiarativi come Prolog e linguaggi di scripting dinamico/OO/multi-paradigma come Ruby o Python! -).

Il tuo compito come lo descrivi dovrebbe essere facile in uno di questi gruppi di lingue: scegli quello che vuoi! Saremo lieti di aiutare collettivamente tutte le domande che dovrebbero scaturire da questi tentativi (personalmente non conosco F # o Scala, ma sarei felice di aiutare con Haskell, qualsiasi linguaggio della famiglia ML, Scheme o Erlang - e allo stesso modo per gli altri gruppi ;-).

Scherzi a parte: piena padronanza di almeno una lingua in ogni categoria ampia (procedurali, funzionali, dichiarativa/clausola di unificazione, relazionale, dinamico/multi-paradigma, ecc) si fa un seriamente migliore programmatore - mahjong a parte (ed è un gioco classicamente popolare nella regione romagnola d'Italia, vicino alla mia città natale, Bologna ;-), qualsiasi attività che può aggiungere al tuo roster in questo senso è well degno di essere presa !!!

1

Non c'è niente che non puoi farti apparire in un'altra lingua.

Ho cercato di rendere l'intelligenza artificiale utilizzando java in precedenza, in base a ciò che avevo fatto in Prolog. Pensavo che sarebbe stata una cagna da codificare. Tuttavia, ho avuto solo un paio di metodi che hanno fatto un sacco di lavoro, portandolo fuori dai metodi principali, e ha funzionato meravigliosamente.

Potrebbe essere necessario reinventare la rotella, ma non ci dovrebbe essere molto che non si possa fare in C# in F #.

nota: non ho mai sentito parlare di F # prima, ma non può essere così male. Potrei/non starò soffiando dal mio stesso culo.