Jeu de math - calcul mental

Description

Voici un petit jeu de Math sympathique.
J'ai repris l'idée d'un jeu appelé Yakamath sur un des nombreux serveur de jeu gratuit en ligne.
Règles du jeu :
Un calcul est donné, trouvez le résultat pour cela additionnez les chiffres qui sont dans la grille en cliquant dessus. Une fois que vous aurez estimé avoir le bon résultat, cliquez sur OK.
Si le résultat est juste :
les cases deviennent blanches et vous gagnez des points.
Si vous faites une ligne blanche horizontale ou verticale, vous gagnez 100 points de bonus.
Si vous vous trompez ou mettez plus de 30s à répondre
Des cases rouges remplacent les cases cochées, vous empêchant ainsi de les utiliser à nouveau.
Amusez-vous bien ;)

Source / Exemple :


Option Explicit
Dim First As Boolean 'Indique si on vient de lancer le programme
Dim Total, a, b, c, d, Etat, NbParties As Integer 'Variable de calcul
Dim BonusX(8) As Boolean, BonusY(8) As Boolean 'Stock les numéros de lignes qui ont eu un bonus pr ne pas les recompter
Dim TabColorChf(80) As String 'Stockage de la couleur et du chiffre des cases
Private Sub Chiffre_Click(Index As Integer) 'On pass l'image en jaune pr indiquer le click
    If ((Left(TabColorChf(Index), 1) <> "O") And (Left(TabColorChf(Index), 1) <> "K")) Then
        If Right(TabColorChf(Index), 1) = "J" Then
            Chiffre(Index).Picture = LoadPicture(App.Path & "\" & Left(TabColorChf(Index), 1) & "V.bmp") 'On affiche le chiffre dans la case
            TabColorChf(Index) = Left(TabColorChf(Index), 1) & "V" 'On stock le chiffre et la couleur de la case
            Total = Total - Left(TabColorChf(Index), 1) 'On soustrait les chiffres qui ont été enlevé par le joueur
        Else
            Chiffre(Index).Picture = LoadPicture(App.Path & "\" & Left(TabColorChf(Index), 1) & "J.bmp")
            TabColorChf(Index) = Left(TabColorChf(Index), 1) & "J" 'On stock le chiffre et la couleur de la case
            Total = Total + Left(TabColorChf(Index), 1) 'On additionne les chiffres qui ont été cliqué pr donner le total
        End If
    End If
End Sub
'Démarrage de l'application
Private Sub Form_Load()
    NbParties = 13 'On détermine combien de partie il y a (13-1)
    First = True
    Total = 0 'Initialisation du total donné par le joueur
    a = 0: b = 0: c = 0: d = 0
    Tps.Text = "30"
    Init    'Initialisation des pièces sur le damier
    Stade 1 '1er niveau de difficulté de calcul
    Points.Text = 0
End Sub
'Nouvelle partie
Private Sub New_Click()
    Init 'Répartion des pièces sur le damier
End Sub
'Validation, vérification du résultat, calcul des points
Private Sub OK_Click()
    Dim i As Integer, j As Integer, k As Integer, l As Integer, t As Integer
    Dim OK As Boolean
    OK = False 'Variable indiquant si le résultat est juste ou faux
    OK = VerifRes 'on vérifie si l'addition de chiffres sélectionnés donne bien le résultat attendu
    k = 0  '1ere case des 81 au total
    If (OK = True) Then 'Si la réponse est juste
        For j = 0 To 8
            For i = 0 To 8
                If Right(TabColorChf(k), 1) = "J" Then 'Si la case est jaune (donc qu'elle a été cliquée)
                    Chiffre(k).Picture = LoadPicture(App.Path & "\" & "OK.bmp") 'On la met en blanc
                    TabColorChf(k) = "OK" 'On stock l'état de la case
                End If
                k = k + 1 'case suivante
            Next i
            VerifBonus j, "H" 'On vérifie si ya un bonus
            VerifBonus j, "V" 'On vérifie si ya un bonus
        Next j
        'On multiplie les points en fonction du temps
        If CInt(Tps.Text) < 30 Then t = 3
        If CInt(Tps.Text) < 20 Then t = 2
        If CInt(Tps.Text) < 10 Then t = 1
        Points = CStr(CInt(Points) + (CInt(Total) * 3 * t)) 'Total des points remportés
    Else 'si la réponse est fausse
        For i = 0 To 80 'On passe toutes les cases cochées en noires
            If Right(TabColorChf(i), 1) = "J" Then
                Chiffre(i).Picture = LoadPicture(App.Path & "\" & Left(TabColorChf(i), 1) & "R.bmp") 'On affiche le chiffre dans la case
                'Chiffre(i).Picture = LoadPicture(App.Path & "\" & "KO.bmp")
                TabColorChf(i) = "KO" 'On passe l'état des cases à KO
            End If
        Next i
    End If
    Total = 0 'On réinitialise l " " & Totales variables de temps et de calcul
    Tps.BackColor = vbGreen: Tps.ForeColor = vbBlack 'La couleur de départ
    Tps.Text = "30" 'On remet le temps à 30s
    If Etat = NbParties Then MsgBox "Le jeu est terminé" 'Indique la fin de la série de question
End Sub
'Niveau de difficulté des calculs
Private Sub Stade(ByVal Num As Integer)
    Select Case Num
        Case 1 'Addition : 8 + 14   = 22
            Etat = 1
            a = CInt(Rnd * 10) + 1
            b = CInt(Rnd * 10) + 10
            Calcul.Text = CStr(a) & " + " & CStr(b)
        Case 2 'Soustraction :  34 - 10  = 24
            Etat = 2
            a = CInt(Rnd * 10) + 30
            b = CInt(Rnd * 10) + 10
            Calcul.Text = CStr(a) & " - " & CStr(b)
        Case 3 'Multiplication :  4 * 6    = 24
            Etat = 3
            a = CInt(Rnd * 3) + 3
            b = CInt(Rnd * 4) + 2
            Calcul.Text = CStr(a) & " x " & CStr(b)
        Case 4 ' 18 - 6 + 10 = 22
            Etat = 4
            a = CInt(Rnd * 10) + 10
            b = CInt(Rnd * 10) + 3
            c = CInt(Rnd * 10) + 10
            Calcul.Text = CStr(a) & " - " & CStr(b) & " + " & CStr(c)
        Case 5 '(4 * 4 ) + 3 = 19
            Etat = 5
            a = CInt(Rnd * 3) + 3
            b = CInt(Rnd * 4) + 2
            c = CInt(Rnd * 10) + 1
            Calcul.Text = "(" & CStr(a) & " x " & CStr(b) & ") + " & CStr(c)
        Case 6 '(6 * 4) + 5   = 29
            Etat = 6
            a = CInt(Rnd * 3) + 3
            b = CInt(Rnd * 4) + 2
            c = CInt(Rnd * 10) + 1
            Calcul.Text = "(" & CStr(a) & " x " & CStr(b) & ") + " & CStr(c)
        Case 7 '33-(3*3)= 24
            Etat = 7
            a = CInt(Rnd * 10) + 25
            b = CInt(Rnd * 4) + 2
            c = CInt(Rnd * 3) + 1
            Calcul.Text = CStr(a) & " - (" & CStr(b) & " x " & CStr(c) & ")"
         Case 8 '27-(6*1)= 21
            Etat = 8
            a = CInt(Rnd * 10) + 25
            b = CInt(Rnd * 4) + 2
            c = CInt(Rnd * 3) + 1
            Calcul.Text = CStr(a) & " - (" & CStr(b) & " x " & CStr(c) & ")"
         Case 9 '14 + 26 - 8 - 4 =28
            Etat = 9
            a = CInt(Rnd * 10) + 10
            b = CInt(Rnd * 10) + 20
            c = CInt(Rnd * 10) + 5
            d = CInt(Rnd * 10) + 1
            Calcul.Text = CStr(a) & " + " & CStr(b) & " - " & CStr(c) & " - " & CStr(d)
        Case 10 '32-(2*4)+9=33
            Etat = 10
            a = CInt(Rnd * 10) + 25
            b = CInt(Rnd * 4) + 2
            c = CInt(Rnd * 3) + 1
            d = CInt(Rnd * 10) + 1
            Calcul.Text = CStr(a) & " - (" & CStr(b) & " x " & CStr(c) & ") + " & CStr(d)
        Case 11 '18+(13-6)-3=22
            Etat = 11
            a = CInt(Rnd * 10) + 20
            b = CInt(Rnd * 10) + 10
            c = CInt(Rnd * 9) + 1
            d = CInt(Rnd * 9) + 1
            Calcul.Text = CStr(a) & " + (" & CStr(b) & " - " & CStr(c) & ") - " & CStr(d)
        Case 12 '(4x1)+(6-2)=8
            Etat = 12
            a = CInt(Rnd * 6) + 2
            b = CInt(Rnd * 5) + 1
            c = CInt(Rnd * 10) + 5
            d = CInt(Rnd * 7) + 2
            Calcul.Text = "(" & CStr(a) & " x " & CStr(b) & ") + (" & CStr(c) & " - " & CStr(d) & ")"
    End Select
End Sub
'Mélange des pièces du jeu, réinitialisaiton du jeu, nouvelle partie...
Private Sub Init()
    Dim i, j, k, ran As Integer
    Dim OK As Boolean
    Dim TabChf(8) As Integer 'tableau des chiffres qui composent le quadrillage
    Randomize 'Activation de la fonction permettant d'avoir des chiffres aléatoire
    Tps.Text = "30": Tps.BackColor = vbGreen: Tps.ForeColor = vbBlack
    Points.Text = "0": Total = 0
    Temps.Interval = 1000 '1000 millisecondes soit 1 seconde
    Stade 1 'Au repasse au 1er niveau de difficulté
    For i = 0 To 8
        TabChf(i) = 0 'Initialisation du tableau
        BonusX(i) = False 'Initialisation des lignes de bonus sur les abcisses
        BonusY(i) = False 'Initialisation des lignes de bonus sur les ordonnées
    Next i
    k = 0 '1ere case des 81 au total
    'C'est 2 boucles vont servir à répartir aléatoirement les chiffres sur la grille
    For j = 0 To 8                  'k =  0  1  2  3  4  5  6  7  8
        For i = 0 To 8              '     9 10 11 12 13 14 15 16 17
            OK = False              '    18 19 20 21 22 23 24 25 26 ...
            If ((i <> 0) Or (j <> 0)) Then 'On passe la 1ere case qui existe par défaut
                k = k + 1 'case suivante
                If First = True Then 'Si c'est la 1ere fois, on charge les autres boutons
                    Load Chiffre(k) 'création de chaque bouton de la grille
                    Chiffre(k).Visible = True 'on les rend visibles et on les place
                    Chiffre(k).Left = 300 * (i) 'abscisse
                    Chiffre(k).Top = 300 * (j)  'ordonnée
                End If
                While OK = False 'Tant qu'on a pas trouvé une image à mettre sur la case
                    ran = CInt(Rnd * 8) 'choix d'un chiffre entre 0 et 8 (+1)
                    If TabChf(ran) <> 9 Then 'Si on a pas déjà atteint la limite de 9 pr chaque chiffre
                        Chiffre(k).Picture = LoadPicture(App.Path & "\" & (ran + 1) & "V.bmp") 'On affiche le chiffre dans la case
                        OK = True 'On peut passer à la case suivante
                        TabChf(ran) = TabChf(ran) + 1 'On incrémente le nombre de fois qu'a été utilisé le chiffre
                        TabColorChf(k) = CStr(ran + 1) & "V" 'On stock le chiffre et la couleur de la case
                    End If
                Wend
            Else
                ran = CInt(Rnd * 8) 'choix d'un chiffre entre 0 et 8
                Chiffre(k).Picture = LoadPicture(App.Path & "\" & (ran + 1) & "V.bmp") 'On affiche le chiffre dans la case
                TabChf(ran) = TabChf(ran) + 1 'On incrémente le nombre de fois qu'a été utilisé le chiffre
                TabColorChf(k) = CStr(ran) + 1 & "V" 'On stock le chiffre et la couleur de la case
            End If
        Next i
    Next j
    First = False 'Indique que ce n'est plus la 1ere fois qu'on utilise cette fonction afin de ne pas recharger les boutons
End Sub
'30s pour trouver la répons eà chaque question
Private Sub Temps_Timer()
    Dim i As Integer
    Tps.Text = CStr(CInt(Tps.Text) - 1) 'On affiche le décompte des secondes
    'On change la couleur du fond et de la police en fonction du temps écoulé
    If CInt(Tps) <= 20 Then Tps.BackColor = vbYellow: Tps.ForeColor = vbBlack
    If CInt(Tps) <= 10 Then Tps.BackColor = vbRed: Tps.ForeColor = vbWhite
    'Lorsque le temps impartie est terminé
    If CInt(Tps) = 0 Then
        Tps.Text = "30" 'On redonne 30s pr le prochain compte
        Tps.BackColor = vbGreen: Tps.ForeColor = vbBlack
        For i = 0 To 80 'Toutes les cases cochées deviennent noires
            If Right(TabColorChf(i), 1) = "J" Then
                Chiffre(i).Picture = LoadPicture(App.Path & "\" & Left(TabColorChf(i), 1) & "R.bmp") 'Cases rouges
                'Chiffre(i).Picture = LoadPicture(App.Path & "\" & "KO.bmp") 'cases noires
                TabColorChf(i) = "KO"
            End If
        Next i
        If Etat + 1 = NbParties Then 'Si c'était le dernier état
            Temps.Interval = 0 'On arrête le timer
            MsgBox "Le jeu est terminé"
        Else 'On passe au niveau suivant
            Etat = Etat + 1
        End If
        Stade Etat 'On passe au niveau de difficulté suivant
        Total = 0
    End If
End Sub
'Vérifie si on a une ligne de cases verticalement alignées
Private Sub VerifBonus(ByVal y As Integer, ByVal Sens As String)
    Dim i As Integer, j As Integer, k As Integer, Bonus As Integer
    '9 cases blanches alignées horizontalement pour avoir un bonus
    Bonus = 0 'Initilisation du compteur de cases
    For i = 0 To 8
        If Sens = "H" Then
            k = (y * 9) + i 'calcul de l'index du bouton sur la ligne (voir fonction init)
            If BonusX(y) = False Then If Left(TabColorChf(k), 1) = "O" Then Bonus = Bonus + 1 'Si la case est blanche on incrémente le compteur de Bonus
        End If
        If Sens = "V" Then
            k = y + (i * 9) 'calcul de l'index du bouton sur la colonne (voir fonction init)
            If BonusY(y) = False Then If Left(TabColorChf(k), 1) = "O" Then Bonus = Bonus + 1 'Si la case est blanche on incrémente le compteur de Bonus
        End If
        If Right(TabColorChf(k), 1) = "J" Then 'Si la case est jaune (donc qu'elle a été cliquée)
            Bonus = Bonus + 1 'On incrémente le compteur de cases alignées vu que la réponse est juste
        End If
        If Bonus = 9 Then 'Si le joueur a fait une ligne de cases blanches et/ou dorées
            Points = Points + 100 'Il gagne 100 points de Bonus
            If Sens = "H" Then BonusX(y) = True 'Indique que cette colonne a déjà été comptée dans les points
            If Sens = "V" Then BonusY(y) = True
            For j = 0 To 8 'On rend les cases, de la colonne bonus, dorées
                If Sens = "H" Then k = (y * 9) + j 'calcul de l'index
                If Sens = "V" Then k = y + (j * 9) 'calcul de l'index
                Chiffre(k).Picture = LoadPicture(App.Path & "\" & "BO.bmp")
                TabColorChf(k) = "OK" 'On stock l'état de la case
            Next j
        End If
    Next i
End Sub
'On vérifie si l'addition des chiffrex sélectionnés donne bien le résultat attendu
Private Function VerifRes() As Boolean
    VerifRes = False 'Si la réponse est fausse alors VerifRs = false
    Select Case Etat
        Case 1 '8+14   = 22
            If Total = (a + b) Then VerifRes = True 'Le résultat est correct
            Stade 2 'On passe au niveau de difficulté suivant
        Case 2 '34-10  = 24
            If Total = (a - b) Then VerifRes = True
            Stade 3
        Case 3 '4*6    = 24
            If Total = (a * b) Then VerifRes = True
            Stade 4
        Case 4 '18 - 6 + 10 = 22
            If Total = (a - b + c) Then VerifRes = True
            Stade 5
        Case 5 '(4 * 4 ) + 3 = 19
            If Total = ((a * b) + c) Then VerifRes = True
            Stade 6
        Case 6 '(6 * 4) + 5   = 29
            If Total = ((a * b) + c) Then VerifRes = True
            Stade 7
        Case 7 '33-(3*3)= 24
            If Total = (a - (b * c)) Then VerifRes = True
            Stade 8
        Case 8 '27-(6*1)= 21
            If Total = (a - (b * c)) Then VerifRes = True
            Stade 9
        Case 9 '14 + 26 - 8 - 4 =28
            If Total = (a + b - c - d) Then VerifRes = True
            Stade 10
        Case 10 '32-(2*4)+9=33
            If Total = (a - (b * c) + d) Then VerifRes = True
            Stade 11
        Case 11 '18+(13-6)-3
            If Total = (a + (b - c) - d) Then VerifRes = True
            Stade 12
        Case 12 '(2*4)+(6-2)
            If Total = ((a * b) + (c - d)) Then VerifRes = True
            'Stade 13 'Futur niveau peut être à vous d'en créer... :)
            Etat = NbParties 'Marque la fin du questionnaire (Etat + 1)
            Temps.Interval = 0 'On arrête le timer
    End Select
End Function

Conclusion :


J'aimerais faire une version réseau de ce jeu, pour jouer à 2.
Avec Winsock, sur le même principe que ma source sur le démineur réseau type msn. Le but, ici, serait de donner les points à celui qui joue le plus vite et de mettre en rouge, les cases sélectionnées par le perdant qui n'a pas eu le temps de valider sa réponse. Et pourquoi pas lui faire perdre 1/3 tu total que l'on a réalisé. Bien sûr, vaudrait mieux jouer à ça sur un réseau local pour éviter de trop pénaliser le client par rapport au serveur niveau rapidité...

Codes Sources

A voir également

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.