Browsergame Map

10/29/2013 00:28 Masterkroko1#1
Liebe Com,

da ich nun angefangen habe mein eigenen Browsergame zu entwickeln stoß ich an so manches Problem welches ich zuvor noch nie bearbeitet hatte.

Fangen wir mal an ich hoffe ich schreib das hier Verständlich.

Ich möchte eine Karte erstellen wo die Dörfer von den User "angelegt" werden sowie z.B. die-staemme.

Ich hab mir überlegt das ich ein Raster von 999x999 haben möchte zudem soll das erste Dorf in die Mitte gesetzt werden sagen wir mal 500x500. Wenn jetzt neue Spieler draufkommen sollen sie immer um die äußere linie gesetzt werden das daraus ein großer Kreis entseht wie z.b. auf diesem Bild [Only registered and activated users can see links. Click Here To Register...] (rote Punkte sind alle einzelne Dörfer). Die Dörfer sollten nicht alle direkt aneinanderliegen sondern hin und wieder 1 - 3 leere felder damit das "natürlicher" aussieht.

Ich hoffe ich konnte es einigermaßen Verständlich erklären werden dennoch Infos benötigt bitte einfach melden.
10/29/2013 00:31 Synatex#2
Und wo ist dein Lössungsansatz? Am besten in Black Market wenn du was gemacht haben willst, hier kriegst du nur Tipps & Tricks wie du dich verbessern kannst (jedenfalls bei einigen, die anderen posten auch immer wieder Codes rein^^).

Falls du nur einen Ansatz suchst und keine direkte Hilfe, wäre dieses Tutorial eventuell was für dich: [Only registered and activated users can see links. Click Here To Register...]
10/29/2013 00:46 Masterkroko1#3
Oh hätt ich hinzuschreiben sollen ich suche keine Lösungen. Nur Tipps die mich auf den richtigen Pfad bringen. Ich möchte garkein Code sehen. Ich schau mir das dann heute Nachmittag mal an was du gepostet hast.
10/29/2013 00:53 マルコ#4
Ich würde das ganz einfach so machen. Speicher den Initialen Radius irgendwo ab. berechne die Anzahl der Felder im Kreis (zum Beispiel per Flächenberechnung). Und dann prüfst du bei jedem Dorfbau, ob etwa 1/3 bis 1/4 der Felder im Kreis belegt sind. Ist dies der Fall vergrößerst du den Radius um einen bestimmten Prozentsatz und überschreibst den initialen Radius damit.
Ob ein Dorf an einer Position gebaurt werden darf oder nicht kannst du mit dem Abstand zur Mitte berechnen. Ist der größer als 0.5*Radius, dann darf dort kein Dorf gebaut werden. Am besten graust du die netsprechenden Felder aus.
Eine solche Karte, auf der Felder auusgegraut sind, würde ich nur ein Mal berechnen lassen, wenn der initiale Radius gesetzt wird, oder der Radius vergrößert wird. So kannst du auch ohne Probleme jederzeit deine Werte ändern, ohne dass du an die Grafiken denken musst.
10/30/2013 21:27 'Ownii#5
Ich hatte sowas bereits einmal geschrieben (Die Stämme). Ich habe im Prinzip den Durchschnittsradius der letzten 20 Dörfer genommen und darum eine Zufallszahl generiert (Wahrscheinlichkeit eher höher als niedriger als Durchschnitt) und dann mit Trigonometrie
Koordinaten im jeweilen Bereich erstellt.

Hier einmal mein Code davon: (Hoffe übersichtlich genug)
PHP Code:
$query['select_user_village'] = mysql_query("SELECT * FROM village WHERE userid = '"$session->id ."' LIMIT 1");
        
        if( 
mysql_num_rows($query['select_user_village']) > ) {
            die();
        }
    
        
$d[0] = 'ne';
        
$d[1] = 'nw';
        
$d[2] = 'sw';
        
$d[3] = 'se';
        
        
// Create Random direction
        
if( $_POST['direction'] == 'random' ) {
            
$_POST['direction'] = $d[rand(0,3)];
        }
        
        
// Select last 20 villages
        
