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<=0 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']==1 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<=0 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']==1 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<=0 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.