Registriert seit: 14. Feb 2005
13 Beiträge
|
Vier Gewinnt Anfängerbeispiel
1. Apr 2005, 23:24
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.
|