Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 23:41

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: hexfeld erstellen
BeitragVerfasst: Mi Jan 07, 2009 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
moin! Ich hab eine wichtige Frage.
Und zwar soll ih als Hausarbeit ein 6-eckiges Spielfeld erstellen, bei dem ein Feld alle seine sechs Nachbarn kennt. Das Spielfeld soll beim erstellen nur seine Kantenlänge kennen. Ich bin da schon ne ganze weile am grübeln und hab nach vielen Ansätzen keine Ahnung wie ich das hinbekomme. Pseudo Code wäre ne gute Hilfe, ansonsten hilt auch sonst jede Idee weiter.

Danke schonmal im vorraus!

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 14:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du dir den Wikieintrag dazu schon angeschaut? Hexfeld

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
ja hab ich, das Problem an dem Eintrag ist, das das Feld das dort beshrieben wird immernoch quadratish ist, trotz der 0,5 vershobenen Koordinaten. Das gesamte Spielfeld selbst soll auch in einem Sechseck liegen mit einer überall gleichen Kantenlänge. Dadurch kann ich das Feld schonmal nicht in einem 2d Array erzeugen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 14:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nun ja. Also eine Art 2D Array wirst du so oder so haben müssen. Und da kannst du in einem quadratischen Feld entweder einzelnen Felder als "kein Spielfeld" kennzeichnen (wie auch immer das dann aussehen kann). Oder aber du machst ein Array wo jeder Eintrag wiederrum aus einem Array besteht. Und diese Unterarrays wären dann unterschiedlich groß. So, dass du nur die wirklichen Daten halten müsstest. Bei den Unterarrays könntest du dann noch ein Offset einbauen um diese Spielfeldreihe zu verschieben. Dass jede ungerade Zeile im Vergleich zur geraden Zeile um 0.5 verschoben ist ist sowieso klar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Lossy hats schon angedeutet. In "Phase 2" mach ich das auch ähnlich, dort ist das Hexspielfeld rund und nicht mehr quadratisch, aber trotzdem in einem 2D-Array abgelegt. Hier hat jedes Hexfeld halt noch die Eigenschaft "valid", die auf False gesetzt wird wenn dieses ausserhalb der angepeilten Form liegt (also der kreisrunden Spielfläche). Das Feld wird dann einfach beim Rendern und der Spiellogik ignoriert.
Die Form des Spielfeldes spielt dann also eigentlich keine Rolle, beim Erstellen iteriert man halt über das komplette 2D-Array und schaut ob das Hexfeld noch in der gewünschten Form (in deinem Falle dann ein Hexagon) liegt oder nicht, und setzt dann obiges Flag.
Alternativ kann man das auch über den Stencilpuffer machen und so ausmarkieren, allerdings sollte man dies dann auch bei der Spiellogik (sprich Selektion, egal wie man die regelt) berücksichtigten.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 17:01 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab erst versucht das ganze in Worten zu formulieren, aber das wäre noch aufwendiger gewesen.

Code:
  1.  
  2. type TRichtung = (Obenlinks,obenrechts,rechts,links,untenlinks,untenrechts);
  3. type TIrgendwas = record
  4.      end;
  5. type TFeld = record
  6.       Valid:Boolean;
  7.       erstellt:Word;
  8.       Data:TIrgendwas;
  9.      end;
  10. type THexfeld = class
  11.      protected
  12.       Feld:Array of Array of TFeld;
  13.       groesse:Word;
  14.      public
  15.       constructor Create(Kantenlaenge:Word);
  16.       function Nachbar(Feldpos:TPoint;Richtung:TRichtung):TPoint;
  17.       function GetData(Feldpos:TPoint):TIrgendwas;
  18.       procedure SetData(Feldpos:TPoint;Data:TIrgendwas);
  19.       function GetMiddlePos:TPoint;
  20.       function IsValid(Feldpos:TPoint):Boolean;
  21.       property Feldgroesse:Word read groesse;
  22.      end;
  23.  
  24.  
  25. function THexFeld.GetData(Feldpos:TPoint):TIrgendwas;
  26. begin
  27.   Result:=Feld[Feldpos.X,Feldpos.Y].Data;
  28. end;
  29.  
  30. procedure THexfeld.SetData(Feldpos:TPoint;Data:TIrgendwas);
  31. begin
  32.   if IsValid(Feldpos) then
  33.     Feld[Feldpos.X,Feldpos.Y].Data:=Data;
  34. end;
  35.  
  36. function THexfeld.IsValid(Feldpos:TPoint):Boolean;
  37. begin
  38.   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));
  39. end;
  40.  
  41. function THexfeld.Nachbar(Feldpos:TPoint;Richtung:TRichtung):TPoint;
  42. begin
  43.   case Richtung of
  44.   obenlinks:Result:=Point(Feldpos.x,Feldpos.y-1);
  45.   obenrechts:Result:=Point(Feldpos.x+1,Feldpos.y-1);
  46.   links:Result:=Point(Feldpos.x-1,Feldpos.y);
  47.   rechts:Result:=Point(Feldpos.x+1,Feldpos.y);
  48.   untenlinks:Result:=Point(Feldpos.x,Feldpos.y+1);
  49.   untenrechts:Result:=Point(Feldpos.x+1,Feldpos.y+1);
  50.   end;
  51. end;
  52.  
  53. constructor THexFeld.Create(Kantenlaenge:Word);
  54. var i,j,l,m:Integer;
  55.     Position:TPoint;
  56. begin
  57.   inherited Create;
  58.   groesse:=Kantenlaenge*2-1;
  59.   if Kantenlaenge>0 then
  60.   begin
  61.     setlength(Feld,Kantenlaenge*2-1,Kantenlaenge*2-1);
  62.     //erstes Feld setzen
  63.     Feld[Kantenlaenge-1,Kantenlaenge-1].Valid:=true;
  64.     Feld[Kantenlaenge-1,Kantenlaenge-1].erstellt:=1;
  65.   end;
  66.   for l:=2 to Kantenlaenge do
  67.     for i:=0 to groesse-1 do
  68.       for j:=0 to groesse-1 do
  69.         if (Feld[i,j].Valid) and (Feld[i,j].Erstellt=l-1) then
  70.           for m:=0 to 5 do
  71.           begin
  72.             position:=Nachbar(Point(i,j),TRichtung(m));
  73.             if not((position.X<0) or (position.X>groesse-1) or (position.Y<0) or (position.Y>groesse-1)) then
  74.               if Feld[position.x,position.Y].Valid=false then
  75.               begin
  76.                 Feld[position.x,position.Y].Valid:=true;
  77.                 Feld[position.x,position.Y].erstellt:=l;
  78.               end;
  79.           end;
  80.  
  81. end;
  82.  
  83. function THexfeld.GetMiddlePos:TPoint;
  84. begin
  85.   Result:=Point(groesse div 2,groesse div 2);
  86. end;
  87.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ich würde glaub ich mich vom 2D-Array entfernen und eine Klasse "THexField" erstellen die 6 Pointer auf die benachbarten Felder besitzt.
So kannst du jedem HexFeld eine position zum zeichnen geben und weißt auch welche Felder wie verbunden sind.

Dadurch kannst du dann jede erdenkliche form schaffen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:18 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Aya hat geschrieben:
Ich würde glaub ich mich vom 2D-Array entfernen und eine Klasse "THexField" erstellen die 6 Pointer auf die benachbarten Felder besitzt.
So kannst du jedem HexFeld eine position zum zeichnen geben und weißt auch welche Felder wie verbunden sind.

Dadurch kannst du dann jede erdenkliche form schaffen :)


Ja, das 2D-Array kann man dann darin überführen, aber wenn man das Zeichnen will wäre es dann bischen unpraktisch oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Schläfer hat geschrieben:
Ja, das 2D-Array kann man dann darin überführen, aber wenn man das Zeichnen will wäre es dann bischen unpraktisch oder?

Wieso? Was wäre daran unpraktisch?
Alle HexFelder würde ich natürlich noch in nem normalen 1D-Array speichern, dann geht man einfach den Array durch und ruft von jedem HexFeld die Draw-Funktion auf.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:51 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Aya hat geschrieben:
Alle HexFelder würde ich natürlich noch in nem normalen 1D-Array speichern, dann geht man einfach den Array durch und ruft von jedem HexFeld die Draw-Funktion auf.


Hm, stimmt. Aber für direkte Zugriffe muss man dann die ganze Liste durchsuchen. Man kann die natürlich sortieren oder gleich eine Abbildung vom zweidimensionalen auf das Array machen.
Naja, muss man dann sehen, machen kann man sicher viel, aber ob der Aufwand bei einer Hausarbeit gerechtfertigt ist...^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Danke ür die Antworten!

Ich habs eben über ein 2d-Array versucht, so wie ihr das vorgeschlagen habt mit dem prüfen auf "valid", allerdings geht
dabei ne ganze Menge Speicher verloren. Die Formel ür den verschwendeten Platz ist (n-1)*n, wobei n die Kantenlänge ist.
bei kleinen Spielfeldern ist das nicht so wild, bei Feldern mit der Kantenlänge 128 hingegen sind das schon 16256 ungenutzte
Felder.
Ich habe mich deshalb entschlossen, alles in ein 1d-Array zu schmeißen und ne Formel für die gesamt Anzahl der benötigten
Felder ausgemacht. Das hat den Vorteil, dass bekannte such-algorithmen ohne weiteres darau angewendet werden können.
Die Koordinaten werden unmittelbar nach anlegen des Arrays errechnet und auf die Felder verteilt. Dazu sind lediglich 2
Schleifen nötig, bei der die Eine ständig ihre Start- und Endwerte aktualisiert bis alle Felder ihre Koordinaten haben.
Jetzt mus ich nur noch eine Funktion schreiben, um die benachbarten Felder zu finden, was ja anhand der such-algos kaum
aufwendig sein sollte.

Die Lösung in Code-Form möchte ich hier noch nicht posten, da es sich hierbei wie gesagt um eine Hausarbeit fürs Studium handelt
und ich unteranderem zunächst die Richtigkeit/Nutzbarkeit des Codes "professionell" bewerten lassen will. Ansonsten bin ich gerne
offen mein Wissen preiszugeben. Vorraussichtlich wird die Bewertung mitte Februar stattfinden.

danke noch einmal für die Denkanstöße!

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 19:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Um meinen Senf noch dazu zu geben:
Ich hätte in Java die Hexfelder ebenfalls als Klasse wie Aya angelegt, diese in einen Vector (kann beliebig viele aufnehmen) abgelegt, und eine Hashtable als Index angelegt. Als Indexschlüssel hätte ich die Position auf dem 2D Hexfeld, wie es Sascha benutzt, genommen. So kann ich sehr schnell auf ein beliebiges Feld zugreifen (Hashtable) und habe trotzdem nur den Speicher genutzt, den die Felder belegen (Vector).

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 07, 2009 21:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Der Vorteil für mich ist, dass ich keine besondere Interaktion programmieren muss, da das Feld nur in der Lage sein soll Zustände zu prüfen.
Das Zeichnen des Spielfeldes ist ebenfalls nicht nötig. Das einzige was ich brauche ist die Möglichkeit Felder als besetzt/unbesetzt zu markieren.
Dass ich jedem Feld eine Koordinate gebe, als würden sie in einem 2d Array liegen, hat nur den Grund, dass ich auf diese weiße die Nachbarn
schnell errechnen kann. Die Nachbarn werden natürlich auch in jedem Feld als Pointer gemerkt.
Weitere Bestandteile eines Feldes sind zwei Booleans, einmal "besetzt" und einmal "besucht". "besetzt" gibt halt nur an ob das Feld noch frei ist
oder nicht und "besucht" ist immer false, es sei denn während einer Suche wurde das Feld schon geprüft. So verhinder ich, das bereits geprüfte
Felder nocheinmal geprüft werden.
Das Spielfeld soll außerdem in der Lage sein zu erkennen welche Felder zu einem Gebiet gehören, also unbesetzte Felder die zusammenhängend
sind und von Kartenrand oder besetzten Feldern umzogen sind.
Das wahnsinnige ist, dass nur der Quellode abgegeben werden soll, keine lauffähige exe. Dazu eine Dokumentation über die Beweise der Funk-
tionalität und Zeitkomplexität der genutzten Algorithmen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 14 Queries | GZIP : On ]