2012-04-02 7 views
2

Ich muss etwas wie ein Minesweeper in Prolog schreiben. Ich bin in der Lage, das in "normaler" Sprache zu tun, aber wenn ich versuche, mit Prolog zu programmieren, weiß ich überhaupt nicht, wie ich anfangen soll. Ich brauche eine Art von Tipps. Eingangsspezifikation:Prolog: Wo beginne ich Minesweeper-ähnliche Puzzles zu lösen?

Board Größe: m × n (m, n ∈ {1, ..., 16}), Liste von Tripeln ( i, j , k), wobei i ∈ {1, ..., m }, j ∈ {1, ..., n }, k ∈ {1, ..., 8}) beschreibt Felder mit Zahlen.

Zum Beispiel:

5 
5 
[(1,1,1), (2,3,3), (2,5,2), (3,2,2), (3,4,4), (4,1,1), (4,3,1), (5,5,2)]. 

Output: Liste der Stellen und den Atomen * (für Schatz) und (für leere Felder). Es ist eine Darstellung der Puzzle-Lösung.

Regeln dieses Puzzle: In 20 Felder des Brettes gibt es versteckte Schätze. Eine Ziffer in einem Feld gibt an, wie viele Nachbarfelder einen Schatz haben. Es gibt keine Schätze in Feldern mit einer Ziffer. Markiere alle Felder mit einem Schatz.

Sie müssen erraten, wie viele Schätze sind in Diagonalen versteckt.

würde ich für alle Tipps dankbar. Ich will keine vollständige Lösung, ich möchte es selbst schreiben, aber ohne Hinweise bin ich dazu nicht in der Lage.

Antwort

1

Eine Matrix in der Regel als eine Liste der Liste behandelt wird, können Sie/3 über Länge/2 und findAll bauen. Eine Matrix von leeren Variablen (wo man Werte setzen, während erraten ....)

build_matrix(NRows, NCols, Mat) :- 
    findall(Row, (between(1, NRows, _), length(Row, NCols)), Mat). 

Elemente über Koordinaten Zugriff kann mit Nth1 erfolgen (siehe here für eine andere Antwort, wo Sie einige Details finden: siehe Zelle/3).

Dann setzen Sie alle Ihre Triple-Constraints: Es gibt eine endliche Anzahl von Möglichkeiten, die 'versteckten Schatz' Zähler zu konsumieren, lassen Sie Prolog alle Wege suchen, indem Sie adjacents aufzählen.

Prozess die Liste von Tripeln jeden Zähler in kompatibelen Zellen, mit einem rekursiven Prädikat platzieren. Wenn die Liste endet, haben Sie eine Vermutung.

Um Ihren Code einfacher zu halten, keine Sorge über Indizes aus Matrix Grenzen, denken Sie daran, dass Fehler 'normal' sind bei der Suche ...

+0

'build_matrix (Zeilengröße, ColSize, Mat): - Länge (C , ColSize), Länge (Mat, RowSize), maplist (copy_term (C), Mat) .' wäre sicherlich besser als eine Lösung von findall – m09

+0

Ja, es ist besser. Und copy_term/2 ist ISO Standard, gut zu wissen! – CapelliC

+0

Yup Ich benutze es regelmäßig, wenn ich diese Datenstrukturen einrichten möchte. Wenn lambda geladen ist \ führt eine Ausdruckskopie auch als falsch in einem anderen Beitrag BTW erwähnt, gut zu wissen! – m09