Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Block Soldier [en pause]
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Block Soldier [en pause]

Posté le 11/11/2017 22:57

Je suis actuellement en train de réaliser un jeu en Basic sur ma calculatrice CASIO Graph 35+E.







Résumé
Au moins 2 joueurs s'affrontent sur un grille. Le but est qu'il ne reste plus qu'un joueur à la fin (On peut très bien imaginer un autre mode de jeu où les joueurs devraient trouver le plus vite possible une IA qui se déplacerait sur la grille en laissant des indices). Le jeu sera en tour par tour parce que le jeu serait trop désagréable en temps réel à cause de sa lenteur d'affichage (le super Drawstat ne serait pas suffisant).



Les attaques
Les joueurs pourront avoir différentes attaques :
- Donner un coup de poing
- Poser une bombe
- Poser un bloc
On peut bien sûr imaginer d'autres attaques


Les sauvegardes
Les données de la partie, de la map, des joueurs, des entités, etc... pourront être sauvegardés dans les Matrices ou les Listes (File 2,3,4,5). Je ne vais pas développer ici le fonctionnement mais en gros, les données seront classés grâce à des "balises". Ces balises seront reconnaissables grâce à leurs valeurs qui seront à 10 chiffres au contraire des autres données qui seront en dessous de 10 chiffres.


Mes idées

Voici quelques petits dessins de ce que j'imagine déjà



Voir plus d'images














Pour plus d'information sur ce projet, vous pouvez consulter le cahier des charges de ce projet sur Google Doc


Merci d'avoir lu mon post jusque ici, je prendrais avec plaisir vos avis




SEMAINE 1



SEMAINE1

Bonjour
J'ai fini le cahier des charges à 95%, les 5% restants seront les choses auxquels je n'ai pas pensé. J'ai essayé de développer vraiment le fonctionnement des sauvegardes et des fonctions car c'est assez complexe. D'où le reste un peu moins développé.
J'ai commencé à réfléchir sur les différents systèmes du jeu (Menus/ Moteur Graphique).
N'ayant pas beaucoup de temps libre, je ne pense pas que le projet va avancer très vite chaque semaine mais j'essaierai de faire de mon mieux.
Merci d'avoir lu mon post





SEMAINE 2



SEMAINE 2

Cette semaine j'ai avancé sur 2 choses :

- L'algorithme qui permet de générer les données pour tracer les traits de la map.

Code


Les variables et indices de listes seront surement changés, mais le fonctionnement est là.



0 -> A~Z
{e9} -> List 3
{e9} -> List 4
List 1[1] -> C
List 1[2] -> D
1 -> A
1 -> B
1 -> I
0 -> E
'A=CASE X  C=MAX X  
'B=CASE Y  D=MAX Y    E=RESULT CONTENT       ADJACENT CASE IF     CASE EXIST


For 1 -> B To D
    For 1 -> A To C
        
        ClrText
        Locate 1, 1, "A:"
        Locate 1, 2, "B:"
        Locate 1, 3, "I:"
        Locate 4, 1, A
        Locate 4, 2, B
        Locate 4, 3, I
        '■■■■ IF CASE=1 ■■■■
        If List 1[2 + I] = 1 : Then
            
            '■■■■■■■ X++ ■■■■■■■
            0 -> E
            2 + I + 1 <= 2 + C * D => List 1[2 + I + 1] -> E
            
            If (E != 1 Or A = C) And (List 1[2 + I] = 1) : Then

                    Augment(List 3, {e9, A + 1, A + 1}) -> List 3
                    Augment(List 4, {e9, B, B + 1}) -> List 4
                
            IfEnd

            '■■■■■■■ X-- ■■■■■■■
            0 -> E
            2 + I - 1 > 2 => List 1[2 + I - 1] -> E
            
            If (E != 1 Or A = 1) And (List 1[2 + I] = 1) : Then

                    Augment(List 3, {e9, A, A}) -> List 3
                    Augment(List 4, {e9, B, B + 1}) -> List 4
                
            IfEnd
            
            '■■■■■■■ Y++ ■■■■■■■
            0 -> E
            2 + I + C <= 2 + C * D => List 1[2 + I + C] -> E
            
            If E != 1 Or B = D : Then
            
                    Augment(List 3, {e9, A, A + 1}) -> List 3
                    Augment(List 4, {e9, B + 1, B + 1}) -> List 4
                
            IfEnd
            
            '■■■■■■■ Y-- ■■■■■■■
            0 -> E
            2 + I - C > 2 => List 1[2 + I - C] -> E
            
            If E != 1 Or B = 1 : Then
            
                    Augment(List 3, {e9, A, A + 1}) -> List 3
                    Augment(List 4, {e9, B, B}) -> List 4

            IfEnd
            
        IfEnd
        
        I + 1 -> I
        
    Next
Next


Augment(List 3, {e9}) -> List 3
Augment(List 4, {e9}) -> List 4

'■■■■■ SCREEN ■■■■■■

List 3 * 7 -> List 3
List 4 * 7 -> List 4

ViewWindow 1, 127, 0, 1, 63, 0, 1, Dim List 3, 1
S-L-Normal
AxesOff
GridOff
LabelOff
Graph(X,Y)=(List 3[T], List 4[T])◢






- Le système de fonctions. Plus précisément, ce qui permet de récupérer/ajouter/supprimer les données des balises qui n'ont pas d'enfant (pas d'autres balises en eux) sachant que le système sera différent pour les balises qui ont des enfants ( Par exemple la BALISE PLAYERS contient plusieurs fois la BALISE PLAYER)

Code




'■■■■■■■■ BLOCK SOLDIER ■■■■■■■■
'■■■■■■■■■■ FUNCTIONS ■■■■■■■■■■


If F >= 1000 And F <= 9999 : Then
    Goto D
IfEnd

'■■■■■■■■■  COMMON ■■■■■■■■■
'■■■■■■■■■■ 1-999 ■■■■■■■■■■



If F = 1 : Then
    "Fonction 1"
    Return
IfEnd


If F = 2 : Then
    "Fonction 2"
    Return
IfEnd


If F = 3 : Then
    "Fonction 3"
    Return
IfEnd



'■■■■■■■■■■  DATA ■■■■■■■■■■
'■■■■■■■■ 1000-9999 ■■■■■■■■


Lbl D

If F >= 1000 And F <= 9999 : Then

' Verifie l'existence de List 1
"BS_SYSTEM" -> List 1[0]
Dim List 1 <= 1 => Goto E


{0,0,0} -> List 2


' ■■ SYSTEM ■■

F = 1010 =>    9450398719 -> List 2[2]
F = 1011 => {9438619467, 9450398719} -> List 1
F = 1013 =>    9450398719 -> List 2[2]

' ■■ MAP ■■

F = 1013 =>    7472298703 -> List 2[2]

' ■■ GAME ■■

F = 1070 =>    7472298703 -> List 2[2]
F = 1071 => Augment(List 1, {7472298703}) -> List 1
F = 1073 =>    7472298703 -> List 2[2]




' ■■■■ VIEW ■■■■


If (&MOD(;F, 10)) = 0 : Then

    1 -> List 2[1]
    
    While List 2[2] != List 1[List 2[1]]
        List 2[1] + 1 -> List 2[1]
        List 2[1] >= Dim List 1 => Break
    WhileEnd

    If List 2[2] = List 1[List 2[1]]:Then
        List 2[1] + 1 -> List 2[1]
        List 1[List 2[1]]
        {Ans}
        List 2[1] + 1 -> List 2[1]
        
        While (List 1[List 2[1]] < e10)
            List 1[List 2[1]]
            Augment(List Ans, {Ans})
            List 2[1] >= Dim List 1 => Break
            List 2[1] + 1 -> List 2[1]
            
        WhileEnd
    'SI BALISE N'EXISTE PAS
    Else
        { - 404e20}
    IfEnd

    Return
    
IfEnd


' ■■■■ ADD ■■■■

If (&MOD(;F, 10)) = 1 : Then

    Augment(List 1, List Ans) -> List 1
    Return
    
IfEnd




' ■■■■ MODIFY ■■■■

If (&MOD(;F, 10)) = 2 : Then
    
    
    
    
    
    
    Return
    
IfEnd



' ■■■■ DELETE  ■■■■

If ((&MOD(;F, 10)) = 3 )(F != 1013): Then

    ' LE SYSTEME PARCOURT LIST 1 ET MET LES VALEURS DANS LIST ANS SI CE N'EST PAS A
' SUPPRIMER, ENSUITE IL SUFFIT DE METTRE LIST ANS DANS LIST 1 ET DE RESET LIST ANS
    
    1 -> List 2[1]
    List 1[List 2[1]]
    {Ans}
    2 -> List 2[1]
    
    'CONTENU A GARDER (On se contente donc de le mettre dans List Ans)
    While List 2[2] != List 1[List 2[1]]
        List 1[List 2[1]]
        Augment(List Ans, {Ans})
        List 2[1] + 1 -> List 2[1]
        List 2[1] >= Dim List 1 => Break
    WhileEnd

    'SI LA BALISE A SUPPRIMER N'EXISTE PAS
    If List 2[2] != List 1[List 2[1]]:Then
        { - 40420}
        Return
    IfEnd

    'CONTENU A SUPPRIMER (On se contente donc de juste l'ignorer)
    While (List 1[List 2[1]] < 10)
        List 2[1] + 1 -> List 2[1]
        List 2[1] > Dim List 1 => Break
    WhileEnd

    'CONTENU A GARDER (On se contente donc de le mettre dans List Ans)
    While List 2[1] <= (Dim List 1)
        
        List 1[List 2[1]]
        Augment(List Ans, {Ans})
        List 2[1] + 1 -> List 2[1]
    WhileEnd

    List Ans -> List 1
    Return
    
IfEnd



IfEnd

'■■■■■■■■  NO FUNCTIONS ■■■■■■■■
Lbl E
{ - 40420}
"No fonction"
Return







Je suis conscient que c'est pas beaucoup mais je souhaite quand même communiquer sur l'avancement de mon projet. Vous pouvez toujours consulter le Cahier des charges qui a légèrement évolué et le Changelog avec les évolutions du projet.




SEMAINE 3


SEMAINE 3

Nouveau système : la Zone de notifications. Elle va permettre de communiquer plus facilement entre joueur et jeu, par exemple, pour informer sur l'état de la partie. Mais aussi pour communiquer entre développeur et programme puisque qu'on peut très bien imaginer un paramètre qui permettrait d'afficher les notifications techniques. D'ailleurs, il est possible d'exécuter des fonctions à partir de ce menu en cliquant sur EXE (F4) puis en écrivant "=[nº fonction]".
Par exemple : "=1" va exécuter la fonction 1.
Le programme ci-dessous est un programme de test mais le système sera mis dans le gros programme avec toutes les fonctions ( je ne l'ai pas fait par manque de temps, en plus il y a des Lbl ).

Il manque juste le mécanisme qui enlève les anciennes notifications automatiquement car la chaine de caractère qui contient toutes les notifications finit par être trop grande et elle cause un erreur de mémoire.



+ d'Images


Je clique sur EXE :








Je clique sur CLEAR :






Code






'Exemple
'16-Une notification-7-Bla bla-

"" -> Str 1
"16-             ---" -> Str 2
"0123456789" -> Str 3

Goto 2
'■■■■■■  ADD  ■■■■■■
Lbl 1

? -> Str 1
If StrLen(Str 1) > 0 : Then
    If StrCmp(StrMid(Str 1, 1, 1), "=") = 0 : Then
        
        
        Exp(StrMid(Str 1, 2, StrLen(Str 1))) -> F
        Prog "BS-FCTS"
        
    Else
        
        1 -> A
        StrLen(Str 1) -> L
        
        '■■■■■ CONTENT ■■■■■
        
        StrJoin("-", Str 2) -> Str 2
        StrJoin(Str 1, Str 2) -> Str 2
        StrJoin("-", Str 2) -> Str 2
        
        
        '■■ 1ST NUMBER 21■■■
        
        &MOD(;L, 10) + 1 -> A
        
        StrMid(Str 3, A, 1) -> Str 4
        StrJoin(Str 4, Str 2) -> Str 2
        
        '■■ 2ND NUMBER, 21■■
        If L >= 10 : Then
            (L - &MOD(;L, 10)) / 10 + 1 -> A
        Else
            
            1 -> A
        IfEnd
        
        StrMid(Str 3, A, 1) -> Str 4
        StrJoin(Str 4, Str 2) -> Str 2
    IfEnd
IfEnd

Goto 2
'■■ END ADD NOTIF ■■

'■■ NOTIFICATIONS ■■
Lbl 2
1 -> A
Cls
ViewWindow 1, 127, 0, 1, 63, 0
ClrText
BG-None
Text 1, 36, "NOTIFICATIONS"
F-Line 1, 56, 127, 56

Str 2 -> Str 4
StrLen(Str 4) -> L
Text 1, 1, L
Text 1, 14, "c"
StrLen(Str 4) -> L
12 -> I

'■■■■START PRINT■■■■
While I < 58
    
    '◆◆◆ STR LENGTH  ◆◆◆
    Exp(StrMid(Str 4, 1, 2)) -> A
    '◆◆◆ EXTRACT STR ◆◆◆
    StrMid(Str 4, 4, L) -> Str 4
    '◆◆◆  PRINT STR  ◆◆◆
    If A <= 28 : Then
        Text I, 5, StrMid(Str 4, 1, A)
    Else
        
        Text I, 5, StrMid(Str 4, 1, 28)
        I + 6 -> I
        Text I, 5, StrMid(Str 4, 29, A - 28)
    IfEnd
    
    '◆◆ DEL "-" STR 4 ◆◆
    StrMid(Str 4, A + 2, L) -> Str 4
    
    StrLen(Str 4) -> L
    L < 1 => Break
    7 + I -> I
WhileEnd
Text 56, 70, "                     "
F-Line 109, 2, 109, 9
F-Line 109, 9, 126, 9
Text 57, 111, "EXIT"
F-Line 85, 2, 85, 9
F-Line 85, 9, 106, 9
Text 57, 87, "CLEAR"
F-Line 69, 2, 69, 9
F-Line 69, 9, 82, 9
Text 57, 71, "EXE"

"" -> Str 4
'■■■■ END PRINT ■■■■

0 -> G
While G != 31 And G != 29 And G != 39 And G != 49
    GetKey -> G
WhileEnd

G = 31 Or G = 29 => Return
G = 39 => "16-             ---" -> Str 2
G = 49 => Goto 1

Goto 2

WhileEnd





Vous pouvez télécharger le programme (G Drive) (EXE : Permet de mettre une notification ou d’exécuter une fonction , CLEAR : Permet de vider la zone de notifications, EXIT : Permet de sortir)

N'hésitez pas à poser des questions si vous en avez







Liens : Cahier des charges , Changelog , Programmes, Images




Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 12/11/2017 08:27 | #


Ça a l'air intéressant à la fois niveau gameplay (stratégie) et niveau graphismes. Bien joué !

Est-il possible de détruire ou pousser des blocs, ou est-ce qu'ils deviendraient des murs permanents ? (Le premier me semble plus malin, sinon on pourrait vite bloquer la situation.)

Par ailleurs, est-ce que tous les soldats ont les mêmes capacités, ou se comportement différement en terme de vitesse de déplacement, force des coups, fréquence de pose de blocs... ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 12/11/2017 18:58 | #


Alors déjà merci pour ton avis.

Et c'est vrai que ça pourrait être une bonne idée les murs déplaçables, je pense que je vais mettre cette fonctionnalité.

Concernant, les soldats, je pensais à faire des classes où types de soldats qui auraient des attaques/capacités différentes cependant je pense que pour le moment je vais rester sur des soldats avec les mêmes attaques (Coup de poing, bombe, bloc) et les mêmes capacités (vitesse, force, résistance) et peut-être des spawners d'items pour ajouter un peu plus de fun. A voir ...

En gros, pour l'instant, je préfère faire quelque chose de simple et ajouter des fonctionnalités au fur et à mesure.
Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 12/11/2017 19:00 | #


... et tu as raison, on a déjà vu beaucoup de projets trop ambitieux se casser la figure.

Protip : Tu peux sortir tes images de ton spoiler, ça fera une plus belle vitrine pour ton topic, et les images ça influence beaucoup les visiteurs. =p
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 12/11/2017 19:18 | #


Merci pour le conseil, c'est vrai que j'ai vu plein de fois des jeux qui avaient l'air bien mais qui n'avaient aucune image. C'est quand même dommage, c'est la première chose que l'on voie

---------------------------------------------------------------------------------------

Ajouté le 17/11/2017 à 23:24 :



SEMAINE 1

Bonjour !
J'ai fini le cahier des charges à 95%, les 5% restants seront les choses auxquels je n'ai pas pensé. J'ai essayé de développer vraiment le fonctionnement des sauvegardes et des fonctions car c'est assez complexe. D'où le reste un peu moins développé.
J'ai commencé à réfléchir sur les différents systèmes du jeu (Menus/ Moteur Graphique).
N'ayant pas beaucoup de temps libre, je ne pense pas que le projet va avancer très vite chaque semaine mais j'essaierai de faire de mon mieux.



Liens : Cahier des charges , Changelog , Programmes, Images





Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 18/11/2017 07:38 | #


Wow, on voit que t'as de la suite dans les idées ! J'ai jamais vu un descriptif aussi impressionant pour un projet personnel x)

Fais attention seulement à l'optimisation de ton programme (la règle d'estimation est : plus il y a de code et plus ça pue pour toi), tu risques d'avoir des surprises.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 18/11/2017 08:15 | #


Fait gaffe, les images ne s'affichent pas si t'es pas connecté avec le compte Google
Les héberger ailleurs devrait résoudre le problème

Ajouté le 18/11/2017 à 09:17 :
Bon, je viens de finir le GDoc, et en effet t'as bien posé les bases, c'est important pour un projet de cette envergure.

Quelques remarques plus ou moins en vrac :

—————————————————————————

Gestion des variables

C'est une très bonne idée d'avoir recensé les variables dans un tableau, toutefois je pense que tu aura quelques limitations à un moment où un autre, à cause des boucles et appels à des sous-programmes.

Selon moi, la représentation sous forme de graphe (un arbre dans notre cas) me paraît beaucoup plus adaptée.
Chaque nœud est un niveau de programme : une boucle, une condition, un sous-programme, etc.

Tu associe à chaque nœud les variables qu'il utilise. Pour un nouveau nœud, tu peux utiliser n'importe quelle variable qui n'est ni dans ses ascendants, ni ses descendants. C'est beaucoup plus modulable que de réserver des variables pour chaque niveau.

Je sais pas si je suis clair, au besoin demande moi, je peux faire un schéma.

—————————————————————————

Les maps

Tu peux largement optimiser les maps. Ton idée d'enchainer les cases de la matrice sans lien avec la grille de jeu est un bon début, mais tu peux faire beaucoup mieux : stocker plusieurs points de la grille dans une seule case de matrice

Imaginons une map de 6×5 :
110011
100100
101001
000001
110011


On commence par convertir en flux de bits (dans une liste par exemple) :
1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1

Sachant que la calto peut enregistrer des nombres jusqu'à 10^8 sans perte de précision, on peut enregistrer jusqu'à log_2(10^8) = 26,57 bits dans une seule case. Pour pas être emmerdés, disons 25 bits.

On sépare le flux de bits en paquets de 25 :
1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 - 1 0 0 1 1

On converti chaque paquet du binaire vers le décimal :
27038851 19

On sauvegarde uniquement ces deux valeurs. Pour décompresser, on fait l'inverse.

Le gain de place va se faire au stockage, en effet c'est beaucoup trop lent de décompresser à chaque update de la map.
Mais ça donne un sacré gain, dans notre cas 1-2/30 = 93%

—————————————————————————

Les fonctions

Très bonne idée de faire ça, ça permet de structurer le projet de manière claire, sans avoir des milliers de sous-programmes, etc.
Seul point noir : il faut optimiser le nombre de tests à faire pour jumper le plus vite possible là où ça t'intéresse. Si t'as 100 fonctions, et que tu veux exécuter la dernière, c'est stupide de faire 99 tests juste avant.

Pour ça, deux méthodes :
1 – Tu sélectionnes les fonctions vraiment critique pour lesquelles la vitesse est importante, tu les mets dans un autre sous-programme. Il en faut au max 5 à 10 dedans je pense.
2 – Tu utilise les labels. Je sais c'est moche, mais pour le coup c'est plus rapide que des fonctions.
# Programme "~BS-FCTS"

F < 10⇒Goto 1
F < 20⇒Goto 2
F < 30⇒Goto 3

Label 1
If F=1
Then …
IfEnd
Return # Ne pas oublier le Return après chaque fonction pour ne pas tenter d'exécuter les autres
If F=2
Then …
IfEnd
Return

Label 2
If F = 12
Then …
IfEnd


De plus, avec ce système, tu peux facilement grouper tes fonctions au sein du fichier.

Le coup des codes d'erreur est aussi une bonne idée, et même si du coup ça alourdi un peu la syntaxe le code n'en est que plus safe (si c'est bien fait)

—————————————————————————


Voilà, c'est à peu près tout pour le moment, si t'as des questions, y'a suffisament de gus compétents qui squattent ici pour t'aider, que ce soit ici pour les questions importantes, ou la shout si c'est rapide à résoudre.

Ah oui, n'hésite pas à te présenter, ça te donnera les points nécessaires pour accéder à cette fameuse shout, un espace de discussion instantané particulièrement apprécié et actif.

Ajouté le 18/11/2017 à 09:18 :
Au fait, ma signature est particulièrement adaptée en l'occurence
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 18/11/2017 19:47 | #



Merci pour vos retours !

Lephenixnoir a écrit :
Wow, on voit que t'as de la suite dans les idées ! J'ai jamais vu un descriptif aussi impressionant pour un projet personnel x)

Fais attention seulement à l'optimisation de ton programme (la règle d'estimation est : plus il y a de code et plus ça pue pour toi), tu risques d'avoir des surprises.



Merci
Je vais essayer d'optimiser comme je peux.

—————————————————————————



Dark storm a écrit :

Fait gaffe, les images ne s'affichent pas si t'es pas connecté avec le compte Google
Les héberger ailleurs devrait résoudre le problème

Ajouté le 18/11/2017 à 09:17 :
Bon, je viens de finir le GDoc, et en effet t'as bien posé les bases, c'est important pour un projet de cette envergure.

Quelques remarques plus ou moins en vrac...................................................



Merci beaucoup d'avoir pris le temps de lire le GDoc et d'avoir fait un post avec autant de conseils.

Pas bête l'idée de l'arbre avec les variables, je vais essayer de faire ça.
Concernant la compression des maps, j'y avais pensé car je m'étais rendu rendu compte qu'on pouvait stocker jusqu'à 10 chiffres sans perte par contre je n'avais pas pensé à en faire du code binaire. Merci pour l'astuce
Pour les fonctions, je vais très surement mettre ces fonctionnalités

Et pour finir, c'est vrai qu'il est souvent bien plus difficile de finir que commencer, j'en ai l'expérience avec d'autres petits projets



Liens : Cahier des charges , Changelog , Programmes, Images



Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 18/11/2017 20:11 | #


Hé ben, c'est pas souvent qu'on a des projets de cette taille, bonne chance

Si tu as accès à un ordinateur je te conseille d'utiliser BIDE qui t'aidera à t'y retrouver dans le b****l qu'est le basic casio
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 18/11/2017 21:44 | #


Merci
Et oui j'utilise déjà BIDE, c'est vraiment pas mal, je galère juste parfois à ouvrir le fichier mais en faite, je pense que c'est juste parce que je l'enregistrais juste au format .bide sans mettre à coté le fichier .g1m


—————————————————————————

Ajouté le 24/11/2017 à 21:55 :



SEMAINE 2

Cette semaine j'ai avancé sur 2 choses :

- L'algorithme qui permet de générer les données pour tracer les traits de la map.

Code


Les variables et indices de listes seront surement changés, mais le fonctionnement est là.



0 -> A~Z
{e9} -> List 3
{e9} -> List 4
List 1[1] -> C
List 1[2] -> D
1 -> A
1 -> B
1 -> I
0 -> E
'A=CASE X  C=MAX X  
'B=CASE Y  D=MAX Y    E=RESULT CONTENT       ADJACENT CASE IF     CASE EXIST


