Jeu clicker/idle "GOLD MINE" sur excel

Pour partager vos applications (Excel, Calc et Google Sheets) avec les autres membres
E
ExcelCoreGame
Membre fidèle
Membre fidèle
Messages : 458
Appréciations reçues : 15
Inscrit le : 24 octobre 2017
Version d'Excel : 2007FR

Message par ExcelCoreGame » 14 février 2020, 23:32

C'est un simple jeu de clicker/idle comme il en existe des milliers :)

On clique sur la mine pour récolter de l'or et pouvoir acheter des trucs qui font récolter plus et ainsi de suite ^^

En effet les boutons à coté de la mine sont la pour la bêta (gain x10 et 100 cliques d'un coup), pour pouvoir tester le jeu sans y passer 3 ans, cela ne sera pas disponible sur la version finale
Pour le gain exponentiel pas de souci on va dire, sauf si je redimensionne le jeu (ce qui se peut) on va jusqu'au utiliser jusqu'au max de la variable Double soit 1.79769313486231570 E + 308 (d'ou l'affichage en mode scientifique)


Le clignotement est surement du à toute les fonctions qui tournent et le Application.OnTime même si au final en le désactivant et en ne faisant rien mon excel mouline pour je ne sais qu'elle raison X)
Je ne penses pas pouvoir le résoudre du coup malheureusement :(

Oui ces shapes c'est agaçant, après dans la version finale je vais espacer un peu mieux tout ça mais j'ai peur que si je fais trop gros cela peut pénaliser l'expérience de jeu car on a tous des écrans différents
Je ne sais pas trop quoi faire même si on peut au final modifier soit même la taille des shapes mais bon pas super super

C'est une bonne idée l'imprime écran :) même si du coup en cliquant à coté on déplace quand même la shape de l'imprim écran ce qui ne change pas trop le souci final je dirais ^^
En général je fais en dynamique car je fais un jeu français/anglais donc tout est traduit à la volée et que la moitié des informations sont dynamiques mais bon je peux faire 2 imprimes écran au final, je vais y réfléchir et tester ^^
Sinon faut que je trouve un moyen ergonomique pour le bouton d'achat :)

Edit: je peux simplement mettre des shapes invisible devant les textes dynamiques, c'est surement la meilleur solution mais bon si le joueur veut redimensionner... aie
E
ExcelCoreGame
Membre fidèle
Membre fidèle
Messages : 458
Appréciations reçues : 15
Inscrit le : 24 octobre 2017
Version d'Excel : 2007FR

Message par ExcelCoreGame » 13 avril 2020, 18:37

Salut à tous,

Je fais une refonte de mon code en utilisant des classes personnalisées, c'était devenu une usine à gaz avec que des fonctions partout.
L'ensemble du jeu est de plus en plus abouti, il restera l'équilibre du jeu à revoir mais la c'est pas gagné ^^

Je vous tiens au courant

ECG
E
ExcelCoreGame
Membre fidèle
Membre fidèle
Messages : 458
Appréciations reçues : 15
Inscrit le : 24 octobre 2017
Version d'Excel : 2007FR

Message par ExcelCoreGame » 4 mai 2020, 01:18

un petit exemple de code pour les amélioration via une classe personnalisé, y a surement mieux mais c'est beaucoup plus lisible pour moi au final, avant j'avais des variables et des fonctions un peu partout, la tout sera centralisé (du moins je trouve dans ma tête, chacun sa façon de coder on va dire :P, certains sauteront surement au plafond en lisant tout ça héhéhé)

En premier lieu je définis ma classe :
Option Base 1

Public Type CLASSE_AMELIORATION
    NumeroClasse As Integer
    NomFrancais As String
    NomAnglais As String
    DataLigneLevel As Integer
    LevelActuel As Double
    Cout As Double
    LevelMax As Double '-1 pour infini
    TypeEffet As String ' + ou x
    EffetParLevel As Integer
    EffetTotal As Double
    LabelDescription As String
    LabelBoutonAchat As String 
    LabelBoutonRefus As String
    LabelLevel As String
    LabelNom As String
    LabelCout As String
    DescriptionFrancais As String
    DescriptionAnglais As String
End Type
vu qu'on est en option base 1 et que j'ai 6 amélioration différentes, je déclare une array de classe personnalisé, j'aurais pu les nommer une par une mais cela me suffit pour boucler dessus; si j'en avait eu beaucoup plus à gérer peut être que j'aurais fait autrement au final:
Public LISTE_CLASSE_AMELIORATION(6) As CLASSE_AMELIORATION
A l'acceptation des macros je lance l'initialisation de mes classes et l'affichage de celles ci.
Je boucle donc sur les borne de ma liste d'amelioration existante, si je rajoute une amélioration rien à changer:
Function DECLARATION_ALL_CLASSE_AMELIORATION()
Dim BALAYAGE_CLASSE As Integer

'lors de l'initialiasation du classeur on déclare toutes les classes d'amelioration
'et on raffraichi la feuille d'amelioration

For BALAYAGE_CLASSE = LBound(LISTE_CLASSE_AMELIORATION) To UBound(LISTE_CLASSE_AMELIORATION)
    DECLARATION_CLASSE_AMELIORATION (BALAYAGE_CLASSE)
    AMELIORATION_RAFFRAICHI_AFFICHAGE (BALAYAGE_CLASSE)
Next

La première fonction sert donc à déclarer/mettre à jour une classe ciblé:
Function DECLARATION_CLASSE_AMELIORATION(NUMERO_CLASSE As Integer)

                                
'pour mettre à jour une classe en particulier

Select Case NUMERO_CLASSE

    Case 1:
        With LISTE_CLASSE_AMELIORATION(NUMERO_CLASSE)
            .NumeroClasse = NUMERO_CLASSE
            .NomFrancais = "nom FR 1"
            .NomAnglais = "nom ANG 1"
            .DataLigneLevel = LIGNE_AMELIORATION_SKILL_1_LEVEL
            .LevelActuel = Sheets(FEUILLE_DATA).Cells(.DataLigneLevel, COLONNE_DATA).Value
            .Cout = 10 + .LevelActuel * 10
            .LevelMax = -1 '-1 pour infini
            .TypeEffet = "+" ' + ou x
            .EffetParLevel = 5
            .EffetTotal = .EffetParLevel * .LevelActuel
            .LabelDescription = "INFO_AMELIORATION_1"
            .LabelBoutonAchat = "ACHAT_AMELIORATION_1"
            .LabelBoutonRefus = "REFUS_AMELIORATION_1"
            .LabelLevel = "INFO_LEVEL_AMELIORATION_1"
            .LabelNom = "INFO_NOM_AMELIORATION_1"
            .LabelCout = "INFO_COUT_AMELIORATION_1"
            .DescriptionFrancais = "Effet par level: " & .TypeEffet & .EffetParLevel & " or par coup manuel de base" & vbCrLf & _
                                   "Effet total: " & .TypeEffet & .EffetTotal & " or par coup manuel de base" & vbCrLf & _
                                   "S'applique que sur le clique manuel de base (+1 par défaut)"
            
            .DescriptionAnglais = "descrp ang 1"
            
        End With

   'etc etc sur mes 6 ameliorations
   
    Case 6:
        With LISTE_CLASSE_AMELIORATION(NUMERO_CLASSE)
            .NumeroClasse = NUMERO_CLASSE
            .NomFrancais = "nom FR 6"
            .NomAnglais = "nom ANG 6"
            .DataLigneLevel = LIGNE_AMELIORATION_SKILL_6_LEVEL
            .LevelActuel = Sheets(FEUILLE_DATA).Cells(.DataLigneLevel, COLONNE_DATA).Value
            .Cout = 10000 + .LevelActuel * 10000
            .LevelMax = -1 '-1 pour infini
            .TypeEffet = "x" ' + ou x
            .EffetParLevel = 2
            .EffetTotal = .EffetParLevel ^ .LevelActuel
            .LabelDescription = "INFO_AMELIORATION_6"
            .LabelBoutonAchat = "ACHAT_AMELIORATION_6"
            .LabelBoutonRefus = "REFUS_AMELIORATION_6"
            .LabelLevel = "INFO_LEVEL_AMELIORATION_6"
            .LabelNom = "INFO_NOM_AMELIORATION_6"
            .LabelCout = "INFO_COUT_AMELIORATION_6"
            .DescriptionFrancais = "Effet par level: " & .TypeEffet & .EffetParLevel & " gain de gemme par coup manuel/automatique"  & vbCrLf & _
                                   "Effet total: " & .TypeEffet & .EffetTotal & " gain de gemme par coup manuel/automatique" & vbCrLf & _
                                   "S'applique que sur le gain par clique manuel ou automatique (et pas les compétences de Prime)"

            
            .DescriptionAnglais = "descrp ang 6"
            
        End With
       
        
Ensuite on affiche/rafraichi, tant que la classe est bien déclaré alors tout se fera automatiquement
Function AMELIORATION_RAFFRAICHI_AFFICHAGE(NUMERO_CLASSE As Integer)
Dim CLASSE_SELECTIONNEE As CLASSE_AMELIORATION
Dim POURCENTAGE As Double

CLASSE_SELECTIONNEE = LISTE_CLASSE_AMELIORATION(NUMERO_CLASSE)

'on remet à jour les informations de la page amelioration

'on affiche les noms/descriptions/effet selon la langue
If EST_FRANCAIS Then
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelNom).TextFrame2.TextRange.Characters.TEXT =          CLASSE_SELECTIONNEE.NomFrancais
            
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelDescription).TextFrame2.TextRange.Characters.TEXT =             CLASSE_SELECTIONNEE.DescriptionFrancais
Else
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelNom).TextFrame2.TextRange.Characters.TEXT =             CLASSE_SELECTIONNEE.NomAnglais
            
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelDescription).TextFrame2.TextRange.Characters.TEXT =             CLASSE_SELECTIONNEE.DescriptionAnglais
End If



'si on est inférieur au niveau max ou qu'on a pas de niveau max
If CLASSE_SELECTIONNEE.LevelMax = -1 Or (CLASSE_SELECTIONNEE.LevelActuel < CLASSE_SELECTIONNEE.LevelMax) Then

    'si on assez de point pour acheter on affiche
    If EST_VALEUR_ARGENT_DISPONIBLE_VALEUR(CLASSE_SELECTIONNEE.Cout) Then
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonAchat).Visible = True
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonRefus).Visible = False
    Else
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonAchat).Visible = False
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonRefus).Visible = True
    End If

    
    'si on n'a pas de level max on affiche juste le level actuel
    If CLASSE_SELECTIONNEE.LevelMax = -1 Then
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelLevel).TextFrame2.TextRange.Characters.TEXT = _
            "x " & CLASSE_SELECTIONNEE.LevelActuel
    Else
        'sinon XX/YY
        Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelLevel).TextFrame2.TextRange.Characters.TEXT = _
                "x " & CLASSE_SELECTIONNEE.LevelActuel & "/" & CLASSE_SELECTIONNEE.LevelMax
    End If
    
    'pour le moment je n'utilise pas cette partie du code, je suis en train d'y réfléchir
    
    'cout XX/YY(ZZ%)
    POURCENTAGE = Round(CDbl(Sheets(FEUILLE_DATA).Cells(LIGNE_ARGENT, COLONNE_DATA).Value / _
                    CLASSE_SELECTIONNEE.Cout) * 100, 2)
                    
    'on bloque à 100% pour l'affichage
    If POURCENTAGE > 100 Then
        POURCENTAGE = 100
    End If
    
    'Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelCout).TextFrame2.TextRange.Characters.TEXT =         Sheets(FEUILLE_DATA).Cells(LIGNE_ARGENT, COLONNE_DATA).Value & "/" & CLASSE_SELECTIONNEE.Cout & " (" & POURCENTAGE & "%)"
    
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelCout).TextFrame2.TextRange.Characters.TEXT = _
         CLASSE_SELECTIONNEE.Cout
    
Else
    'on a atteint le niveau max donc on ne peut plus acheter de level
    
    'on cache le bouton d'achat
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonAchat).Visible = False
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelBoutonRefus).Visible = False
    
    
    
    'on est au level max
    Sheets(FEUILLE_AMELIORATION).Shapes(CLASSE_SELECTIONNEE.LabelLevel).TextFrame2.TextRange.Characters.TEXT = _
        "x " & CLASSE_SELECTIONNEE.LevelActuel & "(LEVEL MAX)"
End If



End Function
Enfin, quand on clique pour acheter un level cela donne donc:
Function AJOUTE_LEVEL_AMELIORATION()
Dim BALAYAGE_CLASSE As Integer
Dim CLASSE_SELECTIONNEE As CLASSE_AMELIORATION

'code annexe 
With CLASSE_AMELIORATION_ERREUR
    .NumeroClasse = 0
End With

'si on est déjà en train d'acheter un level d'amelioration on ne continue pas
If EST_EN_ACHAT_AMELIORATION = True Then
    Exit Function
End If

EST_EN_ACHAT_AMELIORATION = True


CLASSE_SELECTIONNEE = CLASSE_AMELIORATION_ERREUR
'on tente de retrouver la classe
For BALAYAGE_CLASSE = LBound(LISTE_CLASSE_AMELIORATION) To UBound(LISTE_CLASSE_AMELIORATION)
    If Application.Caller = LISTE_CLASSE_AMELIORATION(BALAYAGE_CLASSE).LabelBoutonAchat Then
        CLASSE_SELECTIONNEE = LISTE_CLASSE_AMELIORATION(BALAYAGE_CLASSE)
        Exit For
    End If

Next

'si on a bien retrouvé la classe
If CLASSE_SELECTIONNEE.NumeroClasse <> 0 Then

    'on verifie qu'on est sur la bonne feuille sinon on ne fait rien
    If ActiveSheet.Name = FEUILLE_AMELIORATION Then
    
        'si on a le montant toujours disponible 
        If EST_VALEUR_ARGENT_DISPONIBLE_VALEUR(CLASSE_SELECTIONNEE.Cout) Then
            
            'si on est inférieur au niveau max ou qu'on a pas de niveau max
            If CLASSE_SELECTIONNEE.LevelMax = -1 Or (CLASSE_SELECTIONNEE.LevelActuel < CLASSE_SELECTIONNEE.LevelMax) Then
        
                'on retire le cout
                RETIRE_ARGENT (CLASSE_SELECTIONNEE.Cout)
                
                'on ajoute un niveau
                Sheets(FEUILLE_DATA).Cells(CLASSE_SELECTIONNEE.DataLigneLevel, COLONNE_DATA).Value = _
                    Sheets(FEUILLE_DATA).Cells(CLASSE_SELECTIONNEE.DataLigneLevel, COLONNE_DATA).Value + 1
                
                'vu qu'on a retirer des points on raffraichi toutes les classes, leurs infos et les infos general
                Call DECLARATION_ALL_CLASSE_AMELIORATION
                
                'on recalcule les gains de gold/gemme etc
                Call RECALCULE("GOLDMANUEL")
                Call RECALCULE("GOLDAUTO")
                Call RECALCULE("GEMME")
                
                
            End If

        End If
    
    
    End If
    
Else

    Call AFFICHE_ERREUR(0)

End If


EST_EN_ACHAT_AMELIORATION = False

End Function
Si je veux donc changer par exemple la formule de calcule de cout, effet par level etc, j'ai juste à modifier dans la déclaration le .cout ou .effetparlevel et l'affichage ainsi que le recalcule (qui font donc appel à LISTE_CLASSE_AMELIORATION(X).effettotal dans les formules)

Il y a forcément d'autre fonction et bricole autour de tout ça mais voila le principal pour ceux qui se demandent comment je gère un peu les données
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 7'088
Appréciations reçues : 370
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 5 mai 2020, 19:52

Bonsoir,

attention à ne pas confondre Classe et Type, un objet avec un Type personnalisé, et une Classe avec un module de Classe ;-)

Quand j'ai appris à utiliser le Type personnalisé, j'ai pu constater comme vous que cela simplifiait les choses.
Pour "La quête des Héros" je suis en train de voir si c'est opportun de partir sur une Classe, ou plutôt "plus simplement" rester avec un Type personnalisé.

Le type personnalisé, je suis également en train de m'en servir sur la bataille naval, et je m'en sert dans Snake et bien d'autre application.

Bravo @ vous pour cette orientation de programmation qui fait que le code s'oriente "pro" ! .-)

Bon courage pour la suite.

@ bientôt

LouReed
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
E
ExcelCoreGame
Membre fidèle
Membre fidèle
Messages : 458
Appréciations reçues : 15
Inscrit le : 24 octobre 2017
Version d'Excel : 2007FR

Message par ExcelCoreGame » 5 mai 2020, 22:53

Il me semblait que par définition une classe est un type personnalisé mais j'avoue que cela me passe au dessus en général (classe/type/structure et compagnie) :)

Qu'entends tu par une classe personnalisé du coup pour heroes quest par exemple?

merci :)
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 7'088
Appréciations reçues : 370
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 5 mai 2020, 23:11

Les modules de classes vont "plus loin" que les types personnalisés.
En ce sens qu'un type personnalisé vous permet de regrouper (en simplifiant) plusieurs variables sur une seule :
Type LouReeD
ma variable 1 as integer
ma variable 2 as string
ma variable 3 as boolean
En Type

LRD as LouReeD

Et on peut l'utiliser comme ceci : LRD.ma variable 2 = "5 ans"
Mais voilà, ma variable 2 string est limitée à du string avec une assignation par "="

Le module de classe permet donc d'aller plus loin en ce sens où l'équivalent de cette valeur peut subir "automatiquement" du code VBA pour arriver à un résultat différent.

J'ai du mal à l'expliquer c'est pourquoi j'ai du mal à le mettre en place dans le jeu et à voir d'où je pars et où je veux aller.
Si mon héro trouve un objet "5", ce 5 en objet va lui permettre de gagner des points de combat, mais ceux-ci dépendent du héros
donc dans un code du module de classe des héros, le code qui reçois un objet va "travailler" pour en sortir un résultat en prenant en compte plusieurs paramètres, et donc pour le Barbare un 5 donnera 8, mais pour l'elfe, un 5 donnera 2...

Mais dans le code du jeu il suffit de dire "héro barbare ramasse 5" et hop = 8 en point de combat.
Toute l'écriture "difficile" est cachée derrière ce module de classe.
J'avais trouvé un bon tuto la dessus et c'est ce qui m'a donné envie de partir là dessus, mais je crois que j'arrive aux limites de ma compréhension du codage ! :lol:

Alors oui j'ai réussi à le mettre en pratique sur ma dernière application "Suivi des activité" mais c'est très limité var cela ne gère que le clic sur un lablel de USF, mais pour un code de gestion, le USF peut avoir une centaine de label !
Donc pour moi l'idée est d'avoir un module de classe bien conçu avec des ramifications dans toutes les sens en fonction du personnage, de ce qu'il possède, de son énergie, de son expérience etc... et ensuite il suffit dans le code de jeu d'envoyer des données "simple" et elles sont digérées par le module.

Pour reprendre l'idée du 5 qui donne 8 pour le barbare et 3 pour l'elfe, le code pourrait être :
if héro barbare and babare_vie > 6 and barbare_esprit< 9 then
point de combat barbare = 8
elseif héro = elfe and elfe_vie >2 and elfe_esprit >5 then
point de combat elfe = 3
elseif héro = nain etc....

Avec le module de classe
héro_objet = 5 (après traitement héro combat = 8)
C'est un peu comme des fonctions mais plus complexe, bref vous avez compris que je n'ai pas tout compris !!!
C'est comme le jeu du démineur en USF, il est basé sur des modules de classe si je me souvient bien.

@ bientôt

LouReeD
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 7'088
Appréciations reçues : 370
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 5 mai 2020, 23:20

un premier lien : ICI.
Ce n'est pas (je crois) celui qui m'a fais me poser des questions, donc je cherche encore ! ;-)
Le deuxième (je crois bien que c'est celui-ci !) : ICI.

@ bientôt

LouReeD
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message