Einzelnen Beitrag anzeigen

boozzz

Registriert seit: 14. Feb 2005
13 Beiträge
 
#6

Re: Vier Gewinnt Anfängerbeispiel

  Alt 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&#65533;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                         //&#65533;erpfrung, ob Computer im n&#65533;hsten Zug gewinnen kann
    for y:=1 to hoehe do                        //Im Folgenden werden alle m&#65533;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&#65533;lvariable, damit KI wei&#65533; 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&#65533;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
  Mit Zitat antworten Zitat