x=? / y=? Grid Koordinatensystem


Blobb

Mitglied
Hallo!

Momentan verfolgt mich ein kleines Problem.
Ich benötigte eine Karte die über x und y Koordinaten aufgeteilt ist.

1.1|1.2|1.3|1.4|1.5
2.1|2.2|2.3|2.4|2.5

usw...

In jeder Zelle wird ein kleines Bild angezeigt welches mit einem Link versehen sein sollte um so auf eine weitere Seite zu gelangen die mit unterschiedlichem Inhalt verbunden ist.

Leider steh ich wie gesagt momentan auf dem Schlauch.
Vorallem habe ich großes Kopfzerbrechen bei der vergabe der Zellen.

Daher meine bitte an diejenigen die vielleicht eine Lösung für mich haben.

Wie muß ich es anstellen das keine Zelle doppelt in der Datenbank vorkommt?
Wie erstelle ich solch eine Gridkarte?

Bzw. gibt es irgendwo bereits Beispiele welche verständlich sind?
Habe die Suchfunktion genutzt aber ohne Erfolg.
Google hilft mir auch nicht viel weiter ... vielleicht such ich auch nur nach den falschen Begriffen?
 

Mirko D

Erfahrenes Mitglied
Also das keine Zeile doppelt in der DB vorkommt ist eigentlich relativ einfach. Wenn du die Daten über eine Eingabemaske einfügst, was ich denke das du es so machst. Lässt du beim Eintragen in die Datenbank einfach überprüfen ob es den Wert schon gibt.

PHP:
$sql="SELECT * FROM tabelle WHERE Feld.Name='$Masken.Wert'";
$query=mysql_query($sql);

if (mysql_num_rows($query)!=0) { 
echo  "Der Datensatz existiert schon!" } 
                   else { 
                                // Restlichen PHP Anweisungen; }

Damit hast Du dann schon einmal die Überprüfung ob ein Datensatz schon exisitiert oder nicht. Wie das mit der Karte von sich gehen kann / soll, weiß ich leider nicht. Aber da wird dir mit Sicherheit doch noch einer helfen können.

Gruß Mirko
 

Tim C.

Erfahrenes Mitglied
Wo liegt denn dein Problem? Weisst du nicht, wie du die Datenbank layouten sollst? Wenn du schon ein Datenbank Layout hast, dann teile uns doch mit wie das aussieht. Oder hast du im Prinzip überhaupt keine Ahnung von irgendwelchen PHP Grundlagen und fragst deshalb so etwas konfus.
Verzeih bitte die provokante Frage, sollte das nicht so sein, nehme ich es sofort zurück, aber hier erlebt man so einiges. :rolleyes:

Tim
 

Blobb

Mitglied
Manchmal ist es schwer seine Fragen in Worte zu fassen.
Erstrecht um Mitternacht :p

Also zum Ablauf...

Der User registriert sich...bekommt seine Zugangsadten zugeschickt.
Somit wird die eMail auf Richtigkeit überprüft....ist klar.

Nun loggt sich der User ein...beim einloggen wird ein Patcher gestartet.

So, hier nun wird auf die Datenbank des User zugegriffen.
Sobald neue Datenbankstrukturen vorhanden sind werden diese mit seinen Daten gefüllt. Oder entsprechende werden nach einer geraumen Zeit wieder gelöscht, so fern sie ungenutzt sind. So halte ich mir die Datenbank klein ohne viel Aufwand zu betreiben.

Aber zum Koordinatensystem...
Besitzt er noch keinen entsprechenden Eintrag im Koordinatensystem müßte dieser Eintrag mit einem ORDER BY RAND gesetzt weden.
z.b.: kennt man es ja von vielen Browsergames.
Der User bekommt ein entsprechendes freies Land zugewiesen.

Das war dann auch meine erste Frage.
Wie das in etwa aussehen müßte bis die Abfrage greift und eine noch nicht vorhandene Zelle beschreibt?

Man sollte dazu sagen.
Die Tabelle besteht aus : id | uid | x_pos | y_pos
Mit 50 Einträgen (also 250 möglichen Positionen)
Eine unbenutzte Zelle hat immer den Wert x_pos = 0 | y_pos = 0

Erste Frage:
Ist diese Denkweise richtig?
Befinde ich mich auf dem richtigen Weg? :)

weiter...Die Anweisung müßte doch dann etwa so lauten?
PHP:
$sql = "SELECT * FROM tabelle WHERE x_pos = 0 AND y_pos = 0 ORDER BY RAND LIMIT 1";
Nun habe ich eine zufällige Zelle ohne Eintrag...
Könnte diese nun mit einer von 50 Positionen füllen.

Das wäre aber dann meine nächste Frage.
Vorher müßte ich aber wissen welche Position noch frei ist.
z.B.: ergeht daraus ja nicht ob jemand schon bei x_pos mit dem Wert von 12 eine Position gesetzt wurde.
Wie kontrolliere ich das?

Meine letzte Frage wäre dann noch wie ich das Ganze ausgeben muß um es in eine Tabelle zu bekommen die eben 50 x_pos und 50 y_pos hat?

Hmm, hoffe ich hab das jetzt nicht noch verwirrender dargestellt als es ist.
Kennt ihr das wenn ihr nach stundelangen überlegen und rumbasteln an Scripten ein Loch im Kopf habt und nichts ordentliches mehr zustande kommt? :)
 

Sven Petruschke

Erfahrenes Mitglied
Ich würde nur die Zellen in der Datenbank speichern, die auch belegt sind, sprich, die auch Koordinaten zugewiesen bekommen haben. Dann ermittelst Du über [phpf]rand[/phpf] einen neuen Punkt auf der Karte und überprüfst, ob dieser bereits in der Datenbank ist. Wenn ja, dann solange versuchen, bis Du einen unbenutzten punkt gefunden hast, ansonsten fügst Du den neuen Punkt hinzu.
 

Blobb

Mitglied
Das mach ich doch...
Er soll nur nur dort eine Position speichern wo x & y = 0 ist.
Denn nur wo 0 ist ist auch freier Platz.

Mir wäre allerdings geholfen wenn du deinen Vorschlag mit dem "durchlaufen bis Position gefunden wurde welche noch nicht belegt ist" auch für mich verständlich im PHP Code darstellen würdest.
Das ist ja genau das wo ich scheitere ... ich suche ja einen Ansatz bzw eine Hilfestellung, damit ich verstehen kann wie das auszusehen hat.
Bzw. wollen irgendwann auch andere Hilfesuchende mit dem gleichen Problem eine Grundidee vorfinden wie sie dies zu verarbeiten haben ohnewieder einen weiteren Beitrag schreiben zu müssen. ;)
 

Sven Petruschke

Erfahrenes Mitglied
Mir fällt soeben noch etwas anderes ein: Du könntest alle Positionen in der Tabelle vorgeben - also alle Punkte der möglichen Kombinationen aus X- und Y-Koordinate. Die Punkte, die bereits vergeben sind, haben eine UID, die freien Punkte haben als UID einen "NULL-Wert".

Wenn Du nun zufällig einen freien Punkt auswählen möchtest, dann holst Du alle alle Datensätze, deren UID NULL ist. Du prüfst, wie viele Datensätze zurückgegeben wurden und wählst aus diesen mit der Funktion [phpf]rand[/phpf] einen zufälligen Datensatz aus und ermittest dessen ID. Danach sendest Du eine UPDATE-Anweisung an die Datenbank, die eine gültige UID in den zufällig Datensatz schreibt.
 

Blobb

Mitglied
Aiks, das ist es! Sehr gut! :)
So ist es natürlich noch einfacher herauszufinden welche Position bereits belegt ist.
Danke!

Genau das ist es was ich meine .. manchmal ist die Lösung so einfach aber durch stundenlangen Bildschirmklotzen wird die Lösung zum Problem immer verschwommener.

Ok , allerdings noch eine bitte.
Ich habe nun x_pos und y_pos ... mit je 50 Position.
Also 50 x und 50 y

Wie kann ich mir das ausgeben lassen damit ich am Ende eine Tabelle habe die 50 Zellen höhe und 50 Zellen weite besitzt?
 

Sven Petruschke

Erfahrenes Mitglied
Du holst Dir alle Daten aus der Datenbank und sortierst dabei erst nach der X-Koordinate und dann nach der Y-Koordinate (ORDER BY xpos, ypos). Danach durchläufst Du alle Datensätze und merkst Dir dabei immer den letzten X-Wert. Sollte sich der X-Wert ändern, so weisst Du, dass Du die Alte HTML-Tabellen-Zeile abschließen muss und eine neue HTML-Tabellen-Zeile beginnen musst (Bei der ersten Änderung darauf achten, dass nur ein Zeilenbeginn erfolgt).

snuu
 
@snuu: Zuerst nach der Y- und dann nach der X-Koordinate wäre besser :) Normalerweise wird ja die Rechtswertachse mit x bezeichnet und die Hochwertachse mit y.

// edit: Ach ja, falls die Frage noch steht, wie man verhindern kann, dass ein Feld doppelt in der Tabelle auftritt:
Einfach die beiden Koordinatenfelder zusammen auf UNIQUE setzen:
Code:
ALTER TABLE tabelle ADD UNIQUE koords ( x_pos , y_pos )
 
Zuletzt bearbeitet:

Blobb

Mitglied
Also ... für alle die es interessiert .. ich hab das jetzt so gemacht:

Tabelle:

id | uid | x_pos | y_pos

id = AUTO_INC
uid = UNIQUE / NULL

Tabelle füllen:

PHP:
$max = '5';
$x = $max;

for ($x = 1; $x <= $max; $x++)
	{ mysql_query("INSERT INTO tabelle(x_pos,y_pos,karte) values('$x','1','1')"); } flush();
for ($x = 1; $x <= $max; $x++)
	{ mysql_query("INSERT INTO tabelle(x_pos,y_pos,karte) values('$x','2','1')"); } flush();
for ($x = 1; $x <= $max; $x++)
	{ mysql_query("INSERT INTO tabelle(x_pos,y_pos,karte) values('$x','3','1')"); } flush();
for ($x = 1; $x <= $max; $x++)
	{ mysql_query("INSERT INTO tabelle(x_pos,y_pos,karte) values('$x','4','1')"); } flush();
for ($x = 1; $x <= $max; $x++)
	{ mysql_query("INSERT INTO tabelle(x_pos,y_pos,karte) values('$x','5','1')"); } flush();

usw...

Sicherlich kann man das bestimmt einfacher schreiben.
Aber für mich war das so verständlicher ;)

Nun hab ich aber das Problem.
Wie gebe ich die Werte wieder aus?
So das eine anschauliche Tabelle entsteht?

Ein Beispiel anhand von Code Schnippsel wäre nett.
Das versteh ich dann eventuell auch eher als eine schriftliche Beschreibung ;)

Vielen Dank...
 

Blobb

Mitglied
Ok so bekomm ich die liste:

PHP:
   $y = 15;
   $x = 15;
   
   print '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="0">';

   for($y = 1; $y <= 15; $y++)
		{
			print '<tr>';

			for($x = 1; $x <= 15; $x++)
			{	
				print "<td>";
				print '<img src="images/xxx.gif">';
				print '</td>';		
			}
			print '</tr>'; 
		}
		print '</table>';

so langsam komm ich der Sache näher...

wie füll ich jetzt die tabellenzeilen mit der uid des jeweiligen users? :)
 

Blobb

Mitglied
So das müßte es gewesen sein...

PHP:
   $y = 15;
   $x = 15;
   $max = 15;
   
   print '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';

   for($y = 1; $y <= $max; $y++)
		{
			print '<tr>';

			for($x = 1; $x <= $max; $x++)
			{	
 	 			   $uid = "SELECT * FROM tabelle WHERE x_pos='$x' AND y_pos='$y'";
               	   $erg = mysql_query($uid);
               	   while($row = mysql_fetch_object($erg))
               	   {
					print "<td>";
					echo "uid: $row->uid";
					print '<img src="images/xxxx.gif">';
					print '</td>';
					}

			}
			print '</tr>'; 
		}
		print '</table>';


Aber eine Frage noch an unsere Experten.
Wie kann ich meinen Code optimieren?
Also vom ersten Script posting bis zum letzten hier.
Würde mich freuen wenn jemand einige Vorschläge hat.
Man lernt ja nie aus...

In diesem Sinne .. vielen dank an meinen Ideenspender snuu ;)
 
Zuletzt bearbeitet:

Forum-Statistiken

Themen
272.358
Beiträge
1.558.620
Mitglieder
187.832
Neuestes Mitglied
SirrDansen