WinFuture-Forum.de: Hilfe Mit Funktion - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Hilfe Mit Funktion


#1 Mitglied ist offline   massemassimo 

  • Gruppe: Mitglieder
  • Beiträge: 9
  • Beigetreten: 09. August 07
  • Reputation: 0

geschrieben 10. August 2007 - 09:29

Hallo allerseits,

ich habe gerade meine erste Php Seite geschrieben,

als Projekt habe ich mir Risiko ausgesucht. Also nicht das komplette Spiel sondern ich wollte mir die Chancen berechnen lassen die der Angreifer und der Verteidiger jeweils hat.

Wer das System nicht kennt kann den Absatz weiterlesen, der Rest kann direkt schauen was mit meinem Code nicht stimmt! :(

Der Angreifer kann mit 3 Truppen angreifen, der Verteidiger verteidigt mit zweien. (jeweils maximal, aber ich gehe bei meinem Programm der Einfachheit halber davon aus, dass unendlich Truppen zur Verfügung stehen)
Die Augenzahl des höchsten Würfels des Angreifers wird mit der Augenzahl des höchsten Würfels des Verteidigers verglichen. Dasselbe geschieht mit dem zweithöchsten Angreiferwürfel und dem verbleibenden Verteidigerwürfel. Soweit hat der Angreifer den Vorteil, denn er kann die zwei besten Würfel der 3 gewürfelten auswählen.
Vorteil des Verteidigers: Bei Gleichstand gewinnt er.

Beispiel: Angreifer würfelt 5,4,2. Verteidiger würfelt 4,4.
Zuerst wird also die 5 des Angreifers mit einer 4 des Verteidigers verglichen - der Angreifer gewinnt, der Verteidiger verliert also eine Truppe. Jetzt wird der zweithöchste Wurf des Angreifers (4) mit dem zweithöchsten Wurf des Verteidigers (ebenfalls 4) verglichen. Da bei Gleichstand der Verteidiger gewinnt, verliert der Angreifer eine Truppe. Somit steht es bei diesem Durchlauf 1-1.


Da ich zu doof bin um die Wahrscheinlichkeiten zu berechnen habe ich dieses Programm geschrieben um die Probe auf's Exempel zu machen:

test.html:
<html>
<head></head>
<body>
<FORM ACTION="bla.php" METHOD=POST>
<INPUT NAME="durchlaufzahl"> Durchlaeufe.<br>
<INPUT TYPE="submit">
</FORM>
</body>
</html>


bla.php:
<?php

mt_srand((double)microtime()*1000000); //Initialisierung des Zufallszahlengenerators

$durchlaufzahl = $_POST["durchlaufzahl"];

for ($i=0;$i<$durchlaufzahl;$i++) //Schleife fuer (durchlaufzahl) Durchgaenge

	
{ 	$a=mt_rand()%6+1; // $a, $b, $c sind Angreiferwuerfel
	$b=mt_rand()%6+1;
	$c=mt_rand()%6+1;
	$y=mt_rand()%6+1; // $y, $z sind Verteidigerwuerfel
	$z=mt_rand()%6+1;


	//Bestimmung der 2 besten Angreiferwuerfel

	if ($a>=$b>=$c) 
	{
		$at1=$a;
		$at2=$b;
	}
	else if ($a>=$c>=$b) 
	{
		$at1=$a;
		$at2=$c;
	}
	else if ($b>=$a>=$c) 
	{
		$at1=$b;
		$at2=$a;
	}
	else if ($b>=$c>=$a) 
	{
		$at1=$b;
		$at2=$c;
	}
	else if ($c>=$a>=$b) 
	{
		$at1=$c;
		$at2=$a;
	}
	else // ginge auch else if ($c>=$b>=$a) ?
	{ 
		$at1=$c;
		$at2=$b;
	}


	//Sortieren der Verteidigerwuerfel

	if ($y>=$z) {
		vt1=$y; // $vt1 = Verteidigerwuerfel mit hoechstem Wert
		vt2=$z; // $vt2 = Verteidigerwuerfel mit zweithoechstem Wert
	} else {
		vt1=$z;
		vt2=$y;
	}
		//Abgleich der Ergebnisse bzw Auswertung

	if ($vt1>=$at1) {
		$vt++;
	} else {
		$at++;
	}
	if ($vt2>=$at2) {
		$vt++;
	} else {
		$at++;
	}
	
}
//Be- und Verrechnungen

$summe=$vt+$at;
$prozat=$at/$summe*100;
$prozvt=$vt/$summe*100;

//Ausgabe der Ergebnisse

echo $prozat,"% Angreifersiege. ( ",$at," von ",$summe,") <br>";
echo $prozvt,"% Verteidigersiege. ( ",$vt," von ",$summe,") <br>";
?>

Dieser Beitrag wurde von massemassimo bearbeitet: 10. August 2007 - 09:34

0

Anzeige



#2 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 12. August 2007 - 13:09

Hi,

ich habe mir auch mal Gedanken darüber gemacht. Dein Code ist von der Idee her eigentlich schon ganz gut, nur leider stimmt die Syntax zum Teil nicht.
Außerdem halte ich es für sinnvoll, zu errechnen, ob ein Angreifersieg (also er gewinnt mit beiden Truppen), ein Unentschieden (jeder verliert eine Truppe) oder ein Verteidigersieg vorliegt.

Hier mal mein Code mit ein paar Kommentaren:
<?php

//Viele Durchläufe wegen "Gesetz der großen Zahlen"
$durchlaufzahl = 200000;

//Initialisierung der "Würfel"
$angreifer = array(0,0,0);
$verteidiger = array(0,0);

//Variablen um Siege zu zählen
$sieg_angreifer = 0;
$unentschieden = 0;
$sieg_verteidiger = 0;

//Statistik über Augenzahlverteilung
$angreifer_wuerfe = array(null,0,0,0,0,0,0);
$verteidiger_wuerfe = array(null,0,0,0,0,0,0);

echo "<h2>Wahrscheinlichkeit bei Risiko</h2><b>Annahme:</b> Angreifer würfelt mit drei Würfeln, Verteidiger würfelt mit zwei Würfeln.<br />";

//Schleife für (durchlaufzahl) Durchgänge
for ($i=0; $i < $durchlaufzahl; $i++)
{
	//Angreifer würfelt dreimal
	$angreifer[0] = mt_rand(1,6);
	$angreifer[1] = mt_rand(1,6);
	$angreifer[2] = mt_rand(1,6);
	
	//Statistik, wie oft würfelt der Angreifer welche Augenzahl
	$angreifer_wuerfe[$angreifer[0]]++;
	$angreifer_wuerfe[$angreifer[1]]++;
	$angreifer_wuerfe[$angreifer[2]]++;
	
	//Verteidiger würfelt zweimal
	$verteidiger[0] = mt_rand(1,6);
	$verteidiger[1] = mt_rand(1,6);
	
	//Statistik, wie oft würfelt der Verteidiger welche Augenzahl
	$verteidiger_wuerfe[$verteidiger[0]]++;
	$verteidiger_wuerfe[$verteidiger[1]]++;

	//Sortieren der Würfelzahlen
	rsort($angreifer);
	rsort($verteidiger);

	//Vergleich der größten Augenzahlen
	if (($angreifer[0] > $verteidiger[0]) && ($angreifer[1] > $verteidiger[1])) { 	//falls beide Angreiferaugenzahlen größer sind
		$sieg_angreifer++;
	} elseif (($angreifer[0] <= $verteidiger[0]) && ($angreifer[1] <= $verteidiger[1])) {	//falls beide Verteidigeraugenzahlen größer gleich den Angreiferaugenzahlen sind
		$sieg_verteidiger++;
	} else {	//falls je ein Angreiferwürfel und ein Verteidigerwürfel gewinnt
		$unentschieden++;
	}
	
}

//Es werden soviele Kämpfe duchgeführt wie Durchläufe
$summe = $durchlaufzahl;

//Ausgabe der Ergebnisse als Prozentzahlen mit drei Nachkommastellen
echo "<pre>";
echo number_format($sieg_angreifer / $summe * 100, 3)." % Angreifersiege		(d.h. Verteidiger verliert zwei Truppen)				(".$sieg_angreifer." von ".$summe.")<br />";
echo number_format($unentschieden / $summe * 100, 3)." % unentschieden		(d.h. sowohl Angreifer als auch Verteidiger verlieren eine Truppe)	(".$unentschieden." von ".$summe.")<br />";
echo number_format($sieg_verteidiger / $summe * 100, 3)." % Verteidigersiege	(d.h. Angreifer verliert zwei Truppen)					(".$sieg_verteidiger." von ".$summe.")<br />";
echo "</pre>";

//Ausgabe der Würfelstatistik für Angreifer
echo "Würfelstatistik:<br /><br />Angreifer:<pre>Zahl	Würfe		SOLL-Wurfzahl für Laplace-Würfel: ".floor($durchlaufzahl * 0.5)."<br />";

foreach($angreifer_wuerfe as $zahl => $wuerfe) {
	if ($zahl) echo $zahl."	".$wuerfe."<br />";
}

echo "</pre>";

//Ausgabe der Würfelstatistik für Verteidiger
echo "<br />Verteidiger:<pre>Zahl	Würfe		SOLL-Wurfzahl für Laplace-Würfel: ".floor($durchlaufzahl * 1/3)."<br />";

foreach($verteidiger_wuerfe as $zahl => $wuerfe) {
	if ($zahl) echo $zahl."	".$wuerfe."<br />";
}

echo "</pre>";

?>


Zu den Syntaxfehlern in deinem Code. Die obere und untere Grenze der erzeugten Werte von mt_rand() werden als Argumente übergeben: int mt_rand( [int $min, int $max] ) und brauchen nicht mit Modulo erzeugt werden.
In PHP ist es nicht möglich mit $a>=$b>=$c die Abhängigkeiten zueinander zu Prüfen. Das kannst du zum Beispiel mit diesem Ausdruck prüfen: (($a>=$b) && ($b>=$c)). Beim Sortieren der Verteidigerwürfel hast du bei den Variablen vt1 und vt2 die Dollerzeichen davor vergessen.
Wenn man das alles ausbessert, dürfte dein Skript laufen.

Gruß,
Stefan

Dieser Beitrag wurde von Diewie bearbeitet: 13. August 2007 - 16:42

0

#3 Mitglied ist offline   massemassimo 

  • Gruppe: Mitglieder
  • Beiträge: 9
  • Beigetreten: 09. August 07
  • Reputation: 0

geschrieben 13. August 2007 - 14:09

Wow, vielen Dank, das war
1. ausführlicher und
2. besser als erwartet. :)

Vielen, vielen Dank!! Hatte die Hoffnung auf eine Antwort schon aufgegeben.

Die vergessenen Dollarzeichen von mir waren natürlich peinlich. (($a>=$b) && ($b>=$c)) hatte ich mal, aber da auch das kein Ergebnis erzielte hab ich es erstmal rückgängig gemacht.
Das mit der Initialisierung mt_rand war ausdrücklich in meinem PHP Buch so beschrieben, dem Autor sollte ich mal die Löffel langziehen. ^_^

Ergebnisse sollen natürlich auch mitgeteilt werden, für alle die's interessiert:

Wahrscheinlichkeit bei Risiko
Annahme: Angreifer würfelt mit drei Würfeln, Verteidiger würfelt mit zwei Würfeln.

18.637 % Angreifersiege (d.h. Verteidiger verliert zwei Truppen) (74548 von 400000)

16.700 % unentschieden (d.h. sowohl Angreifer als auch Verteidiger verlieren eine Truppe) (66799 von 400000)

14.663 % Verteidigersiege (d.h. Angreifer verliert zwei Truppen) (58653 von 400000)

Dieser Beitrag wurde von massemassimo bearbeitet: 13. August 2007 - 14:15

0

#4 Mitglied ist offline   dblay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.246
  • Beigetreten: 18. März 07
  • Reputation: 1

geschrieben 13. August 2007 - 15:00

Zitat

18.637 % Angreifersiege (d.h. Verteidiger verliert zwei Truppen) (74548 von 400000)

16.700 % unentschieden (d.h. sowohl Angreifer als auch Verteidiger verlieren eine Truppe) (66799 von 400000)

14.663 % Verteidigersiege (d.h. Angreifer verliert zwei Truppen) (58653 von 400000)
Und was passiert in den restlichen 50% der Fälle?
Zeit ist, was verhindert, dass alles gleichzeitig passiert.
0

#5 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 13. August 2007 - 16:44

 Zitat (dblay: 13.08.2007, 16:00)

Und was passiert in den restlichen 50% der Fälle?


Mein Fehler :wink: Hab vorm posten leider noch fälschlicherweise ein mal 2 eingefügt. Der Code oben ist schon verbessert.

Hier nochmal die korrigierte Ausgabe:
Wahrscheinlichkeit bei Risiko
Annahme: Angreifer würfelt mit drei Würfeln, Verteidiger würfelt mit zwei Würfeln.
37.004 % Angreifersiege		(d.h. Verteidiger verliert zwei Truppen)				(148017 von 400000)
33.680 % unentschieden		(d.h. sowohl Angreifer als auch Verteidiger verlieren eine Truppe)	(134720 von 400000)
29.316 % Verteidigersiege	(d.h. Angreifer verliert zwei Truppen)					(117263 von 400000)
Würfelstatistik:

Angreifer:
Zahl	Würfe		SOLL-Wurfzahl für Laplace-Würfel: 200000
1	200150
2	200999
3	199304
4	199692
5	200042
6	199813

Verteidiger:
Zahl	Würfe		SOLL-Wurfzahl für Laplace-Würfel: 133333
1	133373
2	132923
3	133204
4	133416
5	133462
6	133622


Gruß,
Stefan
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0