For 1 -> B To D
    For 1 -> A To C
        
        ClrText
        Locate 1, 1, "A:"
        Locate 1, 2, "B:"
        Locate 1, 3, "I:"
        Locate 4, 1, A
        Locate 4, 2, B
        Locate 4, 3, I
        '■■■■ IF CASE=1 ■■■■
        If List 1[2 + I] = 1 : Then
            
            '■■■■■■■ X++ ■■■■■■■
            0 -> E
            2 + I + 1 <= 2 + C * D => List 1[2 + I + 1] -> E
            
            If (E != 1 Or A = C) And (List 1[2 + I] = 1) : Then

                    Augment(List 3, {e9, A + 1, A + 1}) -> List 3
                    Augment(List 4, {e9, B, B + 1}) -> List 4
                
            IfEnd

            '■■■■■■■ X-- ■■■■■■■
            0 -> E
            2 + I - 1 > 2 => List 1[2 + I - 1] -> E
            
            If (E != 1 Or A = 1) And (List 1[2 + I] = 1) : Then

                    Augment(List 3, {e9, A, A}) -> List 3
                    Augment(List 4, {e9, B, B + 1}) -> List 4
                
            IfEnd
            
            '■■■■■■■ Y++ ■■■■■■■
            0 -> E
            2 + I + C <= 2 + C * D => List 1[2 + I + C] -> E
            
            If E != 1 Or B = D : Then
            
                    Augment(List 3, {e9, A, A + 1}) -> List 3
                    Augment(List 4, {e9, B + 1, B + 1}) -> List 4
                
            IfEnd
            
            '■■■■■■■ Y-- ■■■■■■■
            0 -> E
            2 + I - C > 2 => List 1[2 + I - C] -> E
            
            If E != 1 Or B = 1 : Then
            
                    Augment(List 3, {e9, A, A + 1}) -> List 3
                    Augment(List 4, {e9, B, B}) -> List 4

            IfEnd
            
        IfEnd
        
        I + 1 -> I
        
    Next
Next


Augment(List 3, {e9}) -> List 3
Augment(List 4, {e9}) -> List 4

'■■■■■ SCREEN ■■■■■■

List 3 * 7 -> List 3
List 4 * 7 -> List 4

ViewWindow 1, 127, 0, 1, 63, 0, 1, Dim List 3, 1
S-L-Normal
AxesOff
GridOff
LabelOff
Graph(X,Y)=(List 3[T], List 4[T])◢






- Le système de fonctions. Plus précisément, ce qui permet de récupérer/ajouter/supprimer les données des balises qui n'ont pas d'enfant (pas d'autres balises en eux) sachant que le système sera différent pour les balises qui ont des enfants ( Par exemple la BALISE PLAYERS contient plusieurs fois la BALISE PLAYER)

Code




'■■■■■■■■ BLOCK SOLDIER ■■■■■■■■
'■■■■■■■■■■ FUNCTIONS ■■■■■■■■■■


If F >= 1000 And F <= 9999 : Then
    Goto D
IfEnd

'■■■■■■■■■  COMMON ■■■■■■■■■
'■■■■■■■■■■ 1-999 ■■■■■■■■■■



If F = 1 : Then
    "Fonction 1"
    Return
IfEnd


If F = 2 : Then
    "Fonction 2"
    Return
IfEnd


If F = 3 : Then
    "Fonction 3"
    Return
IfEnd



'■■■■■■■■■■  DATA ■■■■■■■■■■
'■■■■■■■■ 1000-9999 ■■■■■■■■


Lbl D

If F >= 1000 And F <= 9999 : Then

' Verifie l'existence de List 1
"BS_SYSTEM" -> List 1[0]
Dim List 1 <= 1 => Goto E


{0,0,0} -> List 2


' ■■ SYSTEM ■■

F = 1010 =>    9450398719 -> List 2[2]
F = 1011 => {9438619467, 9450398719} -> List 1
F = 1013 =>    9450398719 -> List 2[2]

' ■■ MAP ■■

F = 1013 =>    7472298703 -> List 2[2]

' ■■ GAME ■■

F = 1070 =>    7472298703 -> List 2[2]
F = 1071 => Augment(List 1, {7472298703}) -> List 1
F = 1073 =>    7472298703 -> List 2[2]




' ■■■■ VIEW ■■■■


If (&MOD(;F, 10)) = 0 : Then

    1 -> List 2[1]
    
    While List 2[2] != List 1[List 2[1]]
        List 2[1] + 1 -> List 2[1]
        List 2[1] >= Dim List 1 => Break
    WhileEnd

    If List 2[2] = List 1[List 2[1]]:Then
        List 2[1] + 1 -> List 2[1]
        List 1[List 2[1]]
        {Ans}
        List 2[1] + 1 -> List 2[1]
        
        While (List 1[List 2[1]] < e10)
            List 1[List 2[1]]
            Augment(List Ans, {Ans})
            List 2[1] >= Dim List 1 => Break
            List 2[1] + 1 -> List 2[1]
            
        WhileEnd
    'SI BALISE N'EXISTE PAS
    Else
        { - 404e20}
    IfEnd

    Return
    
IfEnd


' ■■■■ ADD ■■■■

If (&MOD(;F, 10)) = 1 : Then

    Augment(List 1, List Ans) -> List 1
    Return
    
IfEnd




' ■■■■ MODIFY ■■■■

If (&MOD(;F, 10)) = 2 : Then
    
    
    
    
    
    
    Return
    
IfEnd



' ■■■■ DELETE  ■■■■

If ((&MOD(;F, 10)) = 3 )(F != 1013): Then

    ' LE SYSTEME PARCOURT LIST 1 ET MET LES VALEURS DANS LIST ANS SI CE N'EST PAS A
' SUPPRIMER, ENSUITE IL SUFFIT DE METTRE LIST ANS DANS LIST 1 ET DE RESET LIST ANS
    
    1 -> List 2[1]
    List 1[List 2[1]]
    {Ans}
    2 -> List 2[1]
    
    'CONTENU A GARDER (On se contente donc de le mettre dans List Ans)
    While List 2[2] != List 1[List 2[1]]
        List 1[List 2[1]]
        Augment(List Ans, {Ans})
        List 2[1] + 1 -> List 2[1]
        List 2[1] >= Dim List 1 => Break
    WhileEnd

    'SI LA BALISE A SUPPRIMER N'EXISTE PAS
    If List 2[2] != List 1[List 2[1]]:Then
        { - 40420}
        Return
    IfEnd

    'CONTENU A SUPPRIMER (On se contente donc de juste l'ignorer)
    While (List 1[List 2[1]] < 10)
        List 2[1] + 1 -> List 2[1]
        List 2[1] > Dim List 1 => Break
    WhileEnd

    'CONTENU A GARDER (On se contente donc de le mettre dans List Ans)
    While List 2[1] <= (Dim List 1)
        
        List 1[List 2[1]]
        Augment(List Ans, {Ans})
        List 2[1] + 1 -> List 2[1]
    WhileEnd

    List Ans -> List 1
    Return
    
