MySql Tabelle mit verschiedenen Daten füllen

Ich steh grad irgendwie auf dem Schlauch. Ich will für eine Karte Werte in eine Datenbank eintragen. Die Datenbank sieht folgendermaßen aus:

SQL:
CREATE TABLE `map` (
  `x1` int(4) NOT NULL default '0',
  `y1` int(4) NOT NULL default '0',
  `status` int(1) NOT NULL default '0'
)

Was in die x und y Spalten kommt wird denke ich mal klar sein. Die zu befüllen ist auch nicht das Problem. Das Problem ist die Spalte status.

Dort sollten Zahlen zwischen 1 und 6 rein. Die Zahlen 2, 4 und 6 können erstmal außen vor bleiben, die brauche ich erst später wenn was an der Karte verändert wird. Dann werden die auch nur einzeln eingefügt.

Die Karte soll ungefähr so aussehen:

111111111355555555531111111111
111111113555555555311111111111
111111135555555553111111111111
111111135555555553111111111111
111111355555555555311111111111
111111135555555555531111111111
111111355555555555553111111111
111113555555555555311111111111

Ich hab die einzelnen Werte mal farbig gemacht damit man eher sieht wie ich es meine.

Die Werte 1 und 3 sollen ungefähr 50% der Karte haben und der Wert 5 soll auch ungefähr 50% der Karte verbrauchen. Der Wert 3 soll nur zwischen Wert 1 und Wert 5 vorkommen, sozusagen als Übergang.

Außerdem muss der Wert 3 vertikal(y-Achse) immer ungefähr auf selber Höhe sein. Er darf horizontal(x-Achse) nur +-1 Abweichen und das zufällig, er kann auch mal gleich sein.

Ich würd es ja von Hand in die DB eintragen nur bei etwas über 10.000 Werten hab ich keine Lust das alles von Hand einzutragen.

Hab absolut keine Idee zur Umsetzung, hoffe mal einem von euch fällt etwas ein und dass ich es richtig erklärt habe. Google und die Forensuche haben keine passenden Ergebnisse geliefert.

Wenn noch Fragen offen sind oder etwas unklar ist dann versuch ich das natürlich zu erklären.

Mfg Patrick
 
Zuletzt bearbeitet von einem Moderator:
Mich hat es gereizt das mal umzusetzen, da muss man schon bisschen grübeln, wie man das am dümmsten macht.

Ist sicher nicht die sauberste Variante, aber es kommt zumindest etwas deinem Beispiel ähnlichem heraus. ;)
Optimieren kann man es noch immer, aber ich habe mein Ziel erstmal erreicht und bevor du etwas anderes willst, soll es erstmal so bleiben.

PHP:
<?php
function foo( ) {
	// wie breit der spass werden soll
	$horizontal_elements = 100;
	// wieviele zeilen berechnet werden sollen
	$vertical_elements = 1000;
	// minimale breite des blauen bereiches
	$z_min = 4; 
	// maximale breite
	$z_max = 20;
	// zufallswert ermitteln zwischen dem drittel und der haelfte von $horizontal_elements ermitteln,
	// gibt die position des ersten braunen wertes in der ersten zeile an
	$x = rand( ceil( $horizontal_elements / 3 ), ceil( $horizontal_elements / 2 ) );
	$result = array();
	// zufallsbreite des blauen bereiches innerhalb der angegeben min-/max-werte
	$z = rand( $z_min, $z_max );

	for( $i = 0; $i < $vertical_elements; $i++ ) {
		if ( $i > 0 ) {
			// $x minus oder plus 1 rechnen, ausgehend von der vorherigen zeile
			$x_move = rand( 0, 2 );
			$x = ( $x_move == 0 ? $x-1 : ( $x_move == 1 ? $x+1 : $x ) );
			
			// das selbe fuer $z
			$z_move = rand( 0, 2 );
			$z = ( $z_move == 0 ? $z-1 : ( $z_move == 1 ? $z+1 : $z ) );
			
			// und nochmal pruefen, ob es sich noch innerhalb der min-/max-werte befindet
			if ( $z <= $z_min ) $z = $z_min;
			elseif ( $z >= $z_max ) $z = $z_max;
		}
		for( $j = 0; $j < $horizontal_elements; $j++ ) {
			$result[$i][$j] = bar( $result, $i, $j, $x, $z );
			// damit man auch was sieht ;-)
			switch( $result[$i][$j] ) {
				case 0: echo '<font color="green">0</font>'; break;
				case 1: echo '<font color="brown">3</font>'; break;
				case 2: echo '<font color="blue">5</font>'; break;
			}
			;
		}
		echo '<br/>';
		// mal wieder bisschen speicher frei machen...
		unset( $result[$i-1] );
	}
}

function bar( $result, $i, $j, $x, $z ) {
	if ( $j < $x ) {
		if ( $j == 0 ) return 0;
		else return $result[$i][$j-1];
	}
	elseif ( $j == $x || $j == ( $x + $z +1 ) ) {
		return 1;
	}
	elseif ( $j > $x && $j < ( $x + $z + 1 ) ) {
		return 2;
	}
	else return 0;
}
foo();
?>
Meinst du es so in der Art?
 
Danke dir. Funktioniert genau wie ich es mir gedacht habe.

Muss es an einigen Ecken zwar noch modifizieren, da es ja etwas in die Datenbank eintragen soll aber das ist ja nicht das Problem.

Mfg Patrick
 
Mich hat es gereizt das mal umzusetzen, da muss man schon bisschen grübeln, wie man das am dümmsten macht.

Ist sicher nicht die sauberste Variante, aber es kommt zumindest etwas deinem Beispiel ähnlichem heraus. ;)
Optimieren kann man es noch immer, aber ich habe mein Ziel erstmal erreicht und bevor du etwas anderes willst, soll es erstmal so bleiben.

PHP:
<?php
function foo( ) {
	// wie breit der spass werden soll
	$horizontal_elements = 100;
	// wieviele zeilen berechnet werden sollen
	$vertical_elements = 1000;
	// minimale breite des blauen bereiches
	$z_min = 4; 
	// maximale breite
	$z_max = 20;
	// zufallswert ermitteln zwischen dem drittel und der haelfte von $horizontal_elements ermitteln,
	// gibt die position des ersten braunen wertes in der ersten zeile an
	$x = rand( ceil( $horizontal_elements / 3 ), ceil( $horizontal_elements / 2 ) );
	$result = array();
	// zufallsbreite des blauen bereiches innerhalb der angegeben min-/max-werte
	$z = rand( $z_min, $z_max );

	for( $i = 0; $i < $vertical_elements; $i++ ) {
		if ( $i > 0 ) {
			// $x minus oder plus 1 rechnen, ausgehend von der vorherigen zeile
			$x_move = rand( 0, 2 );
			$x = ( $x_move == 0 ? $x-1 : ( $x_move == 1 ? $x+1 : $x ) );
			
			// das selbe fuer $z
			$z_move = rand( 0, 2 );
			$z = ( $z_move == 0 ? $z-1 : ( $z_move == 1 ? $z+1 : $z ) );
			
			// und nochmal pruefen, ob es sich noch innerhalb der min-/max-werte befindet
			if ( $z <= $z_min ) $z = $z_min;
			elseif ( $z >= $z_max ) $z = $z_max;
		}
		for( $j = 0; $j < $horizontal_elements; $j++ ) {
			$result[$i][$j] = bar( $result, $i, $j, $x, $z );
			// damit man auch was sieht ;-)
			switch( $result[$i][$j] ) {
				case 0: echo '<font color="green">0</font>'; break;
				case 1: echo '<font color="brown">3</font>'; break;
				case 2: echo '<font color="blue">5</font>'; break;
			}
			;
		}
		echo '<br/>';
		// mal wieder bisschen speicher frei machen...
		unset( $result[$i-1] );
	}
}

function bar( $result, $i, $j, $x, $z ) {
	if ( $j < $x ) {
		if ( $j == 0 ) return 0;
		else return $result[$i][$j-1];
	}
	elseif ( $j == $x || $j == ( $x + $z +1 ) ) {
		return 1;
	}
	elseif ( $j > $x && $j < ( $x + $z + 1 ) ) {
		return 2;
	}
	else return 0;
}
foo();
?>
Meinst du es so in der Art?

nicht schlecht:eek:
 
Na dann hat es sich ja gelohnt. :)
Ich hatte gestern das Gefühl, dass der blaue Bereich etwas Linkslastig ist. Ist das bei dir auch so oder waren meine Zufallswerte einfach zufällig so komisch?

Das sieht nur so verwirrend aus, weil man pro Zeile alle Möglichen Werte aufs Neue überprüfen muss, eigentlich ist es ganz logisch. ;)
 
Bei mir war es nicht linkslastig. Hat immer schön die Seiten gewechselt. Mal war es rechts mehr dann mal wieder links. Nur an manchen Stellen war der Blaue Bereich bischen zu schmal. Hab da dann einfach die minimale und maximale Breite abgeändert. Aber ansonsten läuft alles so wie ich es mir vorgestellt hatte.

Ich kam nur noch nicht dazu es umzubauen das es die Werte in die Datenbank einträgt. Hatte einfach zu wenig Zeit.
 
Zurück