Algorithme pour jeux de flechettes

Petit nouveau ! | 2 Messages

29 déc. 2011, 02:59

Bonjour a tous .
J'ai reçu ce noël une jolie cible de fléchette (non électronique) .
J'aime jouer au 501 avec mes amis, seulement a chaque coup calculer manuellement la somme des point puis la soustraire aux capital .... ( ca va deux parties, après ... #-o ).

C'est pourquoi j'ai développé une interface en HTML-CSS-JAVASCRIPT-PHP , me permettant de jouer de 1 à 6 joueurs, d'afficher l'historique de chaque joueurs pour la partie en cours et surtout de faire le calcul cité ci dessus .

Tout fonctionne impeccable !!!

Alors pourquoi ce message .... Simplement car comme tout développeur , j'aime paufiner et améliorer mes projets .
C'est pourquoi j'ai eu l'idée d'afficher au joueur avant qu'il ne joue un zone conseil avec les coup à jouer pour gagner la partie le meme tour .

Ex : Il reste au joueur un capital de 113 Points . je lui affiche :
  • Un triple 19 ( 57 pts )
  • Un Double 18 ( 36 pts )
  • Un Simple 20 ( 20 pts )
Pour ceux qui connaissent le 501 aux fléchettes, et qui ont compris mon explication et mon idée, voici l'algorithme permettant de faire cela :
for($x = 1 ; $x <= 20;$x = $x +1 ){for($y = 2; $y <= 40; $y = $y + 2){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
Et voici cet algorithme utiliser dans le script :
                $max_pts = $_POST['max_pts'];
		$tot = $max_pts ;

		// Simple + Double
		if($tot > 0 and $tot < 6){
			for($x = 0 ; $x <= 5;$x = $x +1 ){for($y = 2; $y <= 4; $y = $y + 2){if($x + $y == $tot){$a = $x ;$b = $y ;}}}
			if(isset($a) and $b){
				if($a > 0){$helper .= '<li>Un Simple '.$a ;}
				$helper .= '<li>Un Double '.($b/2) ;	
			}	
		}
		// Simple + Double + Triple
		elseif($tot >= 6 and $tot <= 120){
			for($x = 1 ; $x <= 20;$x = $x +1 ){for($y = 2; $y <= 40; $y = $y + 2){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				$helper .= '<li>Un Triple '.($c/3) ;
				$helper .= '<li>Un Double '.($b/2) ;
				$helper .= '<li>Un Simple '.$a ;	
			}
		}
		// Double + Double + Triple
		elseif($tot > 120 and $tot <= 140){
			for($x = 2 ; $x <= 40;$x = $x +2 ){for($y = 2; $y <= 40; $y = $y + 2){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				$helper .= '<li>Un Triple '.($c/3) ;
				$helper .= '<li>Un Double '.($b/2) ;
				$helper .= '<li>Un Double '.($a/2) ;
			}
		}
		// Triple + Triple + Triple
		elseif($tot > 140 and $tot <= 180){
			for($x = 3 ; $x <= 60;$x = $x +3 ){for($y = 3; $y <= 60; $y = $y + 3){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				$helper .= '<li>Un Triple '.($c/3) ;
				$helper .= '<li>Un Triple '.($b/3) ;
				$helper .= '<li>Un Triple '.($a/3) ;
			}	
		}
Comme vous pouvez le constater j'ai ajouter des vérifications de hauteur de $tot afin d'ajuster l'algorithme .

Pour information, j'ai remplis x pages A4 de formules, calculs, tableaux,etc afin de pondre un algorithme efficace, j'ai clairement galéré là dessus .

Au final la seule solution qui fonctionne à tous les coups ( de 2 à 180 ), c'est en imbriquant 3 boucles ( c'est pas terrible pour les ressources ) .

Si vous trouvez des améliorations à cet algorithme, ou trouvez une meilleur méthode, n'hésitez pas !

A oui pour les curieux : Darts ( By Raphael.A) <-- Mon Application de fléchettes ( nécessite une cible et des fléchettes :D ) .

A bientot

ViPHP
ViPHP | 3607 Messages

29 déc. 2011, 12:09

ça à l'air intéressant, pour le peu que j'ai testé :)
Un détail mais qui a son importance, je me vois proposé ceci pour gagner :
Flechette 1 : Un Triple 2
Flechette 2 : Un Double 17
Flechette 3 : Un Simple 20
Il faudrait revoir l'algo pour qu'au lieu d'un triple 2, on me propose un Simple 6, c'est tout de même plus simple à atteindre non ?
Là le cas est simple, mais il faudrait faire en sorte que les simples soient privilégiés, si ça n'est pas possible, on ajoute des doubles et ensuite des triples...

Bonne continuation,

Petit nouveau ! | 2 Messages

29 déc. 2011, 15:12

En effet , il faudrait que l'algorithme favorise les simples .

Après je me rend compte d'un autre petit souci :

La règle du 501 / 301 oblige le joueur a faire un double le dernier coup, donc il faut que dans ma combinaison affichée il y est toujours au moins un double !

Je me penche la dessus ...

...Voila je me suis penché dessus.

Voici la dernière version de l'algorithme :
$max_pts = $_POST['max_pts'];
		
		$tot = $max_pts ;
		// Simple + Double
		if($tot > 0 and $tot < 6){
			for($x = 0 ; $x <= 5;$x = $x +1 ){for($y = 2; $y <= 4; $y = $y + 2){if($x + $y == $tot){$a = $x ;$b = $y ;}}}
			if(isset($a) and $b){
				$helper .= '<li>Flechette 1 : Un Double '.($b/2).'</li>'  ;	
				if($a > 0){$helper .= '<li>Flechette 2 : Un Simple '.$a.'</li>'  ;}
			}	
		}
		// Simple + Double + Triple
		elseif($tot >= 6 and $tot <= 120){
			for($x = 1 ; $x <= 20;$x = $x +1 ){for($y = 2; $y <= 40; $y = $y + 2){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				if($c > 0 and $c <= 20){
					$helper .= '<li>Flechette 1 : Un Simple '.$c.'</li>'  ;
				}
				elseif($c > 20 and $c <= 40 and ($c%2) == 0){
					$helper .= '<li>Flechette 1 : Un Double '.($c/2).'</li>'  ;
				}
				elseif($c > 40 and ($c%3) == 0){
					$helper .= '<li>Flechette 1 : Un Triple '.($c/3).'</li>'  ;
				}
				$helper .= '<li>Flechette 2 : Un Double '.($b/2).'</li>'  ;
				$helper .= '<li>Flechette 3 : Un Simple '.$a.'</li>'  ;
			}
		}
		// Double + Double + Triple
		elseif($tot > 120 and $tot <= 140){
			for($x = 2 ; $x <= 40;$x = $x +2 ){for($y = 2; $y <= 40; $y = $y + 2){for($z = 3; $z <= 60;$z = $z + 3 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				if($c > 0 and $c <= 20){
					$helper .= '<li>Flechette 1 : Un Simple '.$c.'</li>'  ;
				}
				elseif($c > 20 and $c <= 40 and ($c%2) == 0){
					$helper .= '<li>Flechette 1 : Un Double '.($c/2).'</li>'  ;
				}
				elseif($c > 40 and ($c%3) == 0){
					$helper .= '<li>Flechette 1 : Un Triple '.($c/3).'</li>'  ;
				}
				if($b > 0 and $b <= 20){
					$helper .= '<li>Flechette 2 : Un Simple '.$b.'</li>'  ;
				}
				elseif($b > 20 and $b <= 40 and ($b%2) == 0){
					$helper .= '<li>Flechette 2 : Un Double '.($b/2).'</li>'  ;
				}
				elseif($b > 40 and ($b%3) == 0){
					$helper .= '<li>Flechette 2 : Un Triple '.($b/3).'</li>'  ;
				}
				if($a > 0 and $a <= 20){
					$helper .= '<li>Flechette 3 : Un Simple '.$a.'</li>'  ;
				}
				elseif($a > 20 and $a <= 40 and ($a%2) == 0){
					$helper .= '<li>Flechette 3 : Un Double '.($a/2).'</li>'  ;
				}
				elseif($a > 40 and ($a%3) == 0){
					$helper .= '<li>Flechette 3 : Un Triple '.($a/3).'</li>'  ;
				}
			}
		}
		// Triple + Triple + Double
		elseif($tot > 140 and $tot <= 160){
			for($x = 3 ; $x <= 60;$x = $x +3 ){for($y = 3; $y <= 60; $y = $y + 3){for($z = 2; $z <= 40;$z = $z + 2 ){if($x + $y + $z == $tot){$a = $x ;$b = $y ;$c = $z ;}}}}
			if($a and $b and $c){
				if($c > 0 and $c <= 20){
					$helper .= '<li>Flechette 1 : Un Simple '.$c.'</li>'  ;
				}
				elseif($c > 20 and $c <= 40 and ($c%2) == 0){
					$helper .= '<li>Flechette 1 : Un Double '.($c/2).'</li>'  ;
				}
				elseif($c > 40 and ($c%3) == 0){
					$helper .= '<li>Flechette 1 : Un Triple '.($c/3).'</li>'  ;
				}
				if($b > 0 and $b <= 20){
					$helper .= '<li>Flechette 2 : Un Simple '.$b.'</li>'  ;
				}
				elseif($b > 20 and $b <= 40 and ($b%2) == 0){
					$helper .= '<li>Flechette 2 : Un Double '.($b/2).'</li>'  ;
				}
				elseif($b > 40 and ($b%3) == 0){
					$helper .= '<li>Flechette 2 : Un Triple '.($b/3).'</li>'  ;
				}
				$helper .= '<li>Flechette 3 : Un Double '.($a/2).'</li>'  ;
			}	
		}
Les modifications apportées :
- Vérifie pour chaque fléchettes de la combinaison trouvée, si il est possible d'afficher un simple, pui un double et sinon un triple ( favorise donc les simples ) .
- Propose toujours un double pour au moins une fléchettes ( c'est la règle du 501 /301 qui impose cela ) .
- Ne calcule plus de combinaison au dela d'un capital de 160 pts ( il est impossible de faire plus de 160 avec un double et deux triples ) .

Concernant l'application :
- J'ai ajouté une zone en bas de page avec les messages important de l'arbitre ... ( bon ou mauvais ) .
- j'ai ajouté une zone en haut a gauche "A PROPOS" , avec un lien vers mon mail, un lien vers mon Google+, et un petit bouton Donation ( on sait jamais ! lol ) .

Merci pour tes suggestions, n'hesite pas si tu trouve d'autres coquilles ou idées ...

A plus .

Mammouth du PHP | 790 Messages

15 avr. 2012, 13:51

super ça, j'ai de nombreux amis qui vont être content de l'utiliser !
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Eléphanteau du PHP | 11 Messages

02 juil. 2012, 16:35

Bonjour.

C'est une excellente idée cette petite interface :D
Sa donne envie d'en faire une aussi :wink: