Forums Casio - Projets de programmation

Index du Forum | Projets de programmation | BLOCK SOLDIER
Tetraxel
Hors ligne
Membre
Niveau: Intermédiaire
Points: 9
Défis: 0
Message
Posté le 11/11/2017 22:57

BLOCK SOLDIER  :

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


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.
Merci d'avoir lu mon post








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
Niveau: Confirmé
Points: 10252
Défis: 130
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... ?
----------------------------------
Watch me, as I build my empire with my own hands.
Tetraxel
Hors ligne
Membre
Niveau: Intermédiaire
Points: 9
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
Niveau: Confirmé
Points: 10252
Défis: 130
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
----------------------------------
Watch me, as I build my empire with my own hands.
Tetraxel
Hors ligne
Membre
Niveau: Intermédiaire
Points: 9
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.


----------------------------------
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
Niveau: Confirmé
Points: 10252
Défis: 130
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.
----------------------------------
Watch me, as I build my empire with my own hands.
Dark storm
Hors ligne
Administrateur
Niveau: Aucun
Points: 9843
Défis: 170
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 graph (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
Páranÿe quetë Quendya
Tetraxel
Hors ligne
Membre
Niveau: Intermédiaire
Points: 9
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




----------------------------------
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
En ligne
Membre
Niveau: Confirmé
Points: 740
Défis: 9
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
Niveau: Intermédiaire
Points: 9
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. 8)


----------------------------------
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 »




Index du Forum | Projets de programmation | BLOCK SOLDIER
Publicité et partenaires
Casio Education
Casio éducation

TI-Planet
Casiopeia
Casiopeia
CasioFan, la communauté ClassPad
CasioFan
CodeWalrus
CodeWalrus

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2017 | Il y a 53 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Rugby Manager | Jeu de basket | Jeu de handball | Jeu de tennis | Nova Raider | Réparation téléphone | Soccer Rush | Tasty Tale

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd