Registriert seit: 14. Feb 2005
13 Beiträge
|
Re: Vier Gewinnt Anfängerbeispiel
2. Apr 2005, 11:35
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
|