[R] Algorithme 2048

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
sozary
Niveau 6
Niveau 6
Messages : 274
Enregistré le : lun. 20 janv. 2014 19:17
Status : Hors ligne

[R] Algorithme 2048

#1

Message par sozary »

Bonjour à tous!
J'aimerais créer un jeu 2048, comme entraînement, mais je ne connais pas du tout l'algorithme mis en place.
J'ai néanmoins une petite idée:

Code : Tout sélectionner

chaque case vaut 0
while (pas game over)
Prendre une case au hasard (une valant 0), et a 1/4 chance d'y placer un 4.
([mouvement droit]
---> Vérifie la case en x+1. 
        Si elle vaut x, alors x disparaît et x+1 vaut la valeur de x fois 2
[/]
Après presque pareil pareil pour gauche, haut et bas.)
wEnd
 
Je ne sais malheureusement pas quelle est la condition de fin de jeu; enfin si x+1 impossible, et x-1 impossible, pareil pour les y, mais j'ai des doutes..
Merci d'avance!
Modifié en dernier par sozary le lun. 02 mars 2015 18:23, modifié 1 fois.
"Là où la volonté est grande, les difficultés diminuent.", Niccolò Machiavelli
leoleolth
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 26 mai 2013 21:31
Status : Hors ligne

Re: [...] Algorithme 2048

#2

Message par leoleolth »

Bonsoir !
Si tu le souhaites, on peut créer ce projet ensemble
Donne moi ton pseudo skype.
Je pense qu'il te faut 2 tableaux.
-> un avec des 0 et des 1 qui indiquent si un chiffre se trouve dans la case ou non (sera utilisé pour faire apparaître un chiffre dans une case vide aléatoirement)
-> un second avec les valeurs de chaque case

Pour savoir si on a perdu, il suffit de verifier si il existe deux mêmes cases l'une a côté de l'autre grâce au tableau 2.

En espérant t'avoir aidé.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [...] Algorithme 2048

#3

Message par lesolutionneur »

Quel est l'intérêt d'avoir deux tableaux alors que la solution proposée au départ fonctionne très bien ? (Un 0 dans le cas où il n'y a aucun chiffre).

Édit : l'algorithme de 2048 est opensource, son code est disponible sur Github : https://github.com/gabrielecirulli/2048
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [...] Algorithme 2048

#4

Message par TomAijerrie »

Bonjour,

Je me suis déjà amusé à refaire l'algorithme de 2048 sur Autoit, cependant, ce n'est pas celui du site officiel car je ne l'avais pas trouvé quand j'ai commencé mon script.
En gros, j'ai une fonction qui regarde ligne par ligne ou colonne par colonne dans quel cas de figure on est et qui déplace les cases. Le valeurs sont stockées dans le nom du label de la case et sont changées grâce à GuiCtrlSetData(), cela m'evite d'avoir trop de variables. Les images des labels sont des captures d’écran. J'ai ajouté des fonctions supplémentaires que vous pouvez de votre coté supprimer ou compléter.
► Afficher le texte
Je met dans mon archive les images pour les labels, un icône 2048, deux versions de mon script :
- une longue, mal expliquée mais compréhensible si on veut la comprendre
- l'autre plus courte grâce à une utilisation de variables tableau mais difficile à comprendre si on a pas vu la première version

Pour ceux qui ne comprenne pas, demandez moi ce que vous ne comprenez pas, j'essaierai de vous aider.

J’espère vous avoir aidé pour l'algorithme.

PS: Je suis conscient qu'il y a plein de choses à améliorer dans mon script, Je vous demande de me signaler quoi et comment faire pour y corriger.
Fichiers joints
2048.zip
(550.26 Kio) Téléchargé 126 fois
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [...] Algorithme 2048

#5

Message par cbourree »

@TomEtJerry
Tu peux essayer de ne faire une seule fonction déplacement qui prends en paramètre le sens de déplacement ^^
En voici une petite ébauche ^^ (Je n'ai regarder que la taille de celle sur la version officiel)

Func tout_deplacer()
Si deplacement horrizontale
Je parcours les 3 lignes dans le sens opposé au mouvement afin de fusionner ou déplacer la case $i + 1 avec $i dans la case $i quand cela est nécessaire c'est à dire quand case $i+1 = 2 * $i
Si déplacement verticale
Le même genre de raisonnement avec les lignes
EndFunc

Et c'est tout pas besoin de centaine de ligne ^^
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [...] Algorithme 2048

#6

Message par TomAijerrie »

@Charles

J'y ai déjà pensé, mais dans plusieurs cas de figure comme celui-ci-joint, ça ne marche pas.
Fichiers joints
Sans titre.PNG
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [...] Algorithme 2048

#7

Message par TomAijerrie »

Balise [R] si résolu
Merci
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [...] Algorithme 2048

#8

Message par lesolutionneur »

Utiliser HotKeySet() est une mauvaise idée car les touches seront interceptées même quand la fenêtre n'est pas au premier plan.

Tu devrais privilégier GUISetAccelerators() qui permet de créer des raccourcis clavier pour ta fenêtre seulement !
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [...] Algorithme 2048

#9

Message par TomAijerrie »

Merci pour l'idée.

Je n'ai pas touché à ce script depuis bien longtemps et je vois plusieurs choses qui pourraient être améliorées.

Par exemple la fonction Actualiser() pourrait ressembler à ceci:

Code : Tout sélectionner

Func Actualiser()
;----------------------------------------------
;       Actualise les couleurs
;----------------------------------------------
For $i = 0 To 3
    For $j = 0 To 3
        For $k = 1 to 14
            If $case[$i][$j] = 0 Then
                If FileExists(@ScriptDir & "\0.bmp") Then GUICtrlSetImage($case[$i][$j],@ScriptDir & "\0.bmp")
            If $case[$i][$j] = 2^$k Then
                If FileExists(@ScriptDir & "\" & 2^$k & ".bmp") Then
                    GUICtrlSetImage($case[$i][$j],@ScriptDir & "\" & 2^$k & ".bmp")
                Else
                    MsgBox(48,"actualiser","Erreur")
                EndIf
            EndIf
        Next
    Next
Next
GUICtrlSetData($casescore,$score)
EndFunc
On pourrait également remplacer les boutons par des Labels.
On pourrait modifier la fonction de déplacement en récupérant le sens de déplacement avec @HotKeyPressed.

En cherchant bien on peut trouver plein d'autre lignes à changer.
Répondre