Question Jeux de script d'hiver 2008

Plus d'informations
il y a 17 ans 4 mois #3110 par Grégory
Réponse de Grégory sur le sujet Re:Jeux de script d'hiver 2008
Voilà le premier JSH 2008

j'ai résolu mon problème en utilisant Group-object vu que cette commande permet de compter en même temps que de regrouper

du coup plus besoin de me galérer ;)

j'aurais pu faire plus simple sans passer par une hashtable d'autant plus que je me sers pas de la couleur par la suite mais j'avais envie de tester les hashtable.
du coup je passe par une hashtable pour repasser par un tableau ensuite alors que j'aurais pu passer par le tableau directement

voici donc le code
A vos critiques messieurs !! :laugh:

[code:1]
$tabcarte = (\"un\",\"deux\",\"trois\",\"quatre\",\"cinq\",\"six\",\"sept\",\"huit\",\"neuf\",\"dix\",\"valet\",\"dame\",\"roi\"«»)
$tabcouleur = (\"coeur\",\"carreau\",\"pique\",\"trèfle\"«»)
clear
$i=0
$tab=@{}

do{
do{

switch($i){
0{$num=\"première\"}
1{$num=\"seconde\"}
2{$num=\"troisième\"}
3{$num=\"quatrième\"}
4{$num=\"cinquième\"}
}


do{
$carte=read-host \"Veuillez entrer le nom de la $num carte \"
$var=$tabcarte|where{$_ -eq $carte}
}
until ($carte -eq $var)

do{
$couleur=read-host \"Veuillez entrer la couleur de la $num carte \"
$var=$tabcouleur|where{$_ -eq $couleur}
}
until ($couleur -eq $var)


$var=$main|where{$_ -eq $carte +\" de \"+ $couleur}

if($var -ne $carte+\" de \"+ $couleur)
{
$main+=@($carte+\" de \" + $couleur)
$nocarte=\"carte\"+$i
$tab.$nocarte=@{nom=$carte;couleur=$couleur}
$i++
$test=$true
}
else
{
write-host \"\"
write-host \"Cette carte a déjà été tirée, veuillez en saisir une autre \" -foregroundcolor \"red\"
write-host \"\"
$test=$false
}

}
until($test -eq $true)


}
until($i -eq 5)

write-host \"\"
write-host \"Composition de votre main :\"
$main

for($I=0;$I -le 5;$I++)
{
$nocarte=\"carte\"+$i
$tab2+=@($tab.$nocarte.nom)
}


write-host \"\"
$tabcount=$tab2|group-object
$tabcount|foreach{
$count=$_.count
$nom=$_.name
switch($count){
2{write-host \"il y a 1 paire de $nom\"}
3{write-host \"il y a 3 paires possibles de $nom\"}
4{write-host \"il y a 6 paires possibles de $nom\"}
}
write-host \"\"
}[/code:1]


EDIT : le 8ème fait dans la foulée :P

[code:1]clear
$count=0
$rand = New-Object System.Random
$numrand=$rand.next(0,50)

while($test -ne $true){
do{
$nb=read-host \"Entrez votre chiffre \"
}
until ($nb -ge 0 -and $nb -le 50)

$count+=1

if($nb -gt $numrand)
{
write-host \"Votre chiffre est trop grand.\"
}
elseif($nb -lt $numrand)
{
write-host \"Votre chiffre est trop petit.\"
}
else
{
write-host \"\"
write-host \"Gagné !!!\"
$test=$true
}
}

write-host \"\"
write-host \"le nombre était :\" $numrand
write-host \&quot;Nombre d'essai :\&quot;$count [/code:1]<br><br>Message édité par: Nostra, à: 29/10/08 10:35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3111 par Laurent Dardenne
Dans l'ensemble je le trouve très bien.
L'affichage des noms de carte et des couleurs n'aurait pas été inutile.

Pour la recherche dans les tableaux la méthode Contains de la classe System.Array optimiserai le traitement.
et ici
[code:1]
$main+=@($carte+\&quot; de \&quot; + $couleur)
[/code:1]
Il y a à mon avis un mélange entre les données et leur présentation...
Et enfin dans ce cas tu peux concaténer les 2 pipelines :
[code:1]
$tabcount=$tab2|group-object
$tabcount|foreach{
[/code:1]

Quant au switch on peut trés bien le regrouper dans une hastable ou un tableau.
C'est ce que j'ai fait.

Cela fait deux fois que je fais cet exercice et les 2 fois ma lecture des specs m'a joué des tours.
Enfin cela fait un exercice sur les structures de données, leur création est facilitée sous PS mais leur manipulation s'avére qq fois malaisé.

Donc voici le code autour d'un tableau de tableau, j'ai mixé un peu toutes les approches :
[code:1]
#Initialisation
#On utilise une valeur entiére comme nom de clé car random renvoi un entier
#On inverse la convention nom-valeur en valeur-nom, cela reste une hashtable ;«»-)
$Couleur=@{1=\&quot;Coeur\&quot;;2=\&quot;Pique\&quot;;3=\&quot;Trèfle\&quot;;4=\&quot;Carreau\&quot;}
$BornesCouleur=@{Min=1;Max=4}


$TypeCarte=@{1=\&quot;Un\&quot;;2=\&quot;Deux\&quot;;3=\&quot;Trois\&quot;;4=\&quot;Quatre\&quot;;5=\&quot;Cinq\&quot;;6=\&quot;Six\&quot;;7=\&quot;Sept\&quot;;8=\&quot;Huit\&quot;;
9=\&quot;Neuf\&quot;;10=\&quot;Dix\&quot;;11=\&quot;Valet\&quot;;12=\&quot;Dame\&quot;;13=\&quot;Roi\&quot;;14=\&quot;As\&quot;}
$BornesCarte=@{Min=1;Max=14}
$NbCartes=5

#Générateur aléatoire
$Rnd= New-Object System.Random

function Get-Carte
{ #Renvoi un tableau d'entier composé de 2 éléments générés automatiquement
return [int[]]$A=@(
#Génère le type de la carte
($Rnd.Next($BornesCarte.Min,$BornesCarte.Max)),
#Génère sa couleur
($Rnd.Next($BornesCouleur.Min,$BornesCouleur.Max))
)
}

function Get-Jeux
{ #On redistribue 5 cartes
$global:Jeux=new-object \&quot;Array[]\&quot; $NbCartes
#Jeux est un tableau de tableaux
#Jeux[1 [Carte,Couleur], 2 [Carte,Couleur],...]
#Si on utilise un tableau à 2 dimensions Jeux[5,2], l'énumérateur renvoi les valeurs en
#considérant $Jeux comme étant un tableau à une dimension $Jeux[10].
#Selon le choix de départ( carte,couleur) le nom de la carte est sur un indice pair
# et la couleur sur un indice impair...

#On rempli le tableau de cartes
for ($I=0;$I -lt $NbCartes;$I++)
{
do{
#On tire une nouvelle carte
$Current=Get-Carte
#Jusqu'à ce que la carte courante soit inexistante dans le jeux
} until ( ($global:Jeux -like $Current).Count -eq 0)
#On ajoute la nouvelle carte dans le jeux
$global:Jeux[$I]=$Current
}
}


function AfficheLaMain
{ #On affiche le nom de la carte et le nom de la couleur
# $_ est un tableaux à une dimension contenant 2 éléments [carte,couleur]
$global:Jeux| % {\&quot;{0} de {1}\&quot; -F $TypeCarte.($_[0]),$Couleur.($_[1])}
}

function NouveauJeux
{
Get-Jeux
AfficheLaMain
}

# ---- Main
NouveauJeux



#Affiche le contenu de la main, s'il existe des paires
$global:Jeux|`
# On regroupe sur la première colonne, i.e. le type de carte
group {$_[0]}|`
# On ne prend que les groupes de paires
Where {$_.Count -eq 2}|`
#On construit l'affichage
#Pour chaque groupe :
# Ajoute le nom de la carte ($_.Values)
foreach {
(\&quot;Une paire de {0} : \&quot; -F $TypeCarte.$($_.Values))+
#Ajoute le détail des 2 cartes constituant la paire ( $_.group)
($_.Group|% {\&quot;{0} de {1}\&quot; -F $TypeCarte.($_[0]),$Couleur.($_[1])})
}
[/code:1]
Il reste l'affichage lorsqu'il n'existe aucune carte.
Je copierais ensuite une version autour d'une hastable.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3114 par Grégory
Réponse de Grégory sur le sujet Re:Jeux de script d'hiver 2008
Salut Laurent

c'est vrai que l'affichage des noms et couleurs aurait pu être utile (ie: un ou as)

j'ai utilisé mon tableau $main pour me simplifier le test pour savoir si la carte a déjà été tiré.
j'étais parti pour faire le test sur la hashtable (et donc supprimer le tableau $main) mais je me suis galéré (et j'ai un peu abandonné devant la complexité il faut avouer ;))

ça marchait de façon bancale, c'est pour ça que j'ai remis $main même si c'était plus lourd et il me sert pour afficher la main facilement au lieu de faire une boucle sur la hashtable

j'ai fait une V2 (mais je vais pas la poster ça prend de la place pour pas grand chose) où j'ai viré la hashtable et remis un second tableau, ça me gagne 7/8 lignes


Concernant ton code :
c'est vraiment très bien pensé ton tirage aléatoire de carte
et ça me donne une très bonne piste pour le Black Jack ;)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3117 par Grégory
Réponse de Grégory sur le sujet Re:Jeux de script d'hiver 2008
Bon je me suis lancé sur le Black Jack :laugh:

finalement je ne fais pas comme toi Laurent
(je suis assez fier de moi pour le coup :laugh: )

je crée mon jeu de 52 cartes dans une hashtable :
$jeux.carte0...
$jeux.carte1...
...
$jeux.carte51

puis je fais un random entre 0 et 51
et je sors la carte de la hashtable

Mais (ben oui faut bien un mais)j'ai un problème
je me sers de $histo pour faire un historique des random pour ne pas retirer la même carte
le problème c'est que ça n'a pas l'air de marcher avec une fonction
du coup mon historique est vierge à chaque fois que j'appelle ma fonction ...

une idée pour résoudre ce problème ?


[code:1]
$tabcarte = (\&quot;as\&quot;,\&quot;deux\&quot;,\&quot;trois\&quot;,\&quot;quatre\&quot;,\&quot;cinq\&quot;,\&quot;six\&quot;,\&quot;sept\&quot;,\&quot;huit\&quot;,\&quot;neuf\&quot;,\&quot;dix\&quot;,\&quot;valet\&quot;,\&quot;dame\&quot;,\&quot;roi\&quot;«»)
$tabcouleur = (\&quot;coeur\&quot;,\&quot;carreau\&quot;,\&quot;pique\&quot;,\&quot;trèfle\&quot;«»)
$jeux=@{}
$rand = New-Object System.Random

clear
$I=0

$tabcarte|foreach{
$var=$_
$tabcouleur|foreach{
$nocarte=\&quot;carte\&quot;+$I
switch($var){
\&quot;as\&quot;{$val=11}
\&quot;deux\&quot;{$val=2}
\&quot;trois\&quot;{$val=3}
\&quot;quatre\&quot;{$val=4}
\&quot;cinq\&quot;{$val=5}
\&quot;six\&quot;{$val=6}
\&quot;sept\&quot;{$val=7}
\&quot;huit\&quot;{$val=8}
\&quot;neuf\&quot;{$val=9}
\&quot;dix\&quot;{$val=10}
\&quot;valet\&quot;{$val=10}
\&quot;dame\&quot;{$val=10}
\&quot;roi\&quot;{$val=10}
}

$jeux.$nocarte=@{nom=$var;couleur=$_;valeur=$val}
$I++
}
}


function get-carte{
do{
$var=$histo|where{$_ -eq $numrand}
$numrand=$rand.next(0,51)
if($var -ne $numrand)
{
$nocarte=\&quot;carte\&quot;+$numrand
write-host $jeux.$nocarte.nom \&quot;de\&quot; $jeux.$nocarte.couleur
$histo+=@($numrand)
$histo
$test=$true
}
}until($test -eq $true)

}


write-host \&quot;\&quot;
get-carte
[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3118 par Laurent Dardenne
Nostra écrit:

j'ai utilisé mon tableau $main pour me simplifier le test pour savoir si la carte a déjà été tiré.

Oui ce n'est pas le plus trivial en PS
Nostra écrit:

mais je me suis galéré (et j'ai un peu abandonné devant la complexité il faut avouer)

Dommage que tu n'aies pas demandé de l'aide sur ce point, puisque tu ne sais pas si c'est vraiment complexe ou si ton approche de départ était erroné, par erreur ou par méconnaissance.
C'est aussi ce type d'expérience qui permet d'approfondir un langage. Un exercice comme celui-ci peut se révéler très instructif à cet égard.
Nostra écrit:

j'ai fait une V2 (mais je vais pas la poster ça prend de la place pour pas grand chose)

Cela peut tjr servir à d'autres.
Nostra écrit:

c'est vraiment très bien pensé ton tirage aléatoire de carte

Tu as fait le même chose dans le 8ième exercice, dans mon cas la structure de donnée est construite autour du résultat de la fonction random.


La version autour d'une hashtable. Les données de bases sont identiques.

Ici je n'ai pas divisé le code en function, la création de la hashtable parait donc plus simple mais on garde la même approche que pour un tableau.

Les noms de carte et de couleurs sont insérés en tant que String et non plus en index des hashtables respectives.

Le code de recherche de doublon est plus long car l'opérateur contains n'est pas possible ici.
voir aussi : pshscripts.blogspot.com/2008/07/contains-hashtableps1.html

En revanche l'usage du type string pour la valeur des clés facilite les opérations d'affichage :
[code:1]
$Couleur=@{1=\&quot;Coeur\&quot;;2=\&quot;Pique\&quot;;3=\&quot;Trèfle\&quot;;4=\&quot;Carreau\&quot;}
$BornesCouleur=@{Min=1;Max=4}


$TypeCarte=@{1=\&quot;Un\&quot;;2=\&quot;Deux\&quot;;3=\&quot;Trois\&quot;;4=\&quot;Quatre\&quot;;5=\&quot;Cinq\&quot;;6=\&quot;Six\&quot;;7=\&quot;Sept\&quot;;8=\&quot;Huit\&quot;;
9=\&quot;Neuf\&quot;;10=\&quot;Dix\&quot;;11=\&quot;Valet\&quot;;12=\&quot;Dame\&quot;;13=\&quot;Roi\&quot;;14=\&quot;As\&quot;}
$BornesCarte=@{Min=1;Max=14}
$NbCartes=5

$Rnd = New-Object System.Random


$tab=@{}
#$Tab est une hashtable de hashtable
# $Tab.Carte1.Nom,$Tab.Carte1.Couleur, $Tab.Carte2.Nom ...
for ($I=1;$I -le $NbCartes;$I++)
{
do{
Write-debug \&quot;carte$i\&quot;
$Carte=@{
nom=$TypeCarte.($Rnd.Next($BornesCarte.Min,$BornesCarte.Max));
couleur=$Couleur.($Rnd.Next($BornesCouleur.Min,$BornesCouleur.Max))
}
#$_.Value contient une hastable de type @{Nom=x; Couleur=y}
} until ( ($tab.GetEnumerator() |? {($_.value.nom -eq $carte.nom) -and ($_.value.couleur -eq $carte.Couleur)}|measure).count -eq 0)
$tab.\&quot;carte$i\&quot;=$Carte
}

$tab.GetEnumerator()|Sort name|%{\&quot;{0} de {1}\&quot; -F $_.value.Nom,$_.value.Couleur}

#Affiche le contenu de la main, s'il existe des paires
$tab.GetEnumerator()|`
# On regroupe sur la première colonne, i.e. le type de carte
group {$_.value.Nom}|`
# On ne prend que les groupes de paires
Where {$_.Count -eq 2}|`
#On construit l'affichage
#Pour chaque groupe :
# Ajoute le nom de la carte ($_.Values)
foreach {(\&quot;Une paire de {0} : \&quot; -F $_.Name)+
#Ajoute le détail des 2 cartes constituant la paire ( $_.group)
($_.Group|% {\&quot;{0} de {1}\&quot; -F $_.Value.Nom,$_.Value.couleur})}
[/code:1]
Dans ce cas on ne peut pas construire la hastable ainsi :

$Tab.\&quot;Huit\&quot;.\&quot;Tréfle\&quot;
$Tab.\&quot;As\&quot;.\&quot;Coeur\&quot;

Car le nom de chaque clé est unique dans une hastable.
Celle-ci reste possible :

$Tab.\&quot;Huit\&quot;=@(\&quot;Tréfle\&quot;,\&quot;Carreau\&quot;)
$Tab.\&quot;As\&quot;=@(\&quot;Tréfle\&quot;)

[code:1]
#
$Tab=@{}
#for ..
$Tab.($TypeCarte.($Rnd.Next($BornesCarte.Min,$BornesCarte.Max)))+=$Couleur.($Rnd.Next($BornesCouleur.Min,$BornesCouleur.Max))
[/code:1]
Mais ici c'est la présence du tableau, qui lui autorise les doublons, complique un peu les manipulations.
Une autre approche en ne tenant pas compte de la valeur de la clé, toujours à 0, car seul le nom de la clé nous intéresse :

#Ici seul le nom de la clé nous intéresse
$Tab.\&quot;Huit\&quot;=@{\&quot;Tréfle\&quot;=0;\&quot;Carreau\&quot;=0}
$Tab.\&quot;As\&quot;=@{\&quot;Tréfle\&quot;=0}

Dans ce cas on facilite la gestion des doublons et le recherche des paires au prix d'un code un peu plus dense :
[code:1]
#initialisation identique

$tab=@{}
#$Tab est une hashtable de hashtable
# $Tab.Nom1.Couleur1,$Tab.Nom1.Couleur2,$Tab.Nom2.Couleur1...
for ($I=1;$I -le $NbCartes;$I++)
{
do
{ #la clé existe déjà dans la hashtable, on essaie à nouveau
trap [System.Management.Automation.RuntimeException] {$isExist=$true}
#On suppose que la création suivante réussira
$isExist=$false;
#Construction dynamique du nom de clé, les parenthéses sont nécessaire autour de $TypeCarte...
$Tab.($TypeCarte.($Rnd.Next($BornesCarte.Min,$BornesCarte.Max)))+=
#Ici seul le nom de la clé nous intéresse
@{$Couleur.($Rnd.Next($BornesCouleur.Min,$BornesCouleur.Max))=0}
}until (!$isExist)
}
#Pour chaque éléments de la hastable
$tab.GetEnumerator()|`
%{ #on affiche le nom de la carte
$Name=$_.Key;
#Et ce pour chaque paire, ou plus
($_.Value.GetEnumerator()|%{\&quot;{0} de {1}\&quot; -F $Name,$_.Key})}


#Affiche le contenu de la main, s'il existe des paires
$tab.GetEnumerator()|`
# On ne prend que les éléments,de type hastable, ayant + entrées
Where {$_.Value.Count -ge 2}|`
#Pour chaque éléments de la hastable
# Ajoute le nom de la carte
foreach {$Name=$_.Key; (\&quot;Une paire de {0} : \&quot; -F $Name)+
#Ajoute le détail des cartes constituant une paire
($_.Value.GetEnumerator()|%{\&quot;{0} de {1}\&quot; -F $Name,$_.Key})}
[/code:1]
Sur ces derniers exemples je n'ai pas testé de longues séries mais juste la construction.
Ensuite on peut factoriser le code d'affichage mais la relecture s'en ressentirai.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3119 par Laurent Dardenne
Nostra écrit:

finalement je ne fais pas comme toi Laurent
(je suis assez fier de moi pour le coup :laugh: )

Plus il y a de solution mieux c'est.
Nostra écrit:

une idée pour résoudre ce problème ?

Sa portée est locale donc l'usage d'une variable globale est une solution.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.066 secondes
Propulsé par Kunena