Einzelnen Beitrag anzeigen

Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Vier Gewinnt Anfängerbeispiel

  Alt 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.
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat