Registriert seit: 8. Feb 2004
406 Beiträge
Delphi 6 Enterprise
|
Re: Vier Gewinnt Anfängerbeispiel
2. Apr 2005, 13:13
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.
|