Pas de doublon d'image [Résolu]

Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
-
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>
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Narfolius
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
-
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 !
Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
Bonjour, merci de mettre le sujet résolu dans ce cas
Narfolius
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
> Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
Voilà, merci à vous tous pour votre aide.
Commenter la réponse de cs_JMO
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
0
Merci
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

Narfolius
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
-
Oups, désolé.
En VBS, merci
Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
> Narfolius
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
-
Ok sujet déplacé et coloration corrigée.
Narfolius
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
> Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
Merci.
Commenter la réponse de Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
0
Merci
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

Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
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
Whismeril
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
-
Salut, de rien
Commenter la réponse de cs_JMO
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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

Commenter la réponse de ucfoutu
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
0
Merci
Bonjour Uc,

Ça marche aussi, il faudra juste qu'il ne prenne que les 10 premiers enregistrements du tableau mélangé.
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
Bonjour,

Je viens de lancer 10 fois de suite le script et à chaque fois, j'ai image7 puis image5, puis image ....
Commenter la réponse de cs_JMO
Messages postés
12423
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 décembre 2018
0
Merci
Bonjour, il doit falloir initialiser le Rnd, avec l'initialisation par défaut il te fait la même séquence, enfin je pense
Commenter la réponse de Whismeril
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
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.
Commenter la réponse de cs_JMO
Messages postés
181
Date d'inscription
lundi 14 décembre 2009
Dernière intervention
7 décembre 2016
0
Merci
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
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
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
Commenter la réponse de Narfolius
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
Concernant la manipulation d'images en utilisant le hta\vbs, je t'invite à consulter ce lien :
http://www.developpez.net/forums/d1425082/autres-langages/general-visual-basic-6-vbscript/vbscript/vos-contributions-vbscript/hta-ajout-suppession-dynamique-d-images/

jean-marc
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.