if( $_POST['direction'] == 'ne' ) {
            
$xm 1;
            
$ym = -1;
            
$query['select_radius'] = mysql_query("SELECT * FROM village WHERE x >= "$map['origin'] ." AND y <= "$map['origin'] ." ORDER BY createtime DESC LIMIT 20");
        }
        if( 
$_POST['direction'] == 'se' ) {
            
$xm 1;
            
$ym 1;
            
$query['select_radius'] = mysql_query("SELECT * FROM village WHERE x >= "$map['origin'] ." AND y > "$map['origin'] ." ORDER BY createtime DESC LIMIT 20");
        }
        if( 
$_POST['direction'] == 'sw' ) {
            
$xm = -1;
            
$ym 1;
            
$query['select_radius'] = mysql_query("SELECT * FROM village WHERE x < "$map['origin'] ." AND y > "$map['origin'] ." ORDER BY createtime DESC LIMIT 20");
        }
        if( 
$_POST['direction'] == 'nw' ) {
            
$xm = -1;
            
$ym = -1;
            
$query['select_radius'] = mysql_query("SELECT * FROM village WHERE x < "$map['origin'] ." AND y <= "$map['origin'] ." ORDER BY createtime DESC LIMIT 20");
        }
    
                
        
$r 0;
        
        
// Get Average of last 20 villages
        
if( mysql_num_rows($query['select_radius']) > ) {
        
            while(
$vr mysql_fetch_object($query['select_radius']) ) {
            
                
$radiusa $radiusa sqrt(pow(($vr->$map['origin']),2) + pow(($vr->$map['origin']),2));
            
                
$r++;
            
            }
            
            
$radius ceil($radiusa/$r);
        
        }
        else {
        
            
$radius 0;
            
        }
        
        
        
// Create random position
        
$angle deg2rad(rand(0900000)/10000);
        
        
$x sin($angle) * $radius;
        
        
$y cos($angle) * $radius;
        
        
// Select exactly position // check position
        
while( !$create ) {
        
            
$nx = ($x rand(02)) * $xm $map['origin'];
            
$ny = ($y rand(02)) * $ym $map['origin'];
            
            
$query['select_koordi'] = mysql_query("SELECT * FROM village WHERE x = '"$nx ."' AND y = '"$ny ."'");
            
            if( 
mysql_num_rows($query['select_koordi']) == ) {
            
                
$create true;
            
            }
            
        }
        
        
// Create buildings
        
$points 0;
        
$population 0;
        
        foreach(
$start AS $key => $value) {
        
            for(
$p 1$p <= $value$p++ ) {
            
                
$points $points $build[$key]['points'][$p];
                
$population $population $build[$key]['farm'][$p];
            
            }
        
        }
        
        
// INSERT VILLAGE
        
$query['insert_village'] = mysql_query("INSERT INTO village (userid, name, points, agreement, x, y, flag, createtime, r_wood, r_stone, r_iron, last_wood_refresh, last_stone_refresh, last_iron_refresh, population, main, barracks, stable, garage, snob, smith, place, market, wood, stone, iron, storage, farm, hide, wall, church) VALUES ('"mysql_real_escape_string($session->id) ."', '"mysql_real_escape_string($session->username) ."s Dorf', '"$points ."', '100', '"mysql_real_escape_string($nx) ."', '"mysql_real_escape_string($ny) ."', '0', '"mysql_real_escape_string(time()) ."', 500, 500, 500, '"mt() ."', '"mt() ."', '"mt() ."', '"$population ."', "$start['main'] .", "$start['barracks'] .", "$start['stable'] .", "$start['garage'] .", "$start['snob'] .", "$start['smith'] .", "$start['place'] .", "$start['market'] .", "$start['wood'] .", "$start['stone'] .", "$start['iron'] .", "$start['storage'] .", "$start['farm'] .", "$start['hide'] .", "$start['wall'] .", "$start['church'] .")"); 
10/30/2013 23:27 マルコ#6
@'Ownii:
du solltest dir evtl mal switch Anweisungen anschaun...
Und die Query ist in jedem Fall auch zu 99% gleich, also wieso schreibst du sie 4x hin?
Zudem ist das prozedurale MySQL veraltet. Besser wäre prepared statements (mit PDO)
10/31/2013 21:51 Masterkroko1#7
Ich sag erstmal danke für die Vorschläge und Ownii ein paar kleine Kommentare innerhalb des PHP-Code wäre nett :).

Ich werd das mit der Karte erstmal nach hinten verschieben und mich den anderen Stellen erstmal zuwenden. Da mir aufgefallen ist das meine Datenbankstruktur mist war :D
11/08/2013 19:16 'Ownii#8
Quote:
Originally Posted by マルコ View Post
@'Ownii:
du solltest dir evtl mal switch Anweisungen anschaun...
Und die Query ist in jedem Fall auch zu 99% gleich, also wieso schreibst du sie 4x hin?
Zudem ist das prozedurale MySQL veraltet. Besser wäre prepared statements (mit PDO)
Das script ist schon ein wenig älter, inzwischen mache ich das alles anders..

ich werde gleich mal kommentare rein editieren