Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vier Gewinnt Anfängerbeispiel (https://www.delphipraxis.net/43334-vier-gewinnt-anfaengerbeispiel.html)

boozzz 1. Apr 2005 22:24


Vier Gewinnt Anfängerbeispiel
 
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&#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(x, y: Integer);
begin
  for x:=1 to breite do                         //Ueberpfrung, 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   //
        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&#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;
    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.
:coder2:

Wuaegner 1. Apr 2005 22:38

Re: Vier Gewinnt Anfängerbeispiel
 
Du musst auch schreiben was für Fehlermeldungen kommen.
Aber
Delphi-Quellcode:
procedure ausgeben;
WriteLn ('Computer wirft in Spalte ',P);
end;
muss, wenn es eine eigene Procedure sein soll mit "begin" anfangen und mit "end;" aufhören.

Wuaegner 1. Apr 2005 23:09

Re: Vier Gewinnt Anfängerbeispiel
 
Da du keine Fehlermeldungen postest, schreib ich mal die Fehler die ich gefunden habe:

Delphi-Quellcode:
  repeat
    eingangsabfrage;
    brettanalyse;
    zuganalyse;
    ki;
Hier rufst du Prozeduren auf die du jedoch vorher so deklariert hast:

Delphi-Quellcode:
procedure brettanalyse(x, y: Integer);
procedure zuganalyse(x, y: Integer);
procedure ki(x, y: Integer);
Sie erwarten also alle jeweils zwei Parameter vom Typ integer.
Ein korrekter Aufruf müsste dann z.B so aussehen:
Delphi-Quellcode:
repeat
eingangsabfrage;
brettanalyse(2,4);
ki(1,2);
zugangsanalyse(1,3);

Delphi-Quellcode:
WriteLn gewinner + (' hat gewonnen');
Das muss, falls "gewinner" eine Variable vom Typ string ist, so aussehen:
Delphi-Quellcode:
Writeln(gewinner + ' hat gewonnen');
.

Denke jetz sind ein paar Fehler behoben, aber poste einfach deine konkreten Fehlermeldungen, die du nicht lösen kannst dann kann man dir besser helfen.

Binärbaum 2. Apr 2005 00:47

Re: Vier Gewinnt Anfängerbeispiel
 
Die Prozedur
Delphi-Quellcode:
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 für einen möglichen Zug des PC's
      end

      else if AktuellesBrett[x,y]=3 then
      begin
        AktuellesBrett[x,y+1]:=2; Break;
      end;
end;
kommt mir etwas seltsam vor.
Wozu werden Parameter x und y erwartet, wenn sie in den for-Schleifen gleich am Anfang auf 1 bzw. hoehe gestezt werden?
Da wäre es doch sinnvoller, lokale Variablen zu verwenden.

Delphi-Quellcode:
procedure zuganalyse;
var x, y: Integer;
begin
  //hier jetzt der Rest der Prozedur wie oben
  ...
end;
MfG
Binärbaum

[Edit]
Ähnlich sieht es bei den Prozeduren ki und brettanalyse aus.
[/Edit]

Nils_13 2. Apr 2005 09:02

Re: Vier Gewinnt Anfängerbeispiel
 
Hi,

bei der
Delphi-Quellcode:
procedure KI;
ist es ziemlich sinnlos, andauernd
Delphi-Quellcode:
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
aufzurufen.
Delphi-Quellcode:
procedure ki(x, y: Integer);
begin
  for x:=1 to breite do                         //Ueberpfrung, 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   //
        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
Lass dir da noch etwas besseres und kompakteres einfallen.

Bei der Brettnalyse ebenfalls.

boozzz 2. Apr 2005 10:35

Re: Vier Gewinnt Anfängerbeispiel
 
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 :pale: :
(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&#65533;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&#65533;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

Wuaegner 2. Apr 2005 12:13

Re: Vier Gewinnt Anfängerbeispiel
 
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.

Frank Bicking 2. Apr 2005 13:05

Re: Vier Gewinnt Anfängerbeispiel
 
Der Quellcode ließe sich extrem verkürzen:

Delphi-Quellcode:
Spalten = array[1..7] of Integer;

[...]

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
  else
  begin
    if Spalte[Q] < 6 then
      AktuellesBrett[Q,Spalte[Q]] := 3
    else
      WriteLn('Spalte ', Q, ' ist leider schon voll. Spielzug wird nicht angerechnet!');
    Spalten[Q] := Spalten[Q] + 1;
  end;
end;
In der procedure ki gibt es ebenfalls sehr viele Wiederholungen.
Überarbeite das mal etwas. Wähle sinnvollere Bezeichner für Q und P.

boozzz 2. Apr 2005 14:48

Re: Vier Gewinnt Anfängerbeispiel
 
:thumb: Vielen Dank, das hilft mir schon sehr weiter :hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz