Probleme bei der Umsetzung der Algorithmem und deren Lösung beispielhaft am Quelltext erklärt

I. Die Prozedur "Du rätst"
Die Prozedur "Du rätst" besteht aus 3 Teilen:
1. Einlesen der Kombination
2. Prüfen der Kombination
3. Ausgabe der Antwort
In allen diesen Teilen sind Probleme auf getreten die nachfolgend beschrieben werden.

1. Einlesen der Kombination bei "Du rätst"

Obwohl der Benutzer die Eingabe nur über die Sternchen durchführt, steht letztendlich nur eine Zahl dahinter. Jede Farbe hat somit ihre bestimmte Zahl. Wir haben die Eingabe der Kombination als Longintzahl vorgenommen. Da aber beim Vergleich jede Ziffer dieser Zahl einzelnd geprüft werden muss, mussten wir eine Prozedur programmieren die die die einzelnden Ziffern der Kombination in einen Array speichert.
Zur Anschaulichkeit hier der Quelltext der split-Prozedur:

PROCEDURE split(i:INTEGER;z:LONGINT);
BEGIN
xt[Digits-i]:=z MOD 10; z:=z DIV 10;
IF i<=digits then split(i+1,z);
END;


Wie man sehen kann arbeitet die Prozedur mit Rekursion. z ist die Variable der Kombinationszahl und die einzelnen Ziffern werden in xt[] gespeichert. Da xt eine globale Variable ist kann sie dann auch von anderen Prozeduren und Funktionen genutzt werden. Die Eingabe der Zählervariable i muss als Parameter erfolgen, da sie auf Grund des rekursiven Aufbaus nicht in der Prozedur definiert werden kann. Bei jeden rekursiven Aufruf würde sie dann zurückgesetzt werden.

2. Prüfen der Kombination Für dieses Problem haben wir die Funktion test entworfen. Der Aufbau der test-Funktion ist äußerst kompliziert, deshalb erkläre ich hier nur die Grundzüge an Hand des Quelltextes:

FUNCTION test(xin,xin2:combi):STRING;
VAR str:STRING;
j:INTEGER;
BEGIN
str:='';
FOR i:=0 TO Digits-1 DO
IF xin2[i]=xin[i] THEN BEGIN str:=str+'+'; xin[i]:=-2; xin2[i]:=-1; END;
FOR i:=0 TO Digits-1 DO
FOR j:=0 TO Digits-2 DO
IF xin2[i]=xin[(j+i+1) MOD Digits] THEN
BEGIN
str:=str+'-'; xin[(j+i+1) MOD Digits]:=-2;
xin2[i]:=-1;
END;
test:=str;
END;


Die Funktion test erhält die beiden zu prüfenden Arrays als Parameter. Weil diese Arrays während des Test-Prozesses auch verändert werden, haben wir die lokalen Variablen xin und xin2 deklariert. Sie werden ausschließlich in der test-Funktion verwendet.
Die Funktion gibt am Ende einen String aus. Dieser stellt dann direkt die Antwort auf einen Versuch dar. Somit enthält er nur Pluse oder Minuse. Dieser String wird zu Beginn als leer definiert (''). In der ersten For-Schleife wird nun geprüft ob irgendeine Ziffer (Farbe) übereinstimmt. Wenn ja wird der String um ein Plus ergänzt und die beiden Arrays werden mit jeweils unterschiedlichen Negativwerten belegt. Dies hat den Zweck, dass sie nicht noch einmal gefunden werden.
Bsp.:
richtige Kombination 1234
Versuch 1212
Wenn die Arrays nicht überschrieben werden, wäre die Antwort '++--', da die letzte Eins und Zwei noch mal, als richtige Zahl an der falschen Stelle, notiert werden. In den anschließenden For-Schleifen werden die Kombinationen auf mögliche Minuszeichen getestet. Am Schluss wird der Teststring zurückgegeben.

3. Ausgabe der Antwort
Das Ausgeben der Antwort hat keine Probleme bereitet, da sie ja direkt von der Test-Funktion zurückgegeben wird.

II. Die Prozedur "Computer rät"
Die Prozedur Computer rät besteht aus den folgenden Teilen:
1. Einlesen der Geheimkombination des Benutzers
2. Finden des ersten Versuchs mit Hilfe des Algorithmus
3. Ausgabe des Versuchs
4. Einlesen der Antwort

1. Das Einlesen der Kombination funktioniert hierbei ebenfalls wie bei "Du rätst". 2. Der schwierigste Teil des ganzen Projektes und auch sein eigentlicher Kern ist der Algorithmus zur Findung eines Versuchs.
Auf Grund der Größe der Algorithmusbeschreibung haben wir uns entschlossen, eine neue HTML-Seite hierfür zu erstellen: Algorithmus Beschreibung

3. Die Ausgabe des Versuchs ist wieder verhältnismäßig schleicht, da nur die entsprechende Kombination von den Farben mit Hilfe des Sternchenzeichens realisiert werden kann.

4. Das Einlesen der Antwort des Benutzers erfolgt als String. Bei der Wahl des nächsten Versuchs wird dieser String dann wieder verwendet.

Zurück
Startseite