Page 1 sur 1

Algorithme pour jeux de flechettes

Posté : 29 déc. 2011, 02:59
par Raphael.A
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

Re: Algorithme pour jeux de flechettes

Posté : 29 déc. 2011, 12:09
par jojolapine
ç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,

Re: Algorithme pour jeux de flechettes

Posté : 29 déc. 2011, 15:12
par Raphael.A
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 .

Re: Algorithme pour jeux de flechettes

Posté : 15 avr. 2012, 13:51
par juliette
super ça, j'ai de nombreux amis qui vont être content de l'utiliser !

Re: Algorithme pour jeux de flechettes

Posté : 02 juil. 2012, 16:35
par lola34
Bonjour.

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