Gamux Game Entwicklung  
     

Left Nav Mit Facebook verbinden Registrieren Lexikon Lexikon Interessengemeinschaften Suchen Heutige Beiträge Alle Foren als gelesen markieren Right Nav

Left Container Right Container
 
Alt 08.09.2008, 15:01   #1 (permalink)
Erfahrener Benutzer
 

Standard Kampfscript Probleme

Ich habe ein Array, jeweils für Angreifer und für Verteidiger
PHP-Code:
Array
(
    [
0] => Array
        (
            [
ID] => 1
            
[name] => Soldat
            
[angriff] => 20
            
[verteidigung] => 20
            
[bewegung] => 10
            
[laderaum] => 5
            
[menge] => 10
            
[attacked] => 0
        
)
 
    [
1] => Array
        (
            [
ID] => 2
            
[name] => Truppentransporter
            
[angriff] => 20
            
[verteidigung] => 35
            
[bewegung] => 25
            
[laderaum] => 20
            
[menge] => 5
            
[attacked] => 0
        
)
 

Nun fange ich bei z.B. dem Verteidiger an und nehme den ersten ArrayEintrag und speichere ihn in $defend, danach "schüttle" ich das Angreifer Array und wähle dann den ersten Eintrag, diese beiden Gruppen kämpfen gegeneinander, dadurch wird im Angreifer Array das "attacked" auf 1 gesetzt, dadurch das ich den Eintrag mittels shift aus dem Array geholt habe, pushe ich ihn nachher wieder rein. Beim herausshiften, achte ich darauf, dass attacked auf 0 ist und die menge größer 0.
Nun habe ich irgendwie das Problem einer Abbruchbedingung, da es bei mir auch vorkommt das 3 Truppentransport 0 Soldaten angreifen usw. was ich ja nicht will. Kennt irgendjemand eine Möglichkeit das oben gezeigte Array abzufragen, ob die mengen noch größer 0 sind???

Eine weitere Möglichkeit wäre, das Array nochmal umzubiegen (Erstelle am Anfang schon eine Copy, sodass in einer Runde volle Anzahl der Angreifer auf volle Anzahl Verteidiger und umgekehrt trifft), sodass nur noch Werte enthalten sind, wo menge größer 0 ist. Ich brauche auch diese Einträge mit 0, da ich damit später meine Datenbank aktualisiere.

Am Ende einer jeden Runde werden die Kopien wieder in die Originale übertragen.

Hier mal die fight function, is ein bisschen kompliziert geschrieben, also Verbesserungsvorschläge immer her damit, kann man immer gebrauchen.
PHP-Code:
function fight() {
   
$countAttacker $this->countAttack;
   
$countDefender $this->countDefend;
   
$attackedUnits 0;
   
$shift=false;
   foreach(
$this->defendUnits as $defend) {
    if(
$defend['menge']==0) {
     continue;
    }  else if(
$this->countAttack<=OR $countAttacker<=$attackedUnits) {
     break;
    }
    
$counter=0;
    do {
     if(
$shift) {
      
array_push($this->attackUnitsCopy,$attack);
      
$shift=false;
     }
     
shuffle($this->attackUnitsCopy);
     
$attack array_shift($this->attackUnitsCopy);
     
$counter++;
     
$shift=true;
    } while((
$attack['attacked']==OR $attack['menge']==0) AND $counter<=100);
    
$defend_attack $defend['menge']*$defend['angriff'];
    
$attack_defend $attack['menge']*$attack['verteidigung'];
    while(
$attack_defend==$defend_attack) {
     
$defend_attack $this->moral($defend_attack);
     
$attack_defend $this->moral($attack_defend);
    }
    
$query "INSERT INTO kb
        SET `kb_attackLand`='"
.$this->awayID."',
        `kb_defendLand`='"
.$this->zielID."',
        `kb_round`='"
.($this->round+1)."',
        `kb_text`='Der Verteidiger greift mit "
.$defend['menge']." ".$defend['name']." mit einer Stärke von ".$defend_attack." den Angreifer an, dieser verteidigt sich mit ".$attack['menge']." ".$attack['name']." und einer Stärke von ".$attack_defend;
    if(
$defend_attack>$attack_defend) {
     
$query .= " .Der Verteidiger gewinnt vernichtend.',";
     
$attack['menge'] = 0;
     
$attack['attacked'] = 1;
     
$this->countAttack--;
    } else {
     
$attack['menge'] = ceil(($attack_defend $defend_attack) / $attack['verteidigung']);
     
$query .= " .Der Angreifer kann einen Teil abblocken und hat danach noch ".$attack['menge']." ".$attack['name'].".',";
     
$attack['attacked'] = 1;
    }
    
$query .= "`kb_date`='".aktDate()."'";
    
$this->db->query($query);
    
debugprint($this->attackUnitsCopy);
    
array_push($this->attackUnitsCopy,$attack);
    
debugprint($this->attackUnitsCopy);
    
$attackedUnits++;
    
$shift=false;
   }
   
$attackedUnits 0;
   
$shift false;
   foreach(
$this->attackUnits as $attack) {
    if(
$attack['menge']==0) {
     continue;
    } else if(
$this->countDefend<=OR $countDefender<=$attackedUnits) {
     break;
    }
    
$counter=0;
    do {
     if(
$shift) {
      
array_push($this->defendUnitsCopy,$defend);
     }
     
shuffle($this->defendUnitsCopy);
     
$defend array_shift($this->defendUnitsCopy);
     
$counter++;
     
$shift=true;
    } while((
$defend['attacked']==OR $defend['menge']==0) AND $counter<=100);
    
$attack_attack $attack['menge']*$attack['angriff'];
    
$defend_defend $defend['menge']*$defend['verteidigung'];
    while(
$attack_attack==$defend_defend) {
     
ausgabe("Angreifer Moral");
     
$defend_defend $this->moral($defend_defend);
     
$attack_attack $this->moral($attack_attack);
    }
    
$query "INSERT INTO kb
        SET `kb_attackLand`='"
.$this->awayID."',
        `kb_defendLand`='"
.$this->zielID."',
        `kb_round`='"
.($this->round+1)."',
        `kb_text`='Der Angreifer greift mit "
.$attack['menge']." ".$attack['name']." mit einer Stärke von ".$attack_attack." den Verteidiger an, dieser verteidigt sich mit ".$defend['menge']." ".$defend['name']." und einer Stärke von ".$defend_defend;
    if(
$attack_attack>$defend_defend) {
     
$query .= " .Der Angreifer gewinnt vernichtend.',";
     
$defend['menge'] = 0;
     
$defend['attacked'] = 1;
     
$this->countDefend--;
    } else {
     
$defend['menge'] = ceil(($defend_defend $attack_attack) / $defend['verteidigung']);
     
$query .= " .Der Verteidiger kann einen Teil abblocken und hat danach noch ".$defend['menge']." ".$defend['name'].".',";
     
$defend['attacked'] = 1;
    }
    
$query .= "`kb_date`='".aktDate()."'";
    
$this->db->query($query);
    
array_push($this->defendUnitsCopy,$defend);
    
$attackedUnits++;
    
$shift=false;
   }
   
$this->round++;
   
$this->attackUnits $this->attackUnitsCopy;
   
$this->defendUnits $this->defendUnitsCopy;
   
$end false;
   if(
$this->countAttack<=AND $this->countDefend<=0) {
    
$end true;
    
$this->win 0;
   } elseif(
$this->countAttack<=0) {
    
$end true;
    
$this->win 1;
   } elseif(
$this->countDefend<=0) {
    
$end true;
    
$this->win 2;
   }
   if(
$this->round<11 AND !$end) {
    
ausgabe("----------- Neue Runde ------------");
    
$this->fight();
   }
   if(
$this->end()) {
    return 
true;
   }
   return 
false;
  } 
Die Moral-Funktion addiert oder subtrahiert noch ein bisschen Prozentwert, sodass ein klein wenig zufall entsteht. Wobei es auch noch eine Wahrscheinlichkeit gibt wieviel Prozent geändert werden.

Die End Funktion aktualisiert nur meine Datenbank.

Geändert von Megger (08.09.2008 um 15:25 Uhr).
Megger ist offline   Mit Zitat antworten An Facebook senden
Werbung
Alt 09.09.2008, 15:04   #2 (permalink)
Pixelschieber
Benutzerbild von Sebastian
 

Standard

Hi,
kannst du noch einmal ganz kurz beschreiben was du genau machen möchtest? Ich verstehe dein Problem nämlich zurzeit nicht.

Grüße
Sebastian

http://www.filmeo.de - Kostenlose Filme & Serien finden
Sebastian ist offline   Mit Zitat antworten An Facebook senden
Alt 09.09.2008, 16:03   #3 (permalink)
Erfahrener Benutzer
 

Standard

Mhhh es funktioniert jetzt, habe es nochmal komplett umgeschrieben.

Aber ich versuche es nochmal zu erklären.
Also ich habe eine Kampfscript Klasse, die wird ausgelöst, wenn Einheiten "in ein fremdes Land einmaschieren" und den Auftrag "angreifen" haben.
Sobald dies passiert holt sich die Klasse alles was benötigt wird aus der Datenbank und speichert es in ein Array, dass Array sieht so aus wie in meinem ersten Post, dadurch bekomme ich ein Array für den Angreifer(attackUnits) und für den Verteidiger (defendUnits).

Bevor der eigentliche Kampf nun startet, werden diese beiden Arrays nochmal kopiert (attackUnitsCopy und defendUnitsCopy), dies mache ich deswegen, weil meine Kämpfe rundenbasiert laufen und jeder Spieler mit voller Stärke zuschlägt und danach erst die Verluste erleidet, sodass ich die angreifenden Einheiten(egal ob von Angreifer oder Verteidiger) aus dem normalen Array nehme, die verteidigenden Einheiten(egal ob von Angreifer oder Verteididger) kommen allerdings aus der Kopie und dort werden sie modifiziert.

Am Ende der Runde wird die Copy in das Original transferiert und wenn weniger als 11 Runden vergangen sind und noch Einheiten vorhanden sind, dann geht es in die nächste Runde. Das Problem bei dem oben gezeigten Script ist, dass es manchmal vorkam, dass zum beispiel 5 Soldaten gegen 0 Soldaten antraten und sowas durfte ja nicht passieren.

Habe es aber jetzt überarbeitet und kann nun auch unterscheiden, wer gewonnen und wer verloren hat, außerdem kann ich wieder auf den KB zugreifen, durch eine einheitliche ID usw.

Hoffe es ist etwas klarer geworden, wenn nicht dann weiß ich auch nicht mehr weiter

Edit:
Theoretisch könnte man das ganze auch einfach so umbiegen, dass man das 'attacked' im Array erweitert auf 'isAttacked' und 'hasAttacked', so kann man per Zufall eine Einheitengruppe von allen auswählen und geht nicht davon aus, dass entweder der Angreifer beginnt oder der Verteidiger. Das ganze kann man solange machen, bis alle einmal attackiert haben, oder alle attackiert wurden oder keine Einheiten mehr vorhanden sind(sei es jetzt nun nur auf einer Seite oder auf beiden Seiten).
Versteht ihr was ich meine? Was haltet ihr davon?

Geändert von Megger (09.09.2008 um 18:01 Uhr).
Megger ist offline   Mit Zitat antworten An Facebook senden
Alt 09.09.2008, 20:08   #4 (permalink)
Pixelschieber
Benutzerbild von Sebastian
 

Standard

Zitat:
Zitat von Megger Beitrag anzeigen
Hoffe es ist etwas klarer geworden, wenn nicht dann weiß ich auch nicht mehr weiter
Jetzt ist es auf jeden Fall klarer als vorher.
Zitat:
Zitat von Megger Beitrag anzeigen
Edit:
Theoretisch könnte man das ganze auch einfach so umbiegen, dass man das 'attacked' im Array erweitert auf 'isAttacked' und 'hasAttacked', so kann man per Zufall eine Einheitengruppe von allen auswählen und geht nicht davon aus, dass entweder der Angreifer beginnt oder der Verteidiger. Das ganze kann man solange machen, bis alle einmal attackiert haben, oder alle attackiert wurden oder keine Einheiten mehr vorhanden sind(sei es jetzt nun nur auf einer Seite oder auf beiden Seiten).
Versteht ihr was ich meine? Was haltet ihr davon?
Ist es nicht eigentlich logisch das der Angreifer anfängt? Erst Angreifer, dann Verteidiger und so weiter. Fände ich jedenfalls vom Aufbau her logisch.

http://www.filmeo.de - Kostenlose Filme & Serien finden
Sebastian ist offline   Mit Zitat antworten An Facebook senden
Alt 09.09.2008, 20:58   #5 (permalink)
Erfahrener Benutzer
 

Standard

Aber es könnte ja auch sein, dass der Verteidiger gemerkt hat, dass er angegriffen wird und sich deshalb schonmal vorbereitet
Megger ist offline   Mit Zitat antworten An Facebook senden
Alt 09.09.2008, 21:22   #6 (permalink)
Pixelschieber
Benutzerbild von Sebastian
 

Standard

Zitat:
Zitat von Megger Beitrag anzeigen
Aber es könnte ja auch sein, dass der Verteidiger gemerkt hat, dass er angegriffen wird und sich deshalb schonmal vorbereitet
Ich hätte das zuerst Angriffrecht als Bonus dafür genommen, dass man mehr angreift und sich nicht nur immer verteidigt.

http://www.filmeo.de - Kostenlose Filme & Serien finden
Sebastian ist offline   Mit Zitat antworten An Facebook senden
Alt 09.09.2008, 22:57   #7 (permalink)
Erfahrener Benutzer
 

Standard

Werde mir da noch etwas überlegen, als erstes Skript um allgemein das Spiel zu testen reicht es erstmal
Megger ist offline   Mit Zitat antworten An Facebook senden
Antwort

Themen-Optionen
Ansicht

Forumregeln
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:47 Uhr.


Style Copyright by Wrestling Forum
Content Relevant URLs by vBSEO 3.3.0