IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Swift Discussion :

Tirage de carte en Swift


Sujet :

Swift

  1. #1
    Candidat au Club Avatar de Thbd_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Tirage de carte en Swift
    Bonjour à tous,

    Voila je suis nouveau sur Swift, et j'aimerai pour m'entrainer essayer de créer une fonction de tirage de carte.
    L'idée est de stocker l'ordre du tirage dans un tableau pour pouvoir le réutiliser par la suite.

    Seulement voilà mon programme tourne en boucle et donc impossible de récupérer ce tableau .

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    import UIKit
    import Foundation
     
     
        //Fonction random
        func randomNum(from range: ClosedRange<Int>) -> Int
        {
            let lowerBound = range.lowerBound
            let upperBound = range.upperBound
     
            return lowerBound + Int(arc4random_uniform(UInt32 (upperBound - lowerBound)))
        }
     
     
        //Fonction compare
        func Compare(carteTirée: (Int), Tableau: [Int]) -> Bool
        {
            for t in Tableau
            {
                if carteTirée == t
                {
                    return true
                }
            }
            return false
        }
     
     
        //Fonction CarteLen
        func carteLen(tombées: [Int]) -> Int
        {
            var Count = 0
            for _ in tombées
            {
                Count = Count + 1
            }
            return Count
        }
     
        //"Main"
        func Run() -> Array<Int>
        {
            var Tombées = [Int]()
            Tombées.append(0)
     
            while carteLen(tombées:Tombées) < 54
            {
                let carte = randomNum(from: 0 ... 52)
     
                for _ in Tombées
                {
                    if Compare(carteTirée:carte, Tableau:Tombées) == false
                    {
                        Tombées.append(carte)
                        print(carte)  
                    }
                }
            }
            return Tombées
        }
     
        Run()
        //print(Tableau)
    Si quelqu'un pouvait m'éclairer sur mon erreur ou en tout cas sur ce qui cloche ce serait très sympa de sa part !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 26
    Points
    26
    Par défaut Tirage de carte (réponse)
    Bonjour.

    Je suis nouveau sur ce forum et aussi débutant en swift.
    J'ai repris votre code et effectivement, il tourne en boucle. En cause la ligne 46 :

    46 : while carteLen(tombées:Tombées) < 54
    Ce n'est pas 54 mais 52.
    46 : while carteLen(tombées:Tombées) < 52

    Cette algorithme au tirage pour 52 cartes fonctionne mais si vous aviez une quantité de cartes à tirer très supérieur, il sera très lent.
    En effet vers la fin du traitement la fonction aléatoire proposera des cartes qui ont déjà été tirées ce qui obligera à recommencer le tirage.

    Je vous propose un code plus rapide et aussi plus court.
    La fonction "battresLesCartes" crée d'abord un tableau de cartes "triées".
    Après chaque tirage elle récupère la valeur de la carte tirée du tableau "triées" pour l'ajouter dans celui du tableau des "battues" enfin elle supprime la carte tiré du jeux des cartes "triées", l'argument de la fonction tirage "arc4random_uniform()" est décrémenter.
    A la dernière carte "triées", il est inutile de faire le tirage d'où une boucle for un peu plus petite et la ligne 17.
    Il n'y a donc plus qu'un nombre nécéssaire d'appel à la fonction aléatoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    //  main.swift
    //  SwiftCommandeEnLigne
     
    import Foundation
     
    func battreLesCartes (_ nombre: Int) -> Array<Int> {
     var battues: Array<Int> = []
     
     if nombre > 0 {
      var tirage: Int
      var triés: Array<Int> = []
      for i in 1...nombre {triés.append(i)}
      for i in stride(from: nombre, to: 1, by: -1) {
       tirage = Int(arc4random_uniform(UInt32(i)))
       battues.append(triés[tirage])
       triés.remove(at: Int(tirage))
      }
      battues.append(triés[0])
     }
     
     return battues
    }
     
    // Début du programme main
     
    var battues = battreLesCartes(52)
    print ("Nombre de cartes ~> \(battues.count)")
    print ("Tirage ~> \(battues)")
     
    battues = battreLesCartes(0)
    print ("Nombre de cartes ~> \(battues.count)")
    print ("Tirage ~> \(battues)")
     
    battues = battreLesCartes(56879)
    print ("Nombre de cartes ~> \(battues.count)")
    print ("Tirage ~> \(battues)")
    Cependant ce code consomme un peu plus de mémoire que le votre pendant son exécution.
    D'autre part, j'ai retiré l'élément zéro que vous utilisez pour le résultat de votre tirage.
    Pour le remettre, ligne 6 : var battues: Array<Int> = [0]

    Cordialement.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Bonjour.

    J'ai commis une erreur dans le commentaire lié au code.

    A la dernière carte "triées", il est inutile de faire le tirage d'où une boucle for un peu plus petite et la ligne 17.
    Il faut lire :

    À la dernière carte "triées", il est inutile de faire le tirage d'où une boucle for un peu plus petite, et la ligne 19.
    C'est pas ligne 17 mais ligne 19.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    battues.append(triés[0])
    .

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo