Pas de doublon d'image [Résolu]

Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 19 oct. 2015 à 15:55 - Dernière réponse : Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention
- 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>
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - Modifié par cs_JMO le 21/10/2015 à 00:13
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

Merci cs_JMO 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 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 !
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 21 oct. 2015 à 08:54
Bonjour, merci de mettre le sujet résolu dans ce cas
Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention > Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 21 oct. 2015 à 10:19
Voilà, merci à vous tous pour votre aide.
Commenter la réponse de cs_JMO
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 19 oct. 2015 à 16:09
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 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 19 oct. 2015 à 16:13
Oups, désolé.
En VBS, merci
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention > Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 19 oct. 2015 à 16:16
Ok sujet déplacé et coloration corrigée.
Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention > Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 19 oct. 2015 à 16:21
Merci.
Commenter la réponse de Whismeril
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 19 oct. 2015 à 16:24
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
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 19 oct. 2015 à 19:19
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 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 19 oct. 2015 à 23:15
Salut, de rien
Commenter la réponse de cs_JMO
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 20 oct. 2015 à 08:41
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
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 20 oct. 2015 à 08:47
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
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 20 oct. 2015 à 08:50
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
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - Modifié par Whismeril le 20/10/2015 à 09:09
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 20 oct. 2015 à 08:58
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
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 20 oct. 2015 à 09:05
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
Narfolius 181 Messages postés lundi 14 décembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 20 oct. 2015 à 15:18
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 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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
Commenter la réponse de Narfolius
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 20 oct. 2015 à 16:21
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.