Zufall mit PHP

  • Themenstarter Themenstarter koronyl
  • Beginndatum Beginndatum
Wenn man so rumspinnt, dann erfreut es wirklich nur die Entwickler, weil sie wissen was passiert :-)
Aber zu einfach darf der Algorithmus nicht sein, sonst kennen ihn schnell alle User und das ist unschön.

Ich würde Dark Ranger's Idee vertiefen und ausbauen!
 
Wenn es zu einfach ist dann wird es schnell erkannt und danach hat man irgendwelche Tools die es berechnen und danach ist es dann auch nicht mehr spannend, da man alles vorraussehen kann.
 
Muss zuhause mal schauen ob ich noch irgendwo ein altes Kampfscript rumfliegen habe, dass kann ich dir dann zur Verfügung stellen, dass war auch sehr einfach aufgebaut.

Wäre cool wenn du mir ein Beispiel geben könntest :)

Wenn es zu einfach ist dann wird es schnell erkannt und danach hat man irgendwelche Tools die es berechnen und danach ist es dann auch nicht mehr spannend, da man alles vorraussehen kann.

Danke aber,
ich werde es noch ausbessern ich will nur erstmal so eine Art Grundgerüst haben :rolleyes:
 
Habe es gestern nicht gefunden aber ich weiß dass ich es noch irgendwo habe, aber du kannst dir ja mal folgende Seiten anschauen (Megger bin ich)

(Teil1) Angriffe in Browsergames

(Teil2) Browsergames mit Mauern und Nachbonus

Diskussion zu (Teil1)

Diskussion zu (Teil2)

Besonders die Diskussion zu Teil2 ist recht interessant und da habe ich auch einige Codeschnipsel gepostet. Auf die habe ich dann auch mein Kampfscript aufgebaut, welches ich dir zeigen wollte.

Edit:
Baut so ein bisschen auf Teil1 und Teil2 auf: Browsergame Tutorials
 
Zuletzt bearbeitet:
Danke ich habe mich für den code entschieden weil ich den anderen nicht verstehe:rolleyes:

PHP:
<?php
$sword = 0;
$bow = 0;
$draw = 0;
// Angreifer
// Schwertkämpfer erstellen
$schwert['name'] = "Helle Ponys"; // Name
$schwert['anz'] = 120; // Anzahl
$schwert['atk'] = 30; // Angriff
$schwert['def'] = 20; // Verteidigung
// Verteidiger
// Bogenschütze erstellen
$bogen['name'] = "Dunkle Ponys"; // Name
$bogen['anz'] = 80; // Anzahl
$bogen['atk'] = 25; // Angiff
$bogen['def'] = 35; // Verteidigung
//Übersicht ausgeben
echo "-------------------------------------------------------------------<br />";
echo "Angreifer:<br />";
echo "Name: ".$schwert['name']."<br />";
echo "Anzahl: ".$schwert['anz']."<br />";
echo "Liebe: ".$schwert['atk']."<br />";
echo "Zufriedenheit: ".$schwert['def']."<br />";
echo "-------------------------------------------------------------------<br />";
echo "Verteidiger:<br />";
echo "Name: ".$bogen['name']."<br />";
echo "Anzahl: ".$bogen['anz']."<br />";
echo "Liebe: ".$bogen['atk']."<br />";
echo "Zufriedenheit: ".$bogen['def']."<br />";
echo "-------------------------------------------------------------------<br /><br />";
//Simulationsschleife
for($i=1;$i<=100;$i++)
{ 
 $atk_anz = $schwert['anz']; //Anzahl übernehmen
 $def_anz = $bogen['anz']; //Anzahl übernehmen
 $abort=false; //Kein Abbruch
 $defwall = 8; //Stufe der Mauer
 
 //Rundenschleife
 for($k=1;$k<=10;$k++)
 {
  echo "Runde ".$k." ANFANG Anzahl der ".$schwert['name'].": ".$atk_anz." Anzahl der ".$bogen['name'].": ".$def_anz."<br />";
  // Verteidigungsbonus bei Nacht berechnen
  if(date("H") <= 23 AND date("H") >= 7){
   $bonustime = 1;
  } else {
   $bonustime = 2;
  }
  // Angriffs Angriffspunkte berechnen
  $atk_atk = $schwert['atk'] * $atk_anz;
  //Per Zufall bis zu 10% addieren oder subtrahieren
  if(rand(0,1))
  {
   $atk_atk += $atk_atk*(rand(1,10)/100);
  }
  else
  {
   $atk_atk -= $atk_atk*(rand(1,10)/100);
  }
  // Angriffs Verteidigungsspunkte berechnen
  $atk_def = $schwert['def'] * $atk_anz;
  //Per Zufall bis zu 10% addieren oder subtrahieren
  if(rand(0,1))
  {
   $atk_def += $atk_def*(rand(1,10)/100);
  }
  else
  {
   $atk_def -= $atk_def*(rand(1,10)/100);
  }
  // Verteidigungs Angriffspunkte berechnen
  $def_atk = $bogen['atk'] * $def_anz;
  //Per Zufall bis zu 10% addieren oder subtrahieren
  if(rand(0,1))
  {
   $def_atk += $def_atk*(rand(1,10)/100);
  }
  else
  {
   $def_atk -= $def_atk*(rand(1,10)/100);
  }
  // Verteidigungs Verteidigungspunkte berechnen
  //Wenn Mauer gleich 0 dann nicht berücksichtigen, da sonst eh 0 rauskommen würde
  if($defwall > 0)
  {
   $def_bonus = pow($defwall,1/2) * $bonustime;
  }
  else
  {
   $def_bonus = $bonustime;
  }
  $def_normal = $bogen['def'] * $def_anz;
  $def_def = $def_normal * $def_bonus;
  //Per Zufall bis zu 10% addieren oder subtrahieren
  if(rand(0,1))
  {
   $def_def += $def_def*(rand(1,10)/100);
  }
  else
  {
   $def_def -= $def_def*(rand(1,10)/100);
  }
 
  //Verschiedene ausgaben (Da wir hier Ponys haben, kein Angriff und Verteidigung ;D)
  echo "Liebe(".$schwert['name']."): ".$atk_atk."<br />";
  echo "Zufriedenheit(".$schwert['name']."): ".$atk_def."<br />";
  echo "Liebe(".$bogen['name']."): ".$def_atk."<br />";
  echo "Zufriedenheit(".$bogen['name']."): ".$def_def."<br />";
 
  //Angriff von der Verteidigung abziehen, sowohl für die Verteidigung als auch für den Angriff
  $def_new = $def_def - $atk_atk;
  $atk_new = $atk_def - $def_atk;
 
  //Wenn beide unter 0 sind, ist es ein unentschieden
  if($def_new<=0 AND $atk_new<=0) {
   $draw++;
   $abort=true;
   echo "<b>Unentschieden</b><br />";
   echo "Runde ".$k." ENDE Anzahl der ".$schwert['name'].": 0 Anzahl der ".$bogen['name'].": 0<br /><br />";
   break;
  //Nur die Verteidigung unter 0, haben die Angreifer gewonnen
  } else if($def_new<=0) {
   $sword++;
   $abort=true;
   echo "<b>".$schwert['name']." gewinnen</b><br />";
   $atk_anz = ceil($atk_def/$atk_new);
   echo "Runde ".$k." ENDE Anzahl der ".$schwert['name'].": ".$atk_anz." Anzahl der ".$bogen['name'].": 0<br /><br />";
   break;
  //Angreifer unter 0 haben die Verteidiger gewonnen
  } else if($atk_new<=0) {
   $bow++;
   $abort=true;
   echo "<b>".$bogen['name']." gewinnen</b><br />";
   $def_anz = ceil($def_def/$def_new);
   echo "Runde ".$k." ENDE Anzahl der ".$schwert['name'].": 0 Anzahl der ".$bogen['name'].": ".$def_anz."<br /><br />";
   break;
  //Ansonsten geht es weiter
  } else {
   //Neu berechnen, wieviel Angreifer und Verteidiger noch dabei sind, Werte werden aufgerundet
   $def_anz = ceil($def_def/$def_new);
   $atk_anz = ceil($atk_def/$atk_new);
  }
  echo "Runde ".$k." ENDE Anzahl der ".$schwert['name'].": ".$atk_anz." Anzahl der ".$bogen['name'].": ".$def_anz."<br /><br />";
 }
 //Wenn nach 10 Runden keine Entscheidung gefallen ist, gibt es ein Unentschieden
 if($def_anz>0 AND $atk_anz>0 AND !$abort)
 {
  $draw++;
 }
 echo "<b>Simulation ".$i." Ende. Stallmauerstufe war: ".$defwall."</b><br /><br />";
}
echo "<br />".$schwert['name'].": ".$sword."% ".$bogen['name'].": ".$bow."% Unentschieden: ".$draw."%<br />";
?>

Da kann ich ja jetzt noch meinen Moralrechner einbauen und die Anzahl etc von der DB hohlen :)
Aber das alte Problem hab ich immer noch.... ich habe ja mehr als 2 verschiedene Truppen und wie gesagt es soll ja Zufall bleiben ob 3 Soldaten oder ein PAnzer sterben...
 
PHP:
$attacker = array($soldaten,$panzer);
$defender = array($soldaten,$panzer);

//Rundenschleife
for($i=1;$i<=10;$i++) {
    shuffle($attacker);
    shuffle($defender);
    $current_attacker = $attacker[1];
    $current_defender = $defender[1];
    if($current_attacker->getStaerke() <= $current_defender->getStaerke()) {
         //Defender gewinnt
         //Stärke berechnen und je nachdem von den einzelnen Attackern und Defendern Einheiten abziehen
    } else {
         //Gleiche wie if nur Attacker gewinnt
    }
}

Um einzelne Einheiten auszuschließen gehst du wie folgt vor:
Wenn der Defender mehr Stärke hat, dann verliert der Angreifer alle Einheiten. Bei den Verteidigern musst du schaun wieviel Stärke sie aushalten und wieviel Stärke der Angreifer hat und dann die Anzahl der Einheiten entfernen.

Nach dem Script oben kämpfen mal Soldaten gegen Panzer und mal Soldaten gegen Soldaten. Und dadurch hast du auch zufall drin und mal gehen mehr Panzer kaputt und manchmal mehr Soldaten.
 
Danke aber wo genau muss ich diesen Teil einbauen
Ich mach es irgendwie falsch :(
Kannste mal den kompletten Quelltext posten also den von vorher und den neuen zusammen
Wäre echt nett
 
Das sollte nur ein Anstoß sein in die richtige Richtung.

Der Quellcode von vorher müsste ein bisschen umgeschrieben werden, da er nur für eine Angreifergruppe und eine Verteidigergruppe gilt,

Der Abschnitt von oben zeigt ein bisschen wie du mit Zufall mehrere Angreifer- und Verteidigungsgruppen verwalten kannst.

Brauchst also am besten ein Array indem alle Angreifer und Verteidiger gespeichert sind (in meinem Beispiel bin ich mal von Objekten ausgegangen)

Habe im moment keine Zeit dir einen kompletten Quellcode zusammenzuschreiben, deswegen zeigst du am besten mal deine Versuche und wir korrigieren dich falls irgendwas falsch sein sollte.

Edit:
Hier das Kampfscript welches ich meine, musst dich aber selber durcharbeiten, habe keine Zeit alles noch zu kommentieren, da ich es sowieso nicht mehr einsetze:
PHP:
<?php
	class Kampfscript {
		
		private $db;
		private $pns;
		private $zielID;
		private $awayID;
		private $defendUnits;
		private $defendUnitsCopy;
		private $countDefend = 0;
		private $attackUnits;
		private $attackUnitsCopy;
		private $countAttack = 0;
		private $round = 0;
		private $win = -1;
		private $generatedID = -1;
		private $generatedPass = -1;
		private $hashedPass = -1;
		
		public function __construct($db,$pns) {
			$this->db = $db;
			$this->pns = $pns;
			$this->defendUnits = array();
			$this->defendUnitsCopy = array();
			$this->attackUnits = array();
			$this->attackUnitsCopy = array();
			$this->generateID();
			$this->generatePass();
		}
		
		public function setAwayID($awayID) {
			$this->awayID = $awayID;
		}
		
		public function start() {
			if($this->awayID!=null) {
				$query = "SELECT * 
						  FROM ".$this->db->prefix()."away
						  WHERE `away_ID`='".$this->awayID."'
						  LIMIT 1";
				$result = $this->db->query($query);
				if($result->get_num_rows()>0) {
					$row = $result->current();
					$this->zielID = $row['away_zielLandID'];
					$koords = explode(":",getKoords($this->zielID));
					$xkoord = $koords[2];
					$ykoord = $koords[3];
					$exists = false;
					$query = "SELECT `user_ID` FROM ".$this->db->prefix()."user";
					$result_user = $this->db->query($query);
					foreach($result_user as $row_user) {
						$infos = getLands($row_user['user_ID']);
						if($infos!=-1) {
							foreach($infos as $info) {
								if($info['landX']==$xkoord AND $info['landY']==$ykoord) {
									$exists = true;
								}
							}
						}
					}
					if($exists) {
						$query = "SELECT * 
								  FROM ".$this->db->prefix()."away_flotte
								  INNER JOIN ".$this->db->prefix()."unit
								  ON `af_unitID`=`unit_ID`
								  WHERE `af_awayID`='".$row['away_ID']."'";
						$result = $this->db->query($query);
						$attackBewegung = 0;
						$counter=0;
						foreach($result as $row) {
							array_push($this->attackUnits,array("ID"=>$row['unit_ID'],
																"index"=>$counter,
																"name"=>$row['unit_name'],
																"angriff"=>$row['unit_angriffswert'],
																"verteidigung"=>$row['unit_verteidigungswert'],
																"bewegung"=>$row['unit_bewegungstempo'],
																"laderaum"=>$row['unit_laderaum'],
																"menge"=>$row['af_menge'],
																"attacked"=>0));
							$this->countAttack++;
							$counter++;
						}
						$this->attackUnitsCopy = $this->attackUnits;
						unitready($this->zielID);
						produce($this->zielID);
						$query = "SELECT * 
								  FROM ".$this->db->prefix()."unit_group
								  INNER JOIN ".$this->db->prefix()."unit
								  ON `ug_unitID`=`unit_ID`
								  WHERE `ug_landID`='".$this->zielID."'
								  AND `ug_menge`!='0'";
						$result = $this->db->query($query);
						$defendBewegung = 0;
						$counter = 0;
						foreach($result as $row) {
							array_push($this->defendUnits,array("ID"=>$row['unit_ID'],
																"index"=>$counter,
																"name"=>$row['unit_name'],
																"angriff"=>$row['unit_angriffswert'],
																"verteidigung"=>$row['unit_verteidigungswert'],
																"bewegung"=>$row['unit_bewegungstempo'],
																"laderaum"=>$row['unit_laderaum'],
																"menge"=>$row['ug_menge'],
																"attacked"=>0));
							$this->countDefend++;
							$counter++;
						}
						$this->defendUnitsCopy = $this->defendUnits;
						if($this->countAttack > 0) {
							if($this->fight()==1) {
								return array("generatedID"=>$this->generatedID,
											 "win"=>$this->win,
											 "password"=>$this->generatedPass,
											 "hashedPass"=>$this->hashedPass);
							}
						}
					}
				}
			}
			return false;
		}
		
		function fight() {
			for($i=0;$i<count($this->defendUnits);$i++) {
				$defend = $this->defendUnits[$i];
				if($defend['menge']==0) {
					continue;
				}
				$weiter = false;
				$free = array();
				foreach($this->attackUnitsCopy as $attack) {
					if($attack['menge']>0 AND $attack['attacked']==0) {
						$weiter=true;
						array_push($free,$attack['index']);
					}
				}
				if(!$weiter) {
					break;
				}
				shuffle($free);
				$attackID = array_shift($free);
				$attack = $this->attackUnitsCopy[$attackID];
				$old_defend_attack = $defend_attack = $defend['menge']*$defend['angriff'];
				$old_attack_defend = $attack_defend = $attack['menge']*$attack['verteidigung'];
				do {
					$defend_attack = $this->moral($defend_attack);
					$attack_defend = $this->moral($attack_defend);
				} while($attack_defend==$defend_attack);
				$query = "INSERT INTO ".$this->db->prefix()."kb
						  SET `kb_generatedID`='".$this->generatedID."',
						  `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(($old_attack_defend - $old_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()."',
						   `kb_pass`='".$this->hashedPass."'";
				$this->db->query($query);
				$this->attackUnitsCopy[$attackID]['menge'] = $attack['menge'];
				$this->attackUnitsCopy[$attackID]['attacked'] = $attack['attacked'];
			}
			for($i=0;$i<count($this->attackUnits);$i++) {
				$attack = $this->attackUnits[$i];
				if($attack['menge']==0) {
					continue;
				}
				$weiter = false;
				$free = array();
				foreach($this->defendUnitsCopy as $defend) {
					if($defend['menge']>0 AND $defend['attacked']==0) {
						$weiter=true;
						array_push($free,$defend['index']);
					}
				}
				if(!$weiter) {
					break;
				}
				shuffle($free);
				$defendID = array_shift($free);
				$defend = $this->defendUnitsCopy[$defendID];
				$old_attack_attack = $attack_attack = $attack['menge']*$attack['angriff'];
				$old_defend_defend = $defend_defend = $defend['menge']*$defend['verteidigung'];
				do
				{
					$defend_defend = $this->moral($defend_defend);
					$attack_attack = $this->moral($attack_attack);
				} while($attack_attack==$defend_defend);
				$query = "INSERT INTO ".$this->db->prefix()."kb
						  SET `kb_generatedID`='".$this->generatedID."',
						  `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(($old_defend_defend - $old_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()."',
						   `kb_pass`='".$this->hashedPass."'";
				$this->db->query($query);
				$this->defendUnitsCopy[$defendID]['menge'] = $defend['menge'];
				$this->defendUnitsCopy[$defendID]['attacked'] = $defend['attacked'];
			}
			for($i=0;$i<count($this->attackUnitsCopy);$i++) {
				if($this->attackUnitsCopy[$i]['menge']>0) {
					$this->attackUnitsCopy[$i]['attacked'] = 0;
				}
			}
			for($i=0;$i<count($this->defendUnitsCopy);$i++) {
				if($this->defendUnitsCopy[$i]['menge']>0) {
					$this->defendUnitsCopy[$i]['attacked'] = 0;
				}
			}
			$this->attackUnits = $this->attackUnitsCopy;
			$this->defendUnits = $this->defendUnitsCopy;
			$this->round++;
			$end = false;
			if($this->countAttack<=0 AND $this->countDefend<=0) {
				$this->win = 0;
				$end = true;
			} else if($this->countAttack<=0) {
				$this->win = 1;
				$end = true;
			} else if($this->countDefend<=0) {
				$this->win = 2;
				$end = true;
			}
			if($this->round<1000 AND !$end) {
				$this->fight();
			}
			if($this->end()) {
				return 1;
			}
			return false;
		}
		
		function end() {
			foreach($this->defendUnits as $defend) {
				$query = "UPDATE ".$this->db->prefix()."unit_group SET `ug_menge`='".$defend['menge']."' WHERE `ug_unitID`='".$defend['ID']."' AND `ug_landID`='".$this->zielID."'";
				$this->db->query($query);
			}
			foreach($this->attackUnits as $attack) {
				$query = "UPDATE ".$this->db->prefix()."away_flotte SET `af_menge`='".$attack['menge']."' WHERE `af_unitID`='".$attack['ID']."' AND `af_awayID`='".$this->awayID."'";
				$this->db->query($query);
			}
			return true;
		}
		
		function moral($input) {
			$random = rand(1,100);
			switch($random) {
				case $random<80:
					if(rand(0,1)) {
						$input += $input * 1/100;
					} else {
						$input -= $input * 1/100;
					}
					break;
				case $random<90:
					if(rand(0,1)) {
						$input += $input * 3/100;
					} else {
						$input -= $input * 3/100;
					}
					break;
				case $random<95:
					if(rand(0,1)) {
						$input += $input * 5/100;
					} else {
						$input -= $input * 5/100;
					}
					break;
				case $random<98:
					if(rand(0,1)) {
						$input += $input * 7/100;
					} else {
						$input -= $input * 7/100;
					}
					break;
				case $random<99:
					if(rand(0,1)) {
						$input += $input * 9/100;
					} else {
						$input -= $input * 9/100;
					}
					break;
				case $random<=100:
					if(rand(0,1)) {
						$input += $input * 11/100;
					} else {
						$input -= $input * 11/100;
					}
					break;
			}
			return $input;
		}
		
		function generateID() {
			do {
				$randomID = rand(10000000000,99999999999);
				$query = "SELECT `kb_generatedID` FROM ".$this->db->prefix()."kb WHERE `kb_generatedID`='".$randomID."'";
				$result = $this->db->query($query);
			} while($result->get_num_rows()!=0);
			$this->generatedID = $randomID;
		}
		
		function generatePass() {
			do {
				$randomID = rand(100000,999999);
				$query = "SELECT `kb_pass` FROM ".$this->db->prefix()."kb WHERE `kb_pass`='".hash('sha256',$randomID)."'";
				$result = $this->db->query($query);
			} while($result->get_num_rows()!=0);
			$this->generatedPass = $randomID;
			$this->hashedPass = hash('sha256',$randomID);
		}
	}
?>
 
Zuletzt bearbeitet:
Zurück