[PHP] Kampfscript simulator

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Wurm666, 2. Januar 2010 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 2. Januar 2010
    hi,

    ich bastel grad an nem kleinen browsergame für mich und nen paar freunde. genauergenommen sollte es eigentlich eine kopie von einem sehr erfolgreichem browsergame werden. wir haben es nur ein wenig modifiziert, damit es für uns mehr spass macht. ^^ und natürlich andere grafiken genommen

    so und nun, zu meinem problem:
    ich habe eine php klasse geschrieben, (wie unten).
    diese berechnet mir, wie der kampf ausgeht. wenn ich dann als test ca. 400 gegen 400 schiffe kämpfen lasse, geht das kampfscript noch in wenigen sekunden. sobald aber die komische magische zahl 500 auf beiden seiten, d.h. 500 schiffe vs 500 schiffe in den kampf ziehen. stürzt mir alles ab. und den server kann i dann für ne halbe stunde stehen lassen, weil nix mehr geht.
    sieht einier vll das problem, dass meinen server bei insgesamt 1000 schiffen zum abschmieren bringt?!?

    zu den errors. Nein es gab keinen error, ausser den 30 sek script timeout. das habe ich dann aber testhalber ausgeschaltet, um zu gucken ob es dann geht. ich kam nie zu einem errorbericht, da mir nach einer halben stunde warten die lust zu ende ging, noch länger zu warten. musste dann den kampf per db abstellen

    anbei poste ich mal meine funktion aus meiner kampf class

    PHP:
         function  kampfStart ( $id $planid $angreifer $opfer ) {
                  
          
    $arrAShips  $this -> getKampfShips ( $planid $angreifer $mitmacher_angreifer );
          
    $arrOShips  $this -> getKampfShips ( $planid $opfer $mitmacher_opfer );

          

          
          
    $report  "" ;
          
          
    $anz_Opfer  count ( $arrOShips );
          
    $anz_Angreifer  count ( $arrAShips );
          
          
    $anz_feinde  0 ;
          
    $anz_freunde  0 ;
              
          
    //Rundenzahl, bei 400 vs 400 schiffen sind es meistens 26 runden.
          
    for( $i  1 $i  <=  1000 $i ++) {
            if(
    $anz_Opfer  <=  ||  $anz_Angreifer  <=  0 )
             {
              [...] 
    Kampfende
             
    }
            else
             {
                foreach(
    $arrAShips  AS  $AShip ) {
                    if(
    $AShip -> getHp () >  OR ( $AShip -> getHp () <=  &&  $AShip -> getRunde () == ( $i  1 ))) {  // Wenn Hitpoints über 0 sind, schiesst das schiff noch
                        
    foreach( $arrOShips  AS  $OShip ) {
                            if(
    $OShip -> getHp () >  0 ) {
                                
    $hp  $OShip -> getHp ();
                             
                                
                                
    $hp  $hp  $AShip -> angriffE ;
                                
    $hp  $hp  $AShip -> $angriffK ;
                                
    $OShip -> setHp ( $hp );
                                
                                
    $report  .=  "Runde "  $i  ":"  $AShip -> getId () .  " schiesst auf " $OShip -> getId () .  " HP: "   $hp  "\n" ;
                                if(
    $hp  <=  0 ) {
                                    
    $anz_Opfer --;
                                    
    $OShip -> setRunde ( $i ); 
                                    
    $tote [] =  $OShip -> getId (); 
                                    
    $anz_feinde ++; 
                                }
                            break;
                            }
                        }
                    }
                } 
    //foreach AShip zuEnde
                
                
    $report  .=  "\n" ;
                foreach(
    $arrOShips  AS  $AShip ) {
                    if(
    $AShip -> getHp () >  OR ( $AShip -> getHp () <=  &&  $AShip -> getRunde () == ( $i ))) {  // Wenn Hitpoints über 0 sind, schiesst das schiff noch
                        
    foreach( $arrAShips  AS  $OShip ) {
                            if(
    $OShip -> getHp () >  0 ) {
                                
    $hp  $OShip -> getHp ();
                                
                                
    $hp  $hp  $AShip -> angriffE ;
                                
    $hp  $hp  $AShip -> angriffK ;
                                
    $OShip -> setHp ( $hp );
                                
    $OShip -> setRunde ( $i );
                                
    $report  .=  "Runde "  $i  ":"  $AShip -> getId () .  " schiesst auf " $OShip -> getId () .  " HP: "   $hp  "\n" ;
                                if(
    $hp  <=  0 ) {
                                    
    $anz_Angreifer --;
                                    
    $OShip -> setRunde ( $i ); 
                                    
    $tote [] =  $OShip -> getId ();
                                    
    $anz_freunde ++;       
                                }
                            break;
                            }
                        }
                    }
                } 
    //foreach OShip zuEnde
                
             
    $report  .=  "\n\n" ;  
             }
            
            
          } 
    //for-schleifen ENDE
        
    }
    }

     
  2. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    schreib an bestimmten stellen einfach folgenden code :

    [
    php ]print  "irgend n text der dir sagt wo dein grad script steht<br />\n" flush ();
    dann siehst du wo dein script nen hänger hat.

    das timeout stellst du dann einfach auf 80 oder 90 wenn du ned wilslt das dein server abkackt
     
  3. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    naja wenns zu lange dauert kannst du das ja auch schachteln und bspweise immer für 300 schiffe den aufruf starten dann  die  daten iwo zwischenspeichern und wieder ab schiff 301 weiterberechnen hast da ja auch grad sehr viel aufwand .. ^^  was  die for  schleife bis 1000 soll weiß ich auch nich so wirklich kannst ja mal erläutern was deine intention ist sieht zur zeit so aus als ob zuerst jedes Schiff vom  "Angreifer"  jedes Schiff vom  "Opfer" "verletzt"  und danach andersrum du könntest zb zum optimieren schiffe mit 0 HP aus dem  Array  löschen damit diese nich als leiche rumexistiert und sowieso immer beim  IF  rausgeworfen wird .

    außerdem ist dein denglisch weird "kampfShips"  aaaha
    und hat zwar nix mitm Coding zu tun aber mitm Sinn warum schießt erst jedes schiff vom angreifer auf JEDES schiff des Opfers rundenbasiert würds eher so aussehen dass jedes angreifer schiff EINMAL auf ein schiff schießt und da könnteste reihenfolgen machen auf welche schiffe welche am liebsten schießen ob  die  schiffe bei irgendwelchen schiffen angriffs - boni / mali haben etc etc ... ^^  aber dazu musste halt  die  performance davon optimieren oder threaded berechnen lassen oder einfach das timeout  "aufheben"  : P
     
  4. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    @
    telefonzelle jedes angreifende Schiff schiesst auf jedes gegnerische Schiff einmal sofern es mehr als NULL hp hat ich nehme das schiff noch net raus um zu sehen ob es in der gleichen runde gestorben ist wie es nochmal dran wäre also auf gut deutsch :
    sstirbt ein Schiff in der Runde in der es normalerweise noch dran wäre darf es nochmal schiessen .

    aber was meinst du mit  "threaded berechnen lassen" PHP unterstützt doch kein threading oder hab ich was verpasst ?
     
  5. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    echte threads nicht aber forks

    [ url = "http://de3.php.net/manual/en/function.pcntl-fork.php" ] PHP pcntl_fork  Manual [/ url ]
     
  6. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    ok , die  funktion kennt mein server nicht obwohl ich php 5 drauf habe .

    EDIT habe grad gelesen dass ich den apache neu kompilieren muss
     
  7. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    kommt drauf an was du für nen server hast  ^^
    unter windows gibts  die  funktionen ned für unix oder gnu / linux musst du php neu kompilieren mit  -- enable - pcntl im configure - command .
     
  8. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    hab nen linux server
    mit apache 2.
    php 5.2.11 und mysql
     
  9. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    [
    quote = "Telefonzelle, post: 9166307" ]
    und hat zwar nix mitm Coding zu tun aber mitm Sinn warum schießt erst jedes schiff vom angreifer auf JEDES schiff des Opfers rundenbasiert würds eher so aussehen dass jedes angreifer schiff EINMAL auf ein schiff schießt und da könnteste reihenfolgen machen auf welche schiffe welche am liebsten schießen ob  die  schiffe bei irgendwelchen schiffen angriffs - boni / mali haben etc etc ... ^^ [/ quote ]

    also php neu kompilieren muss i noch warten bis mein server admin endlich wach ist  : lol :.  nach sylvester ist der immer ein paar tage nicht richtig ansprechbar .

    das mit den reihenfolgen interessiert mich wie du das genauer gemeint hast !?  ich habe drei verschiedene schiffsklassen alle mit verschiedensten waffen bisher habe ich nur  die  unterscheidung mit panzerung und schilden gemacht aber wie wäre jetzt  die  von dir umzusetzen was das angriffs - boni / mali angeht wie müsste ich mir das vorstellen ??  z . B Bomber haben mehr angriffskraft auf grosse kampfschiffe als auf jäger ?

    bin für alle ideen offen schliesslich soll es uns jede menge spass machen .
     
  10. 2. Januar 2010
    AW:
    PHP:
     Kampfscript simulator [/ b ]

    [
    quote = "Wurm666, post: 9167476" ] also php neu kompilieren muss i noch warten bis mein server admin endlich wach ist  : lol :.  nach sylvester ist der immer ein paar tage nicht richtig ansprechbar .

    das mit den reihenfolgen interessiert mich wie du das genauer gemeint hast !?  ich habe drei verschiedene schiffsklassen alle mit verschiedensten waffen bisher habe ich nur  die  unterscheidung mit panzerung und schilden gemacht aber wie wäre jetzt  die  von dir umzusetzen was das angriffs - boni / mali angeht wie müsste ich mir das vorstellen ??  z . B Bomber haben mehr angriffskraft auf grosse kampfschiffe als auf jäger ?

    bin für alle ideen offen schliesslich soll es uns jede menge spass machen .[/ quote ]

    jo wird halt komplexer also musste mehr optimieren etc :
    Schiffklasse 1 greift an Schiffklasse 1  Schiffklasse 2  Schiffklasse 3
    Schiffklasse 2 greift an
    Schiffklasse 2  Schiffklasse 1  Schiffklasse 3
    Schiffklasse 3 greift an
    Schiffklasse 3  Schiffklasse 1  Schiffklasse 2

    In deiner 
    "Reihenfolge"  ist jetzt ein Schiff der Klasse 2 dran Du rufst also deine Methode auf welche dir ein Ziel für das Schiff sucht abhängig von den ZielKlassen Wenn keines der Klasse 2 vorhanden ist beim Gegner greift 's Klasse 1 an, danach Klasse 3. Dann bauste halt zB ein dass Klasse 2 Schiffe wenn sie Klasse 1 Schiffe angreifen +5% Angriffsbonus bekommen, bei Klasse 3 beispielsweise -10% oder sonstwas, denk dir halt was sinnvolles aus. Blablabla. ^^ Schreib dir halt erstmal n Konzept auf' n Zettel oder so welche Schiffe was machen können und was nicht Du kannst ja beispielsweise auch blockierende Schiffe einbauen , die  'n anderes lähmen und dafür nicht verletzen. ^^ Wenn du dann weitere Fragen hast kannste ja wieder fragen.
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.