|
Antwort |
Registriert seit: 14. Feb 2005 13 Beiträge |
#1
Hallo
ich bin momentan damit beschäftigt, ein Vier Gewinnt -Spielchen zu programmieren. Ich bin noch ziemlich Anfänger in Delphi und OOP ist mir nur teilweise vertraut (leichte Vorkenntnisse in BASIC, C, Assembler). Mein Programm braucht keine grafische Oberfläche. In einer Konsolenanwendung soll der Spieler die Spalte angeben, in die er werfen will, und der Computer gibt einfach seine Spalte aus, in die dieser werfen möchte usw. Im folgenden steht mein bisheriger Quellcode, der wegen 4 Fehlermeldungen am kompilieren gehindert wird. Ich würde mich sehr freuen, wenn mir jemand sagen könnte, wo diese Fehler herkommen, und wie ich sie beheben kann. lg boozzz Erläuterungen zum Quelltext: 0 steht für ein leeres Feld, 1 steht für Stein des Computers, 2 steht für möglicher Zug des Computers, 3 steht für Stein des Spielers (Menschen)
Delphi-Quellcode:
program VierGewinnt7;
{$APPTYPE CONSOLE} //Ausgabe auf Konsole uses SysUtils, System; var AktuellesBrett: array[1..7, 1..6] of Integer; var ergebnisliegtvor: Boolean; var gewinner: Char; var i, Q, P: Integer; //i=Z�lvariable; Q=Spalte des Spielers; P=Spalte des Computers var spalte1, spalte2, spalte3, spalte4, spalte5, spalte6, spalte7: Integer; //Hier wird gespeichert, wieviele Steine bereits in der jeweiligen Spalte sind const breite=7; hoehe=6; procedure eingangsabfrage; //Unterprogramm zur Abfrage der Eing�ge begin //der Spieler wirft seinen Stein in Spalte Q. (0<Q<8) //zum testen nehmen wir an, der Spieler wirft seinen Stein in Feld 3: Q:=3 end; procedure brettanalyse(x, y: Integer); begin if i=0 then for x:=1 to breite do for y:=1 to hoehe do AktuellesBrett[x,y]:=0 //Am Anfang des Spiels wird das Array mit Nullen gefllt else if Q=1 then //Wenn Spieler in die erste Spalte wirft.. case spalte1 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 1 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte1:=spalte1+1; if Q=2 then //Wenn Spieler in die zweite Spalte wirft.. case spalte2 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 2 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte2:=spalte2+1; if Q=3 then //Wenn Spieler in die dritte Spalte wirft.. case spalte3 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 3 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte3:=spalte3+1; if Q=4 then //Wenn Spieler in die vierte Spalte wirft.. case spalte4 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und . 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 4 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte4:=spalte4+1; if Q=5 then //Wenn Spieler in die fnfte Spalte wirft.. case spalte5 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 5 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte5:=spalte5+1; if Q=6 then //Wenn Spieler in die sechste Spalte wirft.. case spalte6 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und 1: AktuellesBrett[Q,2]:=3; //..dementsprechend gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 6 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte6:=spalte6+1; if Q=7 then //Wenn Spieler in die siebte Spalte wirft.. case spalte7 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden.. 1: AktuellesBrett[Q,2]:=3; //..und fr den Spieler der Wert '3' ins entsprechende Feld gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 7 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte7:=spalte7+1; end; procedure zuganalyse(x, y: Integer); begin for x:=1 to breite do for y:=hoehe downto 1 do //umgekehrte Reihenfolge! (von oben nach unten) if AktuellesBrett[x,y]=1 then begin AktuellesBrett[x,y+1]:=2; Break; //Die '2' steht fr einen m�lichen Zg des PC's end else if AktuellesBrett[x,y]=3 then begin AktuellesBrett[x,y+1]:=2; Break; end; end; procedure ki(x, y: Integer); begin for x:=1 to breite do //Ueberpfrung, ob Computer im n�hsten Zug gewinnen kann for y:=1 to hoehe do //Im Folgenden werden alle m�lichen Zge des Computers und deren Nachbarn betrachtet if AktuellesBrett[x,y]=2 then //Gegenenfalls wird das Viererpaar vollendet und die Prozedur KI beendet if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 and if AktuellesBrett[x+3,y]=1 then // begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-3,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 and if AktuellesBrett[x,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x+3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x-3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x-3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x+3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x-1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x+1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x+1,y+1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x-1,y+1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else ergebnisliegtvor:=False; end; //Der Rest der KI ist in Arbeit P:=2; //zum testen wirft der Computer in die zweite Spalte end; procedure ausgeben; WriteLn ('Computer wirft in Spalte ',P); end; begin WriteLn(' Vier Gewinnt '); WriteLn('--------------------'); WriteLn(''); i:=0; //Z�lvariable, damit KI wei� wer am Zug ist ergebnisliegtvor:=False; //Dient zum Beenden des Programms, wenn ein Ergebnis vorliegt repeat eingangsabfrage; brettanalyse; zuganalyse; ki; ausgeben; i:=i+1 //Hochz�len der Spielzge until ergebnisliegtvor=True; //Solange wiederholen, bis ein Ergebnis vorliegt WriteLn gewinner + (' hat gewonnen'); //Gewinner ausgeben ReadLn end. |
Zitat |
Registriert seit: 8. Feb 2004 406 Beiträge Delphi 6 Enterprise |
#2
Du musst auch schreiben was für Fehlermeldungen kommen.
Aber
Delphi-Quellcode:
muss, wenn es eine eigene Procedure sein soll mit "begin" anfangen und mit "end;" aufhören.
procedure ausgeben;
WriteLn ('Computer wirft in Spalte ',P); end; |
Zitat |
Registriert seit: 8. Feb 2004 406 Beiträge Delphi 6 Enterprise |
#3
Da du keine Fehlermeldungen postest, schreib ich mal die Fehler die ich gefunden habe:
Delphi-Quellcode:
Hier rufst du Prozeduren auf die du jedoch vorher so deklariert hast:
repeat
eingangsabfrage; brettanalyse; zuganalyse; ki;
Delphi-Quellcode:
Sie erwarten also alle jeweils zwei Parameter vom Typ integer.
procedure brettanalyse(x, y: Integer);
procedure zuganalyse(x, y: Integer); procedure ki(x, y: Integer); Ein korrekter Aufruf müsste dann z.B so aussehen:
Delphi-Quellcode:
repeat
eingangsabfrage; brettanalyse(2,4); ki(1,2); zugangsanalyse(1,3); WriteLn gewinner + (' hat gewonnen'); Das muss, falls "gewinner" eine Variable vom Typ string ist, so aussehen: Writeln(gewinner + ' hat gewonnen'); . Denke jetz sind ein paar Fehler behoben, aber poste einfach deine konkreten Fehlermeldungen, die du nicht lösen kannst dann kann man dir besser helfen. |
Zitat |
Registriert seit: 19. Jan 2005 Ort: Elstra 764 Beiträge Delphi 7 Enterprise |
#4
Die Prozedur
Delphi-Quellcode:
kommt mir etwas seltsam vor.
procedure zuganalyse(x, y: Integer);
begin for x:=1 to breite do for y:=hoehe downto 1 do //umgekehrte Reihenfolge! (von oben nach unten) if AktuellesBrett[x,y]=1 then begin AktuellesBrett[x,y+1]:=2; Break; //Die '2' steht für einen möglichen Zug des PC's end else if AktuellesBrett[x,y]=3 then begin AktuellesBrett[x,y+1]:=2; Break; end; end; Wozu werden Parameter x und y erwartet, wenn sie in den for-Schleifen gleich am Anfang auf 1 bzw. hoehe gestezt werden? Da wäre es doch sinnvoller, lokale Variablen zu verwenden.
Delphi-Quellcode:
MfG
procedure zuganalyse;
var x, y: Integer; begin //hier jetzt der Rest der Prozedur wie oben ... end; Binärbaum [Edit] Ähnlich sieht es bei den Prozeduren ki und brettanalyse aus. [/Edit] There are exactly 10 kinds of people: those who understand binary, and those who don't.
--- "Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek |
Zitat |
Registriert seit: 15. Nov 2004 2.647 Beiträge |
#5
Hi,
bei der procedure KI; ist es ziemlich sinnlos, andauernd
Delphi-Quellcode:
aufzurufen.
if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 and if AktuellesBrett[x+3,y]=1 then //
begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end
Delphi-Quellcode:
Lass dir da noch etwas besseres und kompakteres einfallen.
procedure ki(x, y: Integer);
begin for x:=1 to breite do //Ueberpfrung, ob Computer im n�hsten Zug gewinnen kann for y:=1 to hoehe do //Im Folgenden werden alle m�lichen Zge des Computers und deren Nachbarn betrachtet if AktuellesBrett[x,y]=2 then //Gegenenfalls wird das Viererpaar vollendet und die Prozedur KI beendet if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 and if AktuellesBrett[x+3,y]=1 then // begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-3,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 and if AktuellesBrett[x,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x+3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x-3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x-3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x+3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x-1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x+1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x+1,y+1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x-1,y+1]=1 then Bei der Brettnalyse ebenfalls. |
Zitat |
Registriert seit: 14. Feb 2005 13 Beiträge |
#6
Vielen Dank für eure Hilfe
Ich hab jetzt mal die Fehler von Binärbaum und Wuaegner korrigiert, stoße aber immer noch auf fünf Fehler : (habe die Fehlermeldungen in die entsprechende Programmzeile kopiert, wäre klasse wenn ihr euch das nochmal anschauen könntet)
Code:
program VierGewinnt7;
{$APPTYPE CONSOLE} //Ausgabe auf Konsole uses SysUtils, System; var AktuellesBrett: array[1..7, 1..6] of Integer; var ergebnisliegtvor: Boolean; var gewinner: String; var i, Q, P: Integer; //i=Z�lvariable; Q=Spalte des Spielers; P=Spalte des Computers var spalte1, spalte2, spalte3, spalte4, spalte5, spalte6, spalte7: Integer; //Hier wird gespeichert, wieviele Steine bereits in der jeweiligen Spalte sind const breite=7; hoehe=6; procedure eingangsabfrage; //Unterprogramm zur Abfrage der Eing�ge begin //der Spieler wirft seinen Stein in Spalte Q. (0<Q<8) //zum testen nehmen wir an, der Spieler wirft seinen Stein in Feld 3: Q:=3 end; procedure brettanalyse; var x, y: Integer; begin if i=0 then for x:=1 to breite do for y:=1 to hoehe do AktuellesBrett[x,y]:=0 //Am Anfang des Spiels wird das Array mit Nullen gefllt else if Q=1 then //Wenn Spieler in die erste Spalte wirft.. case spalte1 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 1 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte1:=spalte1+1; if Q=2 then //Wenn Spieler in die zweite Spalte wirft.. case spalte2 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 2 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte2:=spalte2+1; if Q=3 then //Wenn Spieler in die dritte Spalte wirft.. case spalte3 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 3 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte3:=spalte3+1; if Q=4 then //Wenn Spieler in die vierte Spalte wirft.. case spalte4 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 4 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte4:=spalte4+1; if Q=5 then //Wenn Spieler in die fnfte Spalte wirft.. case spalte5 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 5 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte5:=spalte5+1; if Q=6 then //Wenn Spieler in die sechste Spalte wirft.. case spalte6 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 6 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte6:=spalte6+1; if Q=7 then //Wenn Spieler in die siebte Spalte wirft.. case spalte7 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden.. 1: AktuellesBrett[Q,2]:=3; //..und fr den Spieler der Wert '3' ins entsprechende Feld gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 7 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte7:=spalte7+1; end; procedure zuganalyse; var x, y: Integer; begin for x:=1 to breite do for y:=hoehe downto 1 do //umgekehrte Reihenfolge! (von oben nach unten) if AktuellesBrett[x,y]=1 then begin AktuellesBrett[x,y+1]:=2; Break; //Die '2' steht fr einen m�lichen Zg des PC's end else if AktuellesBrett[x,y]=3 then begin AktuellesBrett[x,y+1]:=2; Break; end; end; procedure ki; var x, y: Integer; begin for x:=1 to breite do //�erpfrung, ob Computer im n�hsten Zug gewinnen kann for y:=1 to hoehe do //Im Folgenden werden alle m�lichen Zge des Computers und deren Nachbarn betrachtet if AktuellesBrett[x,y]=2 then //Gegenenfalls wird das Viererpaar vollendet und die Prozedur KI beendet if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 and if AktuellesBrett[x+3,y]=1 then //rosa1 begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-3,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-2,y]=1 and if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y]=1 and if AktuellesBrett[x+1,y]=1 and if AktuellesBrett[x+2,y]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 and if AktuellesBrett[x,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y+2]=1 and if AktuellesBrett[x,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x,y+1]=1 and if AktuellesBrett[x,y-1]=1 and if AktuellesBrett[x,y-2]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x+3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x-3,y+3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x-3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x+3,y-3]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y+1]=1 and if AktuellesBrett[x+2,y+2]=1 and if AktuellesBrett[x-1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y+1]=1 and if AktuellesBrett[x-2,y+2]=1 and if AktuellesBrett[x+1,y-1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x-1,y-1]=1 and if AktuellesBrett[x-2,y-2]=1 and if AktuellesBrett[x+1,y+1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else if AktuellesBrett[x+1,y-1]=1 and if AktuellesBrett[x+2,y-2]=1 and if AktuellesBrett[x-1,y+1]=1 then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else ergebnisliegtvor:=False; //Fehlermeldung: Operator ist auf diesen Operandentyp nicht anwendbar end; //Der Rest der KI ist in Arbeit P:=2; //zum testen wirft der Computer in die zweite Spalte end; procedure ausgeben; begin WriteLn ('Computer wirft in Spalte ',P); end; //Fehlermeldung: Operator ist auf diesen Operandentyp nicht anwendbar begin WriteLn(' Vier Gewinnt '); WriteLn('--------------------'); WriteLn(''); i:=0; //Z�lvariable, damit KI wei� wer am Zug ist ergebnisliegtvor:=False; //Dient zum Beenden des Programms, wenn ein Ergebnis vorliegt repeat eingangsabfrage; brettanalyse; zuganalyse; ki; ausgeben; //Fehlermeldung: Undefinierter Bezeichner: 'ausgeben' i:=i+1 //Hochz�len der Spielzge until ergebnisliegtvor=True; //Solange wiederholen, bis ein Ergebnis vorliegt WriteLn (gewinner + ' hat gewonnen'); //Gewinner ausgeben ReadLn end. //Fehlermeldung: Record, Objekt oder Klassentyp erforderlich //Fehlermeldung: Operator ist auf diesen Operandentyp nicht anwendbar |
Zitat |
Registriert seit: 8. Feb 2004 406 Beiträge Delphi 6 Enterprise |
#7
Hi,
so habe mir mal die Mühe gemacht wenigstens den Syntax zu korrigieren. Jetzt sind Fehlermeldungen weg, aber den Code musst du noch überarbeiten.
Delphi-Quellcode:
program VierGewinnt7;
{$APPTYPE CONSOLE} //Ausgabe auf Konsole uses SysUtils; var AktuellesBrett: array[1..7, 1..6] of Integer; ergebnisliegtvor: Boolean; gewinner: String; i, Q, P: Integer; //i=Z?lvariable; Q=Spalte des Spielers; P=Spalte des Computers spalte1, spalte2, spalte3, spalte4, spalte5, spalte6, spalte7: Integer; //Hier wird gespeichert, wieviele Steine bereits in der jeweiligen Spalte sind const breite=7; hoehe=6; procedure eingangsabfrage; //Unterprogramm zur Abfrage der Eing?ge begin //der Spieler wirft seinen Stein in Spalte Q. (0<Q<8) //zum testen nehmen wir an, der Spieler wirft seinen Stein in Feld 3: Q:=3 end; procedure brettanalyse; var x, y: Integer; begin if i=0 then for x:=1 to breite do for y:=1 to hoehe do AktuellesBrett[x,y]:=0 //Am Anfang des Spiels wird das Array mit Nullen gefllt else if Q=1 then //Wenn Spieler in die erste Spalte wirft.. case spalte1 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 1 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte1:=spalte1+1; if Q=2 then //Wenn Spieler in die zweite Spalte wirft.. case spalte2 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 2 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte2:=spalte2+1; if Q=3 then //Wenn Spieler in die dritte Spalte wirft.. case spalte3 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 3 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte3:=spalte3+1; if Q=4 then //Wenn Spieler in die vierte Spalte wirft.. case spalte4 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 4 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte4:=spalte4+1; if Q=5 then //Wenn Spieler in die fnfte Spalte wirft.. case spalte5 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 5 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte5:=spalte5+1; if Q=6 then //Wenn Spieler in die sechste Spalte wirft.. case spalte6 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden und dementsprechend gesetzt. 1: AktuellesBrett[Q,2]:=3; 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 6 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte6:=spalte6+1; if Q=7 then //Wenn Spieler in die siebte Spalte wirft.. case spalte7 of 0: AktuellesBrett[Q,1]:=3; //..wird berprft, wieviele Steine sich dort befinden.. 1: AktuellesBrett[Q,2]:=3; //..und fr den Spieler der Wert '3' ins entsprechende Feld gesetzt. 2: AktuellesBrett[Q,3]:=3; 3: AktuellesBrett[Q,4]:=3; 4: AktuellesBrett[Q,5]:=3; 5: AktuellesBrett[Q,6]:=3; 6: WriteLn ('Spalte 7 ist leider schon voll. Spielzug wird nicht angerechnet!'); end; spalte7:=spalte7+1; end; procedure zuganalyse; var x, y: Integer; begin for x:=1 to breite do for y:=hoehe downto 1 do //umgekehrte Reihenfolge! (von oben nach unten) if AktuellesBrett[x,y]=1 then begin AktuellesBrett[x,y+1]:=2; Break; //Die '2' steht fr einen m?lichen Zg des PC's end else if AktuellesBrett[x,y]=3 then begin AktuellesBrett[x,y+1]:=2; Break; end; end; procedure ausgeben; begin WriteLn ('Computer wirft in Spalte ',P); end; //Fehler Operator ist auf diesen Operandentyp nicht anwendbar procedure ki; var x, y: Integer; begin for x:=1 to breite do //?erpfrung, ob Computer im n?hsten Zug gewinnen kann for y:=1 to hoehe do //Im Folgenden werden alle m?lichen Zge des Computers und deren Nachbarn betrachtet if AktuellesBrett[x,y]=2 then //Gegenenfalls wird das Viererpaar vollendet und die Prozedur KI beendet if (AktuellesBrett[x+1,y]=1) and (AktuellesBrett[x+2,y]=1) and (AktuellesBrett[x+3,y]=1) then //rosa1 begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y]=1) and (AktuellesBrett[x-2,y]=1) and (AktuellesBrett[x-3,y]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-2,y]=1) and (AktuellesBrett[x-1,y]=1) and (AktuellesBrett[x+1,y]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y]=1) and (AktuellesBrett[x+1,y]=1) and (AktuellesBrett[x+2,y]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x,y+1]=1) and (AktuellesBrett[x,y+2]=1) and (AktuellesBrett[x,y+3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x,y-1]=1) and (AktuellesBrett[x,y-2]=1) and (AktuellesBrett[x,y-3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x,y+1]=1) and (AktuellesBrett[x,y+2]=1) and (AktuellesBrett[x,y-1]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x,y+1]=1) and (AktuellesBrett[x,y-1]=1) and (AktuellesBrett[x,y-2]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x+1,y+1]=1) and (AktuellesBrett[x+2,y+2]=1) and (AktuellesBrett[x+3,y+3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y+1]=1) and (AktuellesBrett[x-2,y+2]=1) and (AktuellesBrett[x-3,y+3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y-1]=1) and (AktuellesBrett[x-2,y-2]=1) and (AktuellesBrett[x-3,y-3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x+1,y-1]=1) and (AktuellesBrett[x+2,y-2]=1) and (AktuellesBrett[x+3,y-3]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x+1,y+1]=1) and (AktuellesBrett[x+2,y+2]=1) and (AktuellesBrett[x-1,y-1]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y+1]=1) and (AktuellesBrett[x-2,y+2]=1) and (AktuellesBrett[x+1,y-1]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x-1,y-1]=1) and (AktuellesBrett[x-2,y-2]=1) and (AktuellesBrett[x+1,y+1]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end; if (AktuellesBrett[x+1,y-1]=1) and (AktuellesBrett[x+2,y-2]=1) and (AktuellesBrett[x-1,y+1]=1) then begin AktuellesBrett[x,y]:=1; P:=x; ergebnisliegtvor:=True; Exit; end else ergebnisliegtvor:=False; //Fehler Operator ist auf diesen Operandentyp nicht anwendbar //Der Rest der KI ist in Arbeit P:=2; //zum testen wirft der Computer in die zweite Spalte WriteLn(' Vier Gewinnt '); WriteLn('--------------------'); WriteLn(''); i:=0; //Z?lvariable, damit KI wei? wer am Zug ist ergebnisliegtvor:=False; //Dient zum Beenden des Programms, wenn ein Ergebnis vorliegt repeat eingangsabfrage; brettanalyse; zuganalyse; ki; ausgeben; //Fehler: Undefinierter Bezeichner: 'ausgeben' i:=i+1 //Hochz?len der Spielzge until ergebnisliegtvor=True; //Solange wiederholen, bis ein Ergebnis vorliegt WriteLn(gewinner + ' hat gewonnen'); //Gewinner ausgeben ReadLn; end; end. |
Zitat |
Registriert seit: 15. Mär 2003 11 Beiträge |
#8
Der Quellcode ließe sich extrem verkürzen:
Delphi-Quellcode:
In der procedure ki gibt es ebenfalls sehr viele Wiederholungen.
Spalten = array[1..7] of Integer;
[...] procedure brettanalyse; var x, y: Integer; begin if i = 0 then for x := 1 to breite do for y := 1 to hoehe do AktuellesBrett[x, y] := 0 else begin if Spalte[Q] < 6 then AktuellesBrett[Q,Spalte[Q]] := 3 else WriteLn('Spalte ', Q, ' ist leider schon voll. Spielzug wird nicht angerechnet!'); Spalten[Q] := Spalten[Q] + 1; end; end; Überarbeite das mal etwas. Wähle sinnvollere Bezeichner für Q und P. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |