Avant de vous lancer dans sa conception, voici quelques règles qui devront être prises en compte. Cette liste vous servira de feuille de route :

  • Un partie est composée de 10 questions
  • Chaque question est composée de deux nombres compris entre 1 et 10
  • Ces deux nombres sont choisis au hasard
  • On forme une question en multipliant un nombre par l’autre
  • Lorsque le joueur entre la bonne réponse, son score est incrémenté de 1 point
  • A la fin de la partie, le score du joueur est affiché

Avant de commencer

Grâce aux connaissances que vous avez acquises en Swift, vous serez capable de coder plus de 90% de ce script de façon autonome. Cependant, deux points précis vous feront faire une recherche sur le web car nous ne les avons pas abordés jusqu’à maintenant. Et c’est une très bonne habitude à prendre. Vous ne pourrez jamais tout savoir mais vous serez en mesure de quasiment tout comprendre (concernant le langage Swift bien sûr).

Je vais donc vous détailler comment définir un nombre au hasard et comment ajouter la possibilité à un joueur d’entrer une réponse.

Définir un nombre au hasard


let num1 = Int.random(in: 1...10)

Cette ligne de code définit une constante appelée num1 et lui attribue une valeur aléatoire entière, de type Int, dans la plage de 1 à 10 inclusivement.

On appel la méthode random(in: 1...10) sur le type Int qui génère un nombre aléatoire dans la plage de 1 à 10 - 1 et 10 inclus.

Lire la réponse d’un joueur


let reponseEntree = readLine()

Cette fonction permet de lire une entrée de l'utilisateur à partir de la console et de stocker cette entrée dans une variable appelée reponseEntree.

readLine() est une fonction intégrée en Swift qui lit une ligne de texte entrée par l'utilisateur à partir de la console. Lorsque cette fonction est appelée, elle attend que l'utilisateur entre une ligne de texte et appuie sur la touche "Entrée". Une fois que l'utilisateur a appuyé sur "Entrée", la fonction renvoie cette ligne de texte en tant que chaîne de caractères (String?), qui est stockée dans la variable reponseEntree.

Il est important de noter que readLine() peut renvoyer une valeur optionnelle car il est possible que l'utilisateur n'ait rien entré avant d'appuyer sur "Entrée". Dans ce cas, readLine() renvoie nil, ce qui signifie qu'aucune valeur n'a été lue à partir de la console. Pour gérer cette possibilité, il est courant d'utiliser un bloc if let pour déballer la valeur optionnelle renvoyée par readLine().

Lancer un fichier depuis la console

Pour que les utilisateurs du jeu puissent entrer une réponse, vous devrez lancer ce script depuis la console (ou le terminal). Commencez par ouvrir la console ou le terminal et entrez la ligne de code suivante :


cd ~/Desktop

Cette ligne de commande vous permet de vous placer au niveau du dossier du Bureau de votre ordinateur. C’est à cet endroit que devra se trouver votre fichier Swift. Il ne nous reste plus qu’à indiquer le nom du fichier pour l’ouvrir. Comme dans la ligne de commande ci-dessous :


swift nom_du_fichier.swift

La solution

Voici deux corrections possibles. L’une en procédural, l'autre en orienté objet. Le codage littéral (ou codage procédural) et le codage orienté objet sont deux approches différentes de la programmation.

Le codage littéral est basé sur une séquence d'instructions ou de procédures qui sont exécutées dans l'ordre dans lequel elles sont écrites. Dans ce style de programmation, les données et les fonctions sont séparées, et les données sont souvent partagées entre plusieurs fonctions. Les structures de contrôle telles que les boucles et les conditions sont également couramment utilisées dans le codage littéral pour contrôler le flux d'exécution.

D'un autre côté, la programmation orientée objet (POO) est basée sur la notion d'objets. Les objets sont des entités qui encapsulent des données et des fonctions connexes. Dans la POO, les données et les fonctions sont regroupées dans des classes, et les objets sont des instances de ces classes. Les objets interagissent entre eux à travers des méthodes, qui sont des fonctions qui agissent sur les données d'un objet.

La principale différence entre le codage littéral et le codage orienté objet réside dans la manière dont les données et les fonctions sont organisées et utilisées dans le code. Le codage littéral utilise des structures de contrôle pour gérer le flux d'exécution, tandis que la POO utilise des objets pour encapsuler les données et les fonctions connexes. La POO permet une plus grande modularité et une meilleure abstraction, ce qui peut rendre le code plus facile à maintenir et à développer.

Ce script ne demande qu’à être amélioré, pour vous entrainer, n’hésitez pas à lui ajouter de nombreuses modifications telles que la possibilité de :

  • Demander le nom du joueur
  • Demander si le joueur va rejouer une nouvelle partie sans être obligé de relancer le fichier
  • Laisser le joueur choisir le nombre de questions (10, 15, 20 …)
  • - Mémoriser les scores précédents
  • Etc ...

Version littéral ou procédural


//
//  Jeux des tables de Multiplications
//  
//  Version littérale - 1.00
//  Par A.Guillier
//
//  https://swift.crea-troyes.fr
//


// Constantes / Textes de présentation
let txtBonjour: String = "Bonjour et bienvenue dans notre jeu dédié aux tables de multiplications"
let txtAurevoir: String = "Merci d'avoir joué"
let txtExplication: String = "C'est parti pour 10 questions !"
let txtFin: String = "Fin de la partie !"
let reponseCorrect: String = "Bonne réponse !"


// Le score est initialisé à 0
// On débute avec 0 point
var score = 0


// Fonction de tirage des questions
func question() {
    
    // Tirage de deux nombres au hasard
    let num1 = Int.random(in: 1...10)
    let num2 = Int.random(in: 1...10)
    
    // Affichage de la question
    print("Combien font \(num1) x \(num2) ?")
    
    // Entrée de la réponse
    let reponseEntree = readLine()
    
    // Vérification de la réponse
    // On déballe l'optionnel
    if let reponseSure = reponseEntree {
        
        // Conversion de la réponse en Int
        let reponseInt = Int(reponseSure) ?? 0
        
        // On vérifie la réponse
        // En appelant la fonction verification()
        verification(num1: num1, num2: num2, reponse: reponseInt)
    }
    
}


// Fonction de vérification des réponses
// Elle est appelée après chaque réponse du joueur
func verification(num1: Int, num2: Int, reponse: Int = 0) {
    
    // Définition de la bonne réponse
    let bonneReponse: Int = num1 * num2
    
    // Comparaison avec la réponse entrée
    if reponse == bonneReponse {
        
        // La réponse est exacte
        print(reponseCorrect)
        
        // On incrémente le score de 1
        score += 1
        
    } else {
        
        // La réponse est fausse
        let reponseFausse: String = "Faux, la bonne réponse était \(bonneReponse)"
        print(reponseFausse)
        
    }
  
}


// Message d'entrée
print(txtBonjour)
print(txtExplication)


// Boucle des 10 questions
for i in 1...10 {
    print("Question N°\(i) :")
    question()
    
}


// Message de fin
print(txtFin)
print("Votre score est de \(score)/10")
print(txtAurevoir)

Version orientée objet


//
//  Jeux des tables de Multiplications
//
//  Version objet - 1.00
//  Par A.Guillier
//
//  https://swift.crea-troyes.fr
//

class Multiplication {
    
    // Constantes / Textes de présentation
    let txtBonjour: String = "Bonjour et bienvenue dans notre jeu dédié aux tables de multiplications"
    let txtAurevoir: String = "Merci d'avoir joué"
    let txtExplication: String = "C'est parti pour 10 questions !"
    let txtFin: String = "Fin de la partie !"
    let reponseCorrect: String = "Bonne réponse !"
    
    // Le score est initialisé à 0
    // On débute avec 0 point
    var score: Int = 0
    
    // Méthode pour incrémenter le score de 1
    func increment() {
        self.score += 1
    }
    
    // Méthode pour le tirage des questions
    func question() {
        
        // Tirage de deux nombres au hasard
        let num1 = Int.random(in: 1...10)
        let num2 = Int.random(in: 1...10)
        
        // Affichage de la question
        print("Combien font \(num1) x \(num2) ?")
        
        // Entrée de la réponse
        let reponseEntree = readLine()
        
        // Vérification de la réponse
        // On déballe l'optionnel
        if let reponseSure = reponseEntree {
            
            // Conversion de la réponse en Int
            let reponseInt = Int(reponseSure) ?? 0
            
            // On vérifie la réponse
            // En appelant la fonction vérification()
            verification(num1: num1, num2: num2, reponse: reponseInt)
        }
        
    }
    
    // Méthode de vérification des réponses
    // Elle est appelée après chaque réponse du joueur
    func verification(num1: Int, num2: Int, reponse: Int = 0) {
        
        // Définition de la bonne réponse
        let bonneReponse: Int = num1 * num2
        
        // Comparaison avec la réponse entrée
        if reponse == bonneReponse {
            
            // La réponse est exacte
            print(reponseCorrect)
            
            // On incrémente le score de 1
            increment()
            
        } else {
            
            // La réponse est fausse
            let reponseFausse: String = "Faux, la bonne réponse était \(bonneReponse)"
            print(reponseFausse)
            
        }
      
    }
    
    // on démarre une partie
    func start() {
        
        // Message d'entrée
        print(txtBonjour)
        print(txtExplication)
        
        // Boucle des 10 questions
        for i in 1...10 {
            print("Question N°\(i) :")
            question()
            
        }

        // Message de fin
        print(txtFin)
        print("Votre score est de \(score)/10")
        print(txtAurevoir)
    }
   
}

// On lance une parie !
let jeu = Multiplication()
jeu.start()