Zitat von
SteffDaChef:
Können bei case-Verzweigungen nur variablen auf zahlen überprüft werden?
Ein Case kann nur ordinale Werte prüfen. So etwas wie dieser Aufzählungstyp gehört dazu, eigentlich steht da (implizit) eine Zahl hinter jedem Wert, der erste Wert entspricht einer 0, der nächste einer 1 usw. (vielleicht fängt Delphi auch bei 1 an, bin mir nicht 100%ig sicher). Mit der Funktion ord(x) kannst Du Dir den Ordinalen Wert zurückgeben lassen, also z.B. ord(sfTurm) wäre eine Zahl, die eben dem Turm entspricht. Du kannst auch explit eine Zahl zuweisen, dazu würdest einfach hinter den Bezeichner mit einem = Zahl die Zahl zuweisen
Delphi-Quellcode:
type
TFarbe = (schwarz = 0, weiss = 118);
// ord(schwarz) = 0
// ord(weiss) = 118
Solche Aufzählungstypen sind also kein Problem, bei einem String hingegen würde ein Case nicht funktionieren (entsprechend erst recht nicht bei Objekten oder anderen komplexen Datentypen).
Zitat von
SteffDaChef:
Und kann man auch die Positionen in type einbinden?
Auch das geht. Du kannst den Verbundtypen (das Record) einfach aus beliebig vielen Feldern zusammen setzen. Was Du dann hast ist eine Liste, die 32 Figuren (bzw. 2 die je 16 Figuren) enthält. Das ganze spart Dir zwar etwas Platz, da Du hier keine leeren Felder abspeicherst, dafür dauert aber die Überprüfung ob ein Zug möglich ist etwas länger. Hier musst Du immer die ganze Liste (oder sogar Beide) betrachten, da wie vorhin erwähnt ja eine Figur irgendwo im Weg stehen könnte. Mit der Matrix hingegen überprüfst Du direkt die Felder, was schneller (und
imho einfacher) gehen sollte, dafür aber eben etwas (zu vernachlässigen) mehr Platz benötigt. Besteht Deine Spielfigur nur aus ihrem Typ und der Farbe (ja max. 4 Byte) und das Feld ist eine Matrix von 64 Feldern, von denen jedes genau eine Spielfigur speichert, währe das gerade mal ein Speicherbedarf von 4 * 64 Byte, also stolze 256 Byte (ohne K davor!). Verwendest Du eine Liste, dürfte der Overhead der Liste schon fast diesen Speicherbedarf wett machen. Aber möglich ist es natürlich trotzdem, ich würde Dir aber raten es lieber so zu machen, wie Du es bereits getan hast (ein 2D-Array verwenden).
Zitat von
SteffDaChef:
Außerdem, was ist das result am ende bzw boolean?
Die Routine die ich gepostet hatte ist eine Funktion. Eine Funktion hat im Gegensatz zu einer Prozedur immer einen Rückgabewert. Der ganze Rest gleich völlig dem, was Du als Prozedur kennen gelernt hast. Mit dem Schlüsselwort function sagst Du aber, dass am Ende dieser Routine noch ein Wert zurückgegeben wird. Diesen schreibt man mit einem führenden Doppelpunkt einfach hinter den Rest (und vor das Semikolon). Also function <Name>[(<Parameter>)] : <Rückgabetyp>;
Das, was Du zurückgeben willst weißt Du einfach der speziellen Variable result zu. Result ist dann das, was die wörtliche Übersetzung schon vermuten lässt, das Ergebnis der Funktion. Statt result kannst Du auch den Namen der Funktion verwenden.
Da die von mir gepostete Funktion prüft, ob eine Figur schlagbar ist, gibt sie also einen Wahrheitswert zurück. Boolean ist dabei der Delphityp, der dem entspricht. Ein Boolean kann zwei Werte annehmen: True und False (Groß-/Kleinschreibung ist hier wie immer egal). Solch ein Wahrheitswert kann immer mit if überprüft werden.
Du kannst also so etwas schreiben wie:
Delphi-Quellcode:
if not istSchlagbar(A, 10, B, 11) then
begin
ShowMessage('Geht nicht!!! Bäh!');
end
else
begin
...
end;
Wobei der Zug hier rein fiktiv ist, hab es nicht mit Schachbretter im Kopf überlegen, müsste aber einem gültigen Zug für das Schlagen durch einen Bauern entsprechen?! Egal.
Ja, Funktionen geben halt einen Wert zurück, was immer schöner/sauberer/einfacher ist als mit globalen Variablen zu arbeiten. Der Vorteil ist, dass halt jeder, der die Funktion aufruft sein eigenes Ergebnis bekommt. Eine globale Variable hingegen wird immer vom Letzten überschrieben, ohne dass man das sonst bemerkt.