IfEnd



IfEnd

'■■■■■■■■  NO FUNCTIONS ■■■■■■■■
Lbl E
{ - 40420}
"No fonction"
Return







Je suis conscient que c'est pas beaucoup mais je souhaite quand même communiquer sur l'avancement de mon projet. Vous pouvez toujours consulter le Cahier des charges qui a légèrement évolué et le Changelog avec les évolutions du projet.



Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 26/11/2017 04:46 | #


C'est déjà plus que la plupart d'entre nous

Juste comme ça, je pense que tu le sais déjà, mais la condition 1000 <= F <= 9000 peut se simplifier comme cela : 1000 <= F And F <= 9000 =>Goto D
Au passage, pour ce genre de conditions (appartenance à un intervalle), je conseille d'écrire A<X and X<B. C'est plus naturel comme notation.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 01/12/2017 20:44 | # | Fichier joint


Merci

Oui je le savais mais c'était parce que j'avais mis plusieurs lignes de codes à cette endroit pour finalement les déplacer plus bas après. Merci de ton avis


—————————————————————————



SEMAINE 3

Nouveau système : la Zone de notifications. Elle va permettre de communiquer plus facilement entre joueur et jeu, par exemple, pour informer sur l'état de la partie. Mais aussi pour communiquer entre développeur et programme puisque qu'on peut très bien imaginer un paramètre qui permettrait d'afficher les notifications techniques. D'ailleurs, il est possible d'exécuter des fonctions à partir de ce menu en cliquant sur EXE (F4) puis en écrivant "=[nº fonction]".
Par exemple : "=1" va exécuter la fonction 1.
Le programme ci-dessous est un programme de test mais le système sera mis dans le gros programme avec toutes les fonctions ( je ne l'ai pas fait par manque de temps, en plus il y a des Lbl ).

Il manque juste le mécanisme qui enlève les anciennes notifications automatiquement car la chaine de caractère qui contient toutes les notifications finit par être trop grande et elle cause un erreur de mémoire.



+ d'Images


Je clique sur EXE :








Je clique sur CLEAR :






Code






'Exemple
'16-Une notification-7-Bla bla-

"" -> Str 1
"16-             ---" -> Str 2
"0123456789" -> Str 3

Goto 2
'■■■■■■  ADD  ■■■■■■
Lbl 1

? -> Str 1
If StrLen(Str 1) > 0 : Then
    If StrCmp(StrMid(Str 1, 1, 1), "=") = 0 : Then
        
        
        Exp(StrMid(Str 1, 2, StrLen(Str 1))) -> F
        Prog "BS-FCTS"
        
    Else
        
        1 -> A
        StrLen(Str 1) -> L
        
        '■■■■■ CONTENT ■■■■■
        
        StrJoin("-", Str 2) -> Str 2
        StrJoin(Str 1, Str 2) -> Str 2
        StrJoin("-", Str 2) -> Str 2
        
        
        '■■ 1ST NUMBER 21■■■
        
        &MOD(;L, 10) + 1 -> A
        
        StrMid(Str 3, A, 1) -> Str 4
        StrJoin(Str 4, Str 2) -> Str 2
        
        '■■ 2ND NUMBER, 21■■
        If L >= 10 : Then
            (L - &MOD(;L, 10)) / 10 + 1 -> A
        Else
            
            1 -> A
        IfEnd
        
        StrMid(Str 3, A, 1) -> Str 4
        StrJoin(Str 4, Str 2) -> Str 2
    IfEnd
IfEnd

Goto 2
'■■ END ADD NOTIF ■■

'■■ NOTIFICATIONS ■■
Lbl 2
1 -> A
Cls
ViewWindow 1, 127, 0, 1, 63, 0
ClrText
BG-None
Text 1, 36, "NOTIFICATIONS"
F-Line 1, 56, 127, 56

Str 2 -> Str 4
StrLen(Str 4) -> L
Text 1, 1, L
Text 1, 14, "c"
StrLen(Str 4) -> L
12 -> I

'■■■■START PRINT■■■■
While I < 58
    
    '◆◆◆ STR LENGTH  ◆◆◆
    Exp(StrMid(Str 4, 1, 2)) -> A
    '◆◆◆ EXTRACT STR ◆◆◆
    StrMid(Str 4, 4, L) -> Str 4
    '◆◆◆  PRINT STR  ◆◆◆
    If A <= 28 : Then
        Text I, 5, StrMid(Str 4, 1, A)
    Else
        
        Text I, 5, StrMid(Str 4, 1, 28)
        I + 6 -> I
        Text I, 5, StrMid(Str 4, 29, A - 28)
    IfEnd
    
    '◆◆ DEL "-" STR 4 ◆◆
    StrMid(Str 4, A + 2, L) -> Str 4
    
    StrLen(Str 4) -> L
    L < 1 => Break
    7 + I -> I
WhileEnd
Text 56, 70, "                     "
F-Line 109, 2, 109, 9
F-Line 109, 9, 126, 9
Text 57, 111, "EXIT"
F-Line 85, 2, 85, 9
F-Line 85, 9, 106, 9
Text 57, 87, "CLEAR"
F-Line 69, 2, 69, 9
F-Line 69, 9, 82, 9
Text 57, 71, "EXE"

"" -> Str 4
'■■■■ END PRINT ■■■■

0 -> G
While G != 31 And G != 29 And G != 39 And G != 49
    GetKey -> G
WhileEnd

G = 31 Or G = 29 => Return
G = 39 => "16-             ---" -> Str 2
G = 49 => Goto 1

Goto 2

WhileEnd





Vous pouvez télécharger le programme (G Drive) (EXE : Permet de mettre une notification ou d’exécuter une fonction , CLEAR : Permet de vider la zone de notifications, EXIT : Permet de sortir)



N'hésitez pas à poser des questions si vous en avez




Liens : Cahier des charges , Changelog , Programmes, Images



Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 02/12/2017 02:23 | #


Pour coup un truc tout con qui peut marcher (avec # ton séparateur) :

"Notif 1 " → Str 1
"Anciennes notifs" → Str 2

Si longueur Str 1 + longueur Str 2 > 254:
    Str 2 = Str 2 - Première notif + "#" + Str 1


Sachant que Str 2 - Première notif devrait pouvoir être obtenu (à quelques indices près) comme ceci :
StrMid(Str 2, StrScr(Str 2, "#") + 1, 255)

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 02/12/2017 08:38 | #


Darks, pourquoi pas StrRight(Str, StrSrc(Str 2, "#")+1) pour extraire ça plutôt ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 02/12/2017 09:02 | #


Alors, il faut savoir que ça enregistre dans ce sens la :
3eme notification, 2 eme notification, 1ere notification
"17-3eme notification-17-2eme notification-17-1ere notification"

Pourquoi ? Parceque c'est beaucoup plus simple de récupérer la taille de la dernière chaîne de caractère au moment de l'affichage

Après on peut imaginer un système de ce genre : (non testé)



Si Str 2 est trop grand :

1 → I
StrLen(Str 4) → L

While I < L
    
    '◆◆◆ STR LENGTH  ◆◆◆
    Exp(StrMid(Str 2, I, 2)) → A
    '◆◆◆ SI IL N'Y A PAS UNE AUTRE NOTIFICATION APRÈS◆◆◆
    If ( I + ‎A + 3 ) > L :Then
       StrRight(Str 2, A+4) → Str 2
       Break
    Else
       I + A + 4 →I
    IfEnd
    ‎
WhileEnd





Sinon le StrSrc ca renvoie juste la première occurrence, c'est pas problématique ?
Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »


Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 02/12/2017 09:35 | #


Parce que StrRight coupe les x caractères de fin (et pas depuis l'index) il me semble.
Donc StrRight(Str, StrLen(Str 2) - StrScr(Srt 2, "#") + 1)

Ajouté le 02/12/2017 à 09:36 :
Bref, sinon j'ai l'impression que tu t'es compliqué la vie pour pas grand chose xD
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Tetraxel Hors ligne Membre Points: 13 Défis: 0 Message

Citer : Posté le 03/12/2017 10:59 | #


Bon mon système ne peut pas afficher plus de 6 notifications à cause de la taille de l'écran et de la mémoire qui se remplit vite. Donc je pense que je vais sauvegarder les notifications 1,2,3,4,5,6 dans les Str 1,2,3,4,5,6. Ça sera + rapide et + facile d'utilisation.
Mon projet de jeu : BLOCK SOLDIER
Citation
« Toutes les actions comportent une part de risque. La prudence ne consiste pas à éviter le danger (c'est impossible) mais à calculer les risques et à agir avec détermination. Commettez des erreurs par ambition, non par paresse. Développez la force de faire des choses osées, pas la force de souffrir »



LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 67 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd