• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[PHP/MySQL] Karte mit X und Y-Koordinaten erstellen

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
Ich möchte eine Karte mit X und Y-Koordinaten erstellen. Das ganze soll dann ungefähr so aussehen:
http://editthis.info/Inselkampf/Geography

Im Prinzip also zwei Koordinaten
X: Höhe
Y: Breite
In meinem Fall will ich aber, dass innerhalb einer Zelle noch zufällig ein Punkt angegeben wird (Also oben links, oben mitte, oben rechts, mitte links, mitte mitte, mitte rechts, unten links, unten mitte, unten rechts.. Dieser Punkt soll dann anklickbar sein und eine zufällige Farbe haben (Rot, Gelb oder weis)

Ich habe nicht den Hauch einer Ahnung wie ich das anstellen soll, geschweige den wie ich die Datenbankstruktur gestalten sollte.
Ich weis nur, dass ich ein Script brauche, dass mir die Karte per Zufall generiert und in der Datenbank speichert und ein Script, dass die Datenbank entsprechend ausliest und daraus dann die visuelle Karte erstellt.

Ist das Vorhaben arg kompliziert oder von der Sache her eigentlich recht simpel umzusetzen? Ich stelle es mir sehr kompliziert vor und bitte daher den Code möglichst einfach zu gestellten. Es geht primär erstmal um das Verstehen wie das programmiertechnisch funktioniert. Sicherheit oder Optimierung via Funktionen und Klassen bitte weglassen. Scriptsprachen sollen PHP/MySDQL, HTML/CSS sein.
 
Zuletzt bearbeitet:

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Kannst du die Daten und die Entitäten genauer beschreiben?
Pro Zelle genau ein Punkt? Soll der Punkt auch gespeichert werden oder jedesmal zufällig sein? Fixe Anzahl Farben oder nach oben offen?
Die Felder sind beliebig?
Was sind deine Gedanken?
Ist ja schonmal offenbar eine 1:1 Zuordnung Zelle zu Punkt. Außerdem hat ein Punkt genau eine Farbe und genau eine Platzierung.
So wie ich das rauslese sehe ich da gerade eine einzelne Tabelle mit Spalten "ZellenNummer", "PunktPos", "PunktFarbe", alles drei (small) Integer.

Im Prinzip also zwei Koordinaten
X: Höhe
Y: Breite
Also du hast Zellen mit einer bestimmten festen quadratischen Größe und eine rechtecke Karte mit einer gewissen Anzahl an Zellen.
Was meinst du genau mit "X und Y-Koordinaten"? Weicht deine Anforderung von dem Bild ab?


Ich habe nicht den Hauch einer Ahnung wie ich das anstellen soll
Irgendwelche Kenntnisse, PHP, Datenbanken oder sollen wir dir das komplett machen?
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #3
Ich weis nicht, wie ich es anders erklären soll. Vielleicht sagt dieses Bild etwas mehr darüber aus: http://www.dartrax.de/worldmap_screens.php

Also Basiswissen in PHP/MySQL HTML und CSS habe ich und einige User werden das (mehr oder weniger) bestätigen. Mit "Ich habe nicht den Hauch einer Ahnung" meine ich, dass ich überhaupt nicht weis, wie ich da ansetzen muss, also wie das logisch funktioniert, welche Befehle ich brauche und wie man sowas programmiertechnisch zusammenbastelt.

Wenn mir jemand den Code hinklatscht, gerne, aber bitte so, dass ich es verstehe. (Daher auch die Bitte den möglichst einfach zu halten. Da ich wohl hinterher noch genug Änderungen vornehmen will sollte ich das Prinzip und das Drumherum schon auch verstanden haben.

Rein für mich betrachtet brauche ich Code, der mir das große XY-Koordinatensystem baut. Dann brauche ich nochmal ein Koordinatensystem, dass mir den Punkt in die Zellen schreibt.

Die Koordinate eines Punktes könnte dann beispielsweise 1:1:9 sein, also die erste Zelle im großen Koordinatensystem und innerhalb der Zelle ist der Punkt dann unten rechts.
 
Zuletzt bearbeitet:

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Ich möchte eine Karte mit X und Y-Koordinaten erstellen. Das ganze soll dann ungefähr so aussehen:
http://editthis.info/Inselkampf/Geography

Im Prinzip also zwei Koordinaten
X: Höhe
Y: Breite
In meinem Fall will ich aber, dass innerhalb einer Zelle noch zufällig ein Punkt angegeben wird (Also oben links, oben mitte, oben rechts, mitte links, mitte mitte, mitte rechts, unten links, unten mitte, unten rechts.. Dieser Punkt soll dann anklickbar sein und eine zufällige Farbe haben (Rot, Gelb oder weis)

Dann brauchst du eine Datenstruktur "Karte", die die Felder verwaltet, also etwa Karte speichert sich Felder als $Karte = $Felder[0..x][0..y]
Eine Datenstruktur "Feld", die etwa ihre X und Y Koordinate sowie Abschnitte (oben rechts, oben links, oben mitte, mitte mitte, mitte links, mitte rechts, unten links, unten rechts unten mitte) kennt.
Ein Abschnitt ist dann quasi dein Punkt, der kennt seine Farbe und ob er sichtbar, aktivierbar oder sogar aktiviert ist.

In MySQL sieht das dann ähnlich aus
Karte
FeldID(primary int) XKoord(int) YKoord(int)

Abschnitt
AbschnittID(primary int) FeldID(foreign key Karte.FeldID int) Position(int) sichtbar(bool) aktivierbar(bool) aktiviert(bool)


Wobei du die Position als int modellieren KANNST, etwa 0, 1, 2 (je oben links, mitte, rechts), 3, 4, 5 (je mitte links, mitte, rechts), 6, 7, 8 (je unten links, mitte, rechts).

Das ist allerdings nur EIN Weg, es gibt sicherlich noch mindestens 72 andere. Je nach Zweck kann dieser ausreichen oder du solltest einen anderen gehen.
Als optimal würde ich das (noch) nicht bezeichnen..
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Bin jetzt nicht so der PHP Mensch, aber für mich sieht das ganz normal aus, nicht übermäßig kompliziert.
Vllt erstmal ein allgemeines PHP Tutorial machen? Bist du mit objektorientierter Programmierung vertraut?
Wenn du mit dem zweiten Codeblock, der Klasse "MyMap" nicht zurecht kommst solltest du auf jeden Fall zuerst ein wenig mehr grundlegendes machen.

Ich weis nicht, wie ich es anders erklären soll.
mMn ist es sinnvoll wenn du als Vorarbeit mal ganz genau aufschreibst was das Programm genau können und machen soll, wie das Ergebnis aussieht und darüber hinaus was du an Gedanken zur Umsetzung hast, haben dir ja schon ein wenig Input gegeben.
Sonst verirrst du dich vermutlich im Dschungle.
So eine Vorabarbeit ist immer obligatorisch, außer du programmierst etwas, das für dich trivial ist.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Dabei ist die Idee von OOP ja eigentlich ganz intuitiv.
Man hat "Objekte" wie eine Mikrowelle. Wie die genau funktioniert ist mir als Verwender des Objektes egal, jedenfalls gibt es Knöpfe für die Aufgaben und dann kann die Tür offen sein oder zu und es können bestimmte Wattzahlen eingestellt sein, die hat also immer einen bestimmten Zustand.
Da ist auch selbstverständlich, dass ich nicht die Tür manuell öffne denn sonst wäre das im laufenden Betrieb gefährlich, sondern über den Knopf "Tür öffnen", der die Mikrowelle erst anhält bevor die Tür tatsächlich aufgeht.
Bisschen OT, sorry. Wollte meinen neusten didaktisch Erguss loswerden :->.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #9
Naja, also erstens gab es ja solche Maps schon vor der Erfindung der objektorientierten Programmierung und ich denke man muss das Grundprinzip erstmal verstanden haben, bevor man es dann vereinfachen und in Funktionen und Klassen auslagern kann.

Das mit der objektorientierten Programmierung habe ich schon öfters probiert, aber kein Tutorial konnte mir das Thema verständlich erklären. Englische schonmal gar nicht.
 

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Ja und nein.

Was du willst, ist ein Grundverständnis von OOP und dann darin deine Map aufbauen. Nicht umgekehrt.
Natürlich gab es so etwas schon vorher, es gab ja auch früher schon selbst modifizierenden Code. Es steht aber vollkommen außer Frage, ob man damit arbeiten will.

Ich kann dir sagen, wenn du die Karte jetzt implementierst und später noch mal damit arbeiten willst, wirst du alles wegwerfen. Wohingegen du bei OOP eventuell nur Teile umschreiben musst, den Großteil jedoch weiter verwenden kannst.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #11
Das doofe ist eben, dass ich das Thema nicht kapiere. Ob es nun darin liegt, dass ich zu blöd dafür bin oder es nur noch keiner in einer für mich verständlichen Form geschrieben hat sei dahingestellt.
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.824
Ort
Midgard
Entweder das oder die nicht vorhandene Bereitschaft auch mal was anstrengendes zu machen.

An so was sieht man wer selbstständig arbeiten kann und wer nicht.

Nimm das Ding und bring es zum laufen! Wie viel entgegenkommen erwartest du zu jeder Zeit willst du es machen oder nicht?
Läuft nämlich auf das raus was accC schon sagte es gibt noch ne Menge andere Wege, wie zu jedem Zeitpunkt im Leben kannst du es auf:
"Führen" , "Folgen" oder "Zum Teufel" scheren herunterbrechen
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #13
Nun, ihr seht ja immer wieder, dass ich was machen will und mir aber jedes mal einen abbrech dabei. Der Wille und die Bereitschaft sind definitiv vorhanden. Ich komme einfach nicht mit den abstrakten Beispielen zurecht, die zudem teils noch völlig an einer realitätsnahen Praxis vorbei gehen. Aber wir schweifen ab ...

Ich hatte mir auch schon überlegt, ob ich mal einen von euch anhaue, ob er bereit ist mal an einem Wochenende mir über TS, Skype oder was auch immer einiges an Wissen zu versuchen zu vermitteln in dem ein konkretes Beispielprojekt erschaffen wird unter dem man sich am Ende auch was vorstellen kann. Aber so recht traue ich mich nicht, weil ihr alle so ausgewachsene Freaks seid wo ich Angst habe schon nach dem zweiten Satz nix mehr zu kapieren. Ich brauche die einfachste aller Sprachen ohne Fachausdrücke und man wird mir die Zusammenhänge wohl wie nem Kleinkind erklären müssen :(
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Hast du denn jemals dir ein Buch zugelegt und das gelesen und die Aufgaben gemacht?
Programmieren muss man schlicht lernen. Klar brichst du dir einen ab wenn du kaum was über programmieren weißt.
Zieh dir mal die "Von Kopf bis Fuß" Reihe rein bzw. such dir da was passendes raus, z.B. "C# von Kopf bis Fuß".

Nötig ist nicht einfach "Wille und Bereitschaft" deinen eigenen Gedanken zu folgen, sondern den Ratschlägen zu folgen mit denen du ans Ziel kommst und das werden nur bedingt deine eigenen Ratschläge an dich selbst sein, sondern eher Ratschläge von Menschen mit mehr Erfahrung auf dem Gebiet.
 
Zuletzt bearbeitet:

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #15
Ich habe sogar mehrere Bücher über Programmieren/Scripten, aber spätestens beim Thema Funktionen und Klassen steige ich aus.

Edit:
Ich muss dazu sagen, dass ich absolut kein Theoretiker bin. Das heißt das viele Vorgeplänkel geht fast komplett an mir vorbei. Ich bin Praktiker, d.h. ich lerne und verstehe Dinge am besten bei praktischer Anwendung. Klar, vieles lerne ich dabei auch einfach auswendig. Ich bin vielleicht auch einfach nicht dafür gemacht. In der Schule bin ich jedenfalls in der 8ten Klasse sitzen geblieben - wegen Mathe. Ich komme mit der Denkweise irgendwie nicht klar.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Dann frag hier im Forum z.B. nach. Jeder hat mal angefangen.
Ich will dir aber nochmal ganz explizit die "Von Kopf bis Fuß" reihe empfehlen, die didaktisch viel geiler ist als andere Bücher.
Ansonsten sind das auch einfach Dinge, die sich erstmal "setzen" müssen, man blickt nicht durch, probiert herum, denkt drüber nach und mit der Zeit kommt Verständnis.
 

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Was verstehst du denn nicht an objektorientierter Programmierung?

Vielleicht hilft dir das weiter:
(Codetechnisch und vom Realitätsbezug her ist das natürlich doch eher einfach gehalten. Es geht ja nur um ein Beispiel.)

Grob gesagt gibt es Klassen und Objekte, wobei die Objekte Instanzen der Klassen sind.

Beispielsweise die Klasse "Auto"
Ein Auto hat eine bestimmte Anzahl an Rädern, nämlich 3, 5, 7 oder 9.
Außerdem hat es 3 oder 5 Türen.
Weiterhin hat es eine bestimmte Menge an Treibstoff.
Es hat einen Verbrauch pro gefahrenen Kilometer.
Außerdem weiß das Auto, wo es gerade steht, es hat also Koordinaten.

Wir können einer Klasse sagen, dass sie diese Parameter entweder "automatisch setzt" oder diese beim Erstellen einer Instanz mitgeteilt bekommt.

Ein Auto sollte uns mittteilen können, wie viele Räder es hat, wie viele Türen, man sollte den Motor starten können, man sollte ihn ausschalten können, man sollte das Auto bewegen können und man sollte es auftanken können.

[src=php]class Auto {

private $Wheels = 5;
private $Doors = 5;
private $EngineStatus = false;
private $Fuel = 1000;
private $Koords = array("x" => 0, "y" => 0);
private $usagePerKM = 0.05;

public function __construct($InitalFuel, $usagePerKM, $Wheels, $Doors, $Koords){
$this->Wheels = in_array($Wheels, array(3, 5, 7, 9) ? $Wheels : 5;
$this->Doors = in_array($Wheels, array(3, 5) ? $Wheels : 5;
$this->Fuel = $InitialFuel;
$this->Koords = $Koords;
$this->usagePerKM = $usagePerKM;
}

public function Wheels(){
return $this->Wheels;
}

public function Doors(){
return $this->Doors;
}

public function getEngineStatus(){
return $this->EngineStatus;
}

public function startEngine(){
$this->EngineStatus = true;
$this->Fuel -= 5;
}

public function stopEngine(){
$this->EngineStatus = false;
}

public function FuelStatus(){
return $Fuel;
}

private function distance($point1, $point2){
$res = ($point1[x]-$point2[x]) * ($point1[x]-$point2[x]) + ($point1[y]-$point2[y]) * ($point1[y]-$point2[y]);
return sqrt($res);
}

public function move($distance, $koords){
// der motor wurde noch nicht gestartet
if(!$this->EngineStatus){
return false;
}

$distance = $this->getDistance($this->koords, $koords);
$usage = $distance * $this->usagePerKM;

// der Treibstoff reicht für die Strecke
if($this->Fuel >= $needs){
$this->Koords = $koords;
$this->Fuel -= $usage;
return true;
}else{
// der Treibstoff reicht nicht für die Strecke
return false;
}
}

public function fillUp($amount){
$this->Fuel += abs($amount);
}

}[/src]

So ist in diesem Beispiel ein Auto beschrieben. Jetzt wollen wir uns ein ganz bestimmtes Auto erstellen:

[src=php]// ich will ein Auto, das 1000 Einheiten Treibstoff geladen hat, einen Verbrauch von 0,05l / km, 5 Türen und 5 Räder hat und bei 0|0 steht
$MeinTollesAuto = new Auto(1000, 0.05, 5, 5, array("x"=>0, "y"=>0));

// jetzt will ich mit meinem Auto nach 3|7 fahren:
$MeinTollesAuto->startEngine(); // Motor an machen
$MeinTollesAuto->move(array("x"=>3, "y"=>7)); // fahren lassen
$MeinTollesAuto->stopEngine(); // Motor ausschalten
// jetzt will ich wissen, wie viel Treibstoff noch übrig ist
$MeinTollesAuto->FuelStatus();[/src]

Wenn ich von außen auf das Objekt Auto schaue, dann weiß ich nicht, wie es sich bewegt, ich weiß nur, dass es sich bewegen kann, ich weiß auch nicht, wie der Treibstoff gemanaged wird, aber irgendwie tut es das schon.
Andererseits, wenn ich aus dem Auto heraus schaue, dann weiß ich nicht, was um mich herum passiert, aber alles in meinem kleinen Ökosystem gehört mir, niemand kann mich einfach umsetzen, ohne dass ich es mitbekomme oder an meinem Tank herum spielen, ohne dass ich das erfahre usw.


Der Sinn ist, dass du gegeneinander abschottbare kleine Welten aufbauen kannst. Je größer nämlich so eine Welt wird, desto unübersichtlicher wird sie. Bei 1000000 Autos müsstest du 1000000 Tanks verwalten, in nicht-OOP. In OOP verwaltet jedes Auto selbstständig seinen Tank:

$MeinAuto = new Auto(1000, 0.05, 5, 5, array("x"=>0, "y"=>0));
$AutoMeinerFrau = new Auto(1000, 0.05, 5, 5, array("x"=>0, "y"=>0));
$AutoMeinesNachbarn = new Auto(1000, 0.05, 5, 5, array("x"=>0, "y"=>0));
$AutoVonIrgendwemSonst = new Auto(1000, 0.05, 5, 5, array("x"=>0, "y"=>0));

Jedes Auto (Objekt) kümmert sich selbstständig um seinen Tank, ohne dass ich als Außenstehender überhaupt wissen müsste, wie das funktioniert. Wenn ich ein Auto brauche, dann erstelle ich mir eine Instanz und alles ist gut.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #18
Kapiert habe ich so ziemlich gar nichts. Ich kommentiere das mal entsprechend:
[src=php]
class Auto {

private $Wheels = 5;
private $Doors = 5;
private $EngineStatus = false;
private $Fuel = 1000;
private $Koords = array("x" => 0, "y" => 0);
private $usagePerKM = 0.05;

public function __construct($InitalFuel, $usagePerKM, $Wheels, $Doors, $Koords){ #Warum "InitalFuel"? Oben steht nur "Fuel"?
$this->Wheels = in_array($Wheels, array(3, 5, 7, 9) ? $Wheels : 5;
$this->Doors = in_array($Wheels, array(3, 5) ? $Wheels : 5; #Wheels? Warum nicht Doors? Was soll das Fragezeichen?
$this->Fuel = $InitialFuel;
$this->Koords = $Koords; # Ist doch das Gleiche?
$this->usagePerKM = $usagePerKM;
}

public function Wheels(){
return $this->Wheels; #Wozu?
}

public function Doors(){
return $this->Doors;
}

public function getEngineStatus(){
return $this->EngineStatus;
}

public function startEngine(){
$this->EngineStatus = true;
$this->Fuel -= 5;
}

public function stopEngine(){
$this->EngineStatus = false;
}

public function FuelStatus(){
return $Fuel;
}

# Ab hier Totalausfall.
private function distance($point1, $point2){
$res = ($point1[x]-$point2[x]) * ($point1[x]-$point2[x]) + ($point1[y]-$point2[y]) * ($point1[y]-$point2[y]);
return sqrt($res);
}

public function move($distance, $koords){
// der motor wurde noch nicht gestartet
if(!$this->EngineStatus){
return false;
}

$distance = $this->getDistance($this->koords, $koords);
$usage = $distance * $this->usagePerKM;

// der Treibstoff reicht für die Strecke
if($this->Fuel >= $needs){
$this->Koords = $koords;
$this->Fuel -= $usage;
return true;
}else{
// der Treibstoff reicht nicht für die Strecke
return false;
}
}

public function fillUp($amount){
$this->Fuel += abs($amount);
}

}
[/src]
 

LemonDrops

Neu angemeldet

Registriert
20 Juli 2013
Beiträge
543
Man braucht für eine Karte keine Objekte, sondern nur einem mehrdimensionalen Array. Damit kann man ein Koordinatensystem abbilden und pro Zelle Daten speichern, sie ändern und darauf zu greifen. Dann schreibt man ein Script, dass den Array mit Schleifen ausgibt, das führt man regelmäßig, oder jedes mal wenn sich Daten ändern, aus.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Beispiel ist zu lang mMn. :-)
Persönlich würde ich sogar so weit gehen Pseudo-Code zu verwenden wenn man OOP näher bringen will.
Hier im Kontext des Threads vllt auch PHP angemessen.
Darüber hinaus fehlen ja noch die Grundlagen an sich.



Cyberfriend: Nichts wird dir jemals die ausführliche Lektüre + Aufgaben + Schweiß eines Buches ersetzen.
Wenn dir Zeile 11 in dem Beispiel schon unklar ist hast du keine Chance was mit deinem Wissen hinzukriegen das irgendwie verwendbar ist.
 
Oben