Pas de doublon d'image

Résolu
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016 - Modifié par Whismeril le 19/10/2015 à 16:15
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016 - 21 oct. 2015 à 10:19
Bonjour,

Pour un tirage au sort, j'utilise ce script.
Le but est qu'il m'affiche 10 images en un clique.

Cela marche parfaitement, mais j'aimerai ne pas avoir de doublon.
Comment faire, je débute un peu dans ce type de codage.

Merci.


sub tirage()
 randomize timer
 document.getElementById("image1").src= int(rnd*23)+1 & ".png"
 document.getElementById("image2").src= int(rnd*23)+1 & ".png"
 document.getElementById("image3").src= int(rnd*23)+1 & ".png"
 document.getElementById("image4").src= int(rnd*23)+1 & ".png"
 document.getElementById("image5").src= int(rnd*23)+1 & ".png"
 document.getElementById("image6").src= int(rnd*23)+1 & ".png"
 document.getElementById("image7").src= int(rnd*23)+1 & ".png"
 document.getElementById("image8").src= int(rnd*23)+1 & ".png"
 document.getElementById("image9").src= int(rnd*23)+1 & ".png"
 document.getElementById("image10").src= int(rnd*23)+1 & ".png"
end sub



et

<input type="button" id="tirage" value="Tirer au sort!" onclick="tirage"/><br/><br/>
<img id="image1"/> <img id="image2"/><br>
<img id="image3"/> <img id="image4"/><br>
<img id="image5"/> <img id="image6"/><br>
<img id="image7"/> <img id="image8"/><br>
<img id="image9"/> <img id="image10"/><br>

12 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
Modifié par cs_JMO le 21/10/2015 à 00:13
Bonsoir le Forum,

Exemple d'un hta/vbs pour manipuler des images.

Dans le répertoire du script, j'ai créé un sous-répertoire "\Images" contenant 12 images.


Le script hta
<html>
<body>
   <input type = "BUTTON" value = "Changement d'images" onclick = "ChangeMap()"><br><br>
   <Img name="Map_1"/><Img name="Map_2"/><Img name="Map_3"/><Img name="Map_4"/><br>
   <Img name="Map_5"/><Img name="Map_6"/><Img name="Map_7"/><Img name="Map_8"/><br>
   <Img name="Map_9"/><Img name="Map_10"/><Img name="Map_11"/><Img name="Map_12"/>	
</body>

<script language = "VBScript">
Dim pathMap : pathMap = CreateObject("Wscript.Shell").CurrentDirectory & "\Images\"
Dim ArrayList : Set ArrayList = CreateObject("System.Collections.ArrayList")    

Sub Window_Onload()
    ResizeTo 800,600
End Sub

Sub ChangeMap()
    Call LoadMap()
    Dim icount, i,temp, irnd
    icount = ArrayList.Count
    Randomize
    For i = 1 to icount
       irnd = ((icount-i) * Rnd)
       temp = ArrayList(icount-i)
       Select Case  i
          Case 1 : Map_1.Src = ArrayList(irnd)
          Case 2 : Map_2.Src = ArrayList(irnd)
          Case 3 : Map_3.Src = ArrayList(irnd)
          Case 4 : Map_4.Src = ArrayList(irnd)
          Case 5 : Map_5.Src = ArrayList(irnd)
          Case 6 : Map_6.Src = ArrayList(irnd)
          Case 7 : Map_7.Src = ArrayList(irnd)
          Case 8 : Map_8.Src = ArrayList(irnd)
          Case 9 : Map_9.Src = ArrayList(irnd)
          Case 10 : Map_10.Src = ArrayList(irnd)
          Case 11 : Map_11.Src = ArrayList(irnd)
          Case 12 : Map_12.Src = ArrayList(irnd)
       End Select
       ArrayList(icount-i) = ArrayList(irnd)
       ArrayList(iRnd) = temp
    Next
End Sub

Sub LoadMap()
    ArrayList.Clear
    For Each file in CreateObject("Scripting.FileSystemObject").GetFolder(pathMap).Files
        ArrayList.Add file.path
    Next
End Sub

</script>
</html> 


Résultat :


A chaque reload, les images sont mélangées et sans doublon.
En espérant que cet exemple puisse servir à Narfolius.

jean-marc
1
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016
21 oct. 2015 à 00:38
Bonsoir cs_JMO,

J'étais partie sur ton idée de ce matin et là je vois ton script ...
C'est exactement ce que je recherchais !

Parfait, un grand merci !
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 oct. 2015 à 08:54
Bonjour, merci de mettre le sujet résolu dans ce cas
0
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
21 oct. 2015 à 10:19
Voilà, merci à vous tous pour votre aide.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
19 oct. 2015 à 16:09
Bonjour,

tu postes ta question dans le forum Visual basic et pour la coloration tu choisis Java.

Donc afin de déplacer ta question dans le bon forum merci de préciser le langage:
  • VBA
  • VBS
  • VB6
  • VB.NET
  • Java
  • Javascript
  • Autre

0
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016
19 oct. 2015 à 16:13
Oups, désolé.
En VBS, merci
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656 > Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016
19 oct. 2015 à 16:16
Ok sujet déplacé et coloration corrigée.
0
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
19 oct. 2015 à 16:21
Merci.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
19 oct. 2015 à 16:24
Je ne connais pas VBS, je ne sais donc pas s'il supporte les listes d'objet, je vais donc t'expliquer le principe avec un tableau.



Initialisé un tableau "source" avec le chemin de chaque image.
Initialiser un tableau "tirage" taille 10 vide

Dans une boucle comptant de 0 à 9
  • tirer un index de 0 à la taille du tableau moins 1.
  • prendre le contenu de source à cet index et le mettre dans tirage à l'index du compteur
  • redimensionner le tableau en enlevant la valeur que tu viens de trier


Et voilà pas de doublons.

C'est plus facile avec de collections (comme en Vb.net par exemple) ou l'on peut directement supprimer un élément d'une liste

0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
19 oct. 2015 à 19:19
Bonjour narfolius,

Bonjour Whismeril, merci pour ton tuto xml.

Exemple:
Option Explicit
Dim aImages, icount, Result, i , iRnd 
aImages = Array("image1.png","image2.png","image3.png","image4.png","image5.png", _
                "image6.png","image7.png","image8.png","image9.png","image10.png")

icount = UBound(aImages)+1
ReDim aTabSeries(icount)
ReDim aSuites(icount) 
          
Randomize 

For i = 1 To icount 
    aTabSeries(i) = i 
Next  

'on créé le tableau de résultat en "désactivant" ceux trouvés
For i = 1 To icount
    aSuites(i) = 0 
    While aSuites(i) = 0 
          iRnd = Int(icount * Rnd) + 1 
          If aTabSeries(iRnd) <> 0 Then 
             aSuites(i) = aTabSeries(iRnd) 
             aTabSeries(iRnd) = 0 
             Result = Result & aImages(CStr(aSuites(i))-1) & vbCr 
          End If 
    Wend 
Next 
MsgBox Result,,"Images mélangées" 


jean-marc
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
19 oct. 2015 à 23:15
Salut, de rien
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2015 à 08:41
Bonjour,
Je ne comprends pas la nécessité de passer par autre chose (liste, autres tableaux, collection, etc ...) que le tableau de départ.
Il suffit de faire des permutations sur le tableau lui-même ==>> exemple ===>>

Dim aImages, icount, i,temp,irnd
aImages = Array("image1.png","image2.png","image3.png","image4.png","image5.png", _
"image6.png","image7.png","image8.png","image9.png","image10.png")
icount = ubound(aImages)

for i = 0 to icount
iRnd = ((icount-i) * Rnd)
temp = aimages(icount-i)
msgbox "j'ai tiré " & aimages(irnd)
aimages(icount-i) = aimages(irnd)
aimages(iRnd) = temp
next

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 oct. 2015 à 08:47
Bonjour Uc,

Ça marche aussi, il faudra juste qu'il ne prenne que les 10 premiers enregistrements du tableau mélangé.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
20 oct. 2015 à 08:50
Bonjour,

Je viens de lancer 10 fois de suite le script et à chaque fois, j'ai image7 puis image5, puis image ....
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 20/10/2015 à 09:09
Bonjour, il doit falloir initialiser le Rnd, avec l'initialisation par défaut il te fait la même séquence, enfin je pense
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 oct. 2015 à 08:58
Cà, c'est une autre paire de manches : comment marche le rnd de vbs (ses défauts et ses remèdes). Je n'ai pas vbs sur ma machine et ne le connais pas.
Ce problème est autre et serait donc le même dans vos exemples également.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
20 oct. 2015 à 09:05
Effectivement, avec
Randomize
for i = 0 to icount
j'ai lancé 4 fois le script et à chaque fois l'ordre des images est différent. Donc, la proposition de ucfoutu correspond à la demande de Narfolius.
0
Narfolius Messages postés 180 Date d'inscription lundi 14 décembre 2009 Statut Membre Dernière intervention 7 décembre 2016
20 oct. 2015 à 15:18
Merci à vous tous pour votre aide !

Le problème avec le dernier script, c'est que j'aimerai que ça s'affiche dans un tableau après avoir cliqué sur un bouton 'Tirer au sort' sur une page hta.

Mais je ne sais pas comment faire exactement

Merci
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
20 oct. 2015 à 15:50
Bonjour Narfolius,

Il serait souhaitable de potasser la doc "Visual Basic Scripting Edition".
Celle-ci indique que l'instruction ReDim permet de déclarer des variables de tableau dynamique et l'argument Preserve permet de conserver les données d'un tableau existant au changement de taille de la dernière dimension de ce même tableau.
Dim aImages, icount, i,temp,irnd
ReDim arrImages(0)
aImages = Array("image1.png","image2.png","image3.png","image4.png","image5.png", _
                "image6.png","image7.png","image8.png","image9.png","image10.png")
icount = ubound(aImages)

Randomize
For i = 0 to icount
   iRnd = ((icount-i) * Rnd)
   temp = aimages(icount-i)
   ReDim Preserve arrImages(UBound(arrImages) + 1)
   arrImages(UBound(arrImages)) = "j'ai tiré " & aimages(irnd)
   aimages(icount-i) = aimages(irnd)
   aimages(iRnd) = temp
Next

MsgBox Join(arrImages,vbCr),,"Le tableau contient " & UBound(arrImages) & " images"


jean-marc
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
20 oct. 2015 à 16:21
0
Rejoignez-nous