2016-05-06 10 views
0

Ich bin neu in der Programmierung und muss ein einfaches Kartenspiel machen, habe aber Probleme mit der rec Funktion.OCaml rec Funktion für ein Kartenspiel

Angenommen, ich habe eine Liste mit 5 Spielern. Jetzt drucke ich ein Menü für jeden Spieler in der Runde mit der aktuellen Hand des Spielers, dann legt der Spieler eine Karte ab und zieht eine neue.

Ich muss laufen, bis das Deck keine Karten mehr hat.

Dies ist mein Code:

let rec round deck players = 
    match deck with 
    | [] ->() 
    | h::t -> (match players with 
        | x::xs -> print_mazo deck; 
        print_play x; 
        let i = read_int() in 
        let (newhand, carta) = drop x.mano i in 
        let (newdeck, newhand2) = draw deck newhand 1 in 
        print_ronda x carta; 
        round newdeck xs 
        | [] -> round newdeck players 
      ) 

ich diesen Fehler habe:

Error: Unbound value newdeck 
+0

sieht aus wie das Problem in der Zeile mit 'read_int': es sollte' read_int() ' –

+1

(1) Es wäre nett, ein minimiertes vollständiges Beispiel zu haben, das wirklich kompiliert. (2) Und zumindest sollten Sie die Zeile markiert haben, in der der Fehler auftritt. –

+3

Sie können Ihre Frage nicht ändern. Es macht die alten Antworten unsinnig. –

Antwort

0

Eigentlich ist Ihr Code seltsam. Lassen Sie mich erklären, warum Sie da:

let rec round deck players = 
match deck with 
    | [] ->() 
    | h::t -> (match players with 
       | x::xs -> (* Some code *) 
       let (newdeck, newhand2) = draw deck newhand 1 in 
       round newdeck xs (* good recursive call *) 
       | [] -> round newdeck players (* bad recursive call *) 
     ) 

Warum ist es ein bad recursive call? Weil Sie newdeck im ersten Zweig Ihres Mustervergleichs deklariert haben, aber nicht im zweiten Zweig. Also, wenn Sie | [] -> round newdeck players schreiben, woher kommt das newdeck?

Es ist wie das Schreiben

let f x = let a = 3 in x + a 
let y = a 

Sind Sie mit der Tatsache überein, dass diese a-f lokalen war? Wenn Sie damit einverstanden sind, ist es das gleiche mit Ihrem newdeck lokal zum ersten Zweig des Mustervergleichs.

+0

Oh ich sehe, ich brauche einen Weg, um mein modifiziertes Deck in der endgültigen Patern zu verwenden –

+0

Eigentlich, wenn Sie Ihren Code mit Aufmerksamkeit betrachten, wenn die Liste der Spieler leer ist, ist Ihr 'neudeck' gleich dem Parameter' deck', da der rekursive Aufruf von 'round' immer auf' newdeck' erfolgt. – Lhooq

1

Ich denke, Ihr unmittelbares Problem ist, dass Sie haben:

let i = read_int 

aber Sie müssen

let i = read_int() 

read_int an sich ist eine Funktion, die ein ziemlich gewöhnlicher Wert in OCaml (und jeder FP-Sprache) ist. Es ist also kein Fehler, i an diesen Wert zu binden. Der Compiler bemerkt jedoch, dass der Wert nicht den richtigen Typ hat, nämlich int. Sie möchten die Funktion aufrufen; das heißt, Sie müssen es auf einen Eingabewert anwenden. Im Fall von read_int nimmt es immer den gleichen Eingabewert ().

Durch den Rest Ihres Codes Skimming, sehe ich keine Verwendung des Werts t. Ich vermute, es gibt noch etwas zu tun, um die Liste der Spieler durchzugehen.