- type TRichtung = (Obenlinks,obenrechts,rechts,links,untenlinks,untenrechts);
- type TIrgendwas = record
- end;
- type TFeld = record
- Valid:Boolean;
- erstellt:Word;
- Data:TIrgendwas;
- end;
- type THexfeld = class
- protected
- Feld:Array of Array of TFeld;
- groesse:Word;
- public
- constructor Create(Kantenlaenge:Word);
- function Nachbar(Feldpos:TPoint;Richtung:TRichtung):TPoint;
- function GetData(Feldpos:TPoint):TIrgendwas;
- procedure SetData(Feldpos:TPoint;Data:TIrgendwas);
- function GetMiddlePos:TPoint;
- function IsValid(Feldpos:TPoint):Boolean;
- property Feldgroesse:Word read groesse;
- end;
- function THexFeld.GetData(Feldpos:TPoint):TIrgendwas;
- begin
- Result:=Feld[Feldpos.X,Feldpos.Y].Data;
- end;
- procedure THexfeld.SetData(Feldpos:TPoint;Data:TIrgendwas);
- begin
- if IsValid(Feldpos) then
- Feld[Feldpos.X,Feldpos.Y].Data:=Data;
- end;
- function THexfeld.IsValid(Feldpos:TPoint):Boolean;
- begin
- Result:=not((Feldpos.X<0) or (Feldpos.X>groesse-1) or (Feldpos.Y<0) or (Feldpos.Y>groesse-1) or (Feld[Feldpos.X,Feldpos.Y].Valid=false));
- end;
- function THexfeld.Nachbar(Feldpos:TPoint;Richtung:TRichtung):TPoint;
- begin
- case Richtung of
- obenlinks:Result:=Point(Feldpos.x,Feldpos.y-1);
- obenrechts:Result:=Point(Feldpos.x+1,Feldpos.y-1);
- links:Result:=Point(Feldpos.x-1,Feldpos.y);
- rechts:Result:=Point(Feldpos.x+1,Feldpos.y);
- untenlinks:Result:=Point(Feldpos.x,Feldpos.y+1);
- untenrechts:Result:=Point(Feldpos.x+1,Feldpos.y+1);
- end;
- end;
- constructor THexFeld.Create(Kantenlaenge:Word);
- var i,j,l,m:Integer;
- Position:TPoint;
- begin
- inherited Create;
- groesse:=Kantenlaenge*2-1;
- if Kantenlaenge>0 then
- begin
- setlength(Feld,Kantenlaenge*2-1,Kantenlaenge*2-1);
- //erstes Feld setzen
- Feld[Kantenlaenge-1,Kantenlaenge-1].Valid:=true;
- Feld[Kantenlaenge-1,Kantenlaenge-1].erstellt:=1;
- end;
- for l:=2 to Kantenlaenge do
- for i:=0 to groesse-1 do
- for j:=0 to groesse-1 do
- if (Feld[i,j].Valid) and (Feld[i,j].Erstellt=l-1) then
- for m:=0 to 5 do
- begin
- position:=Nachbar(Point(i,j),TRichtung(m));
- if not((position.X<0) or (position.X>groesse-1) or (position.Y<0) or (position.Y>groesse-1)) then
- if Feld[position.x,position.Y].Valid=false then
- begin
- Feld[position.x,position.Y].Valid:=true;
- Feld[position.x,position.Y].erstellt:=l;
- end;
- end;
- end;
- function THexfeld.GetMiddlePos:TPoint;
- begin
- Result:=Point(groesse div 2,groesse div 2);
- end;