Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Tamagotchi ou la gestion du temps en C
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Tamagotchi ou la gestion du temps en C

Posté le 17/08/2018 14:37

Bonjour à tous !!
Oui oui je sais je ferais mieux d'arrêter les conneries et de terminer mes anciens projets... Mais je le avance petit à petit dans l'ombre et le silence (mais si c'est vrai !)
Désireux de progresser en C j'ai eu l'idée de me familiariser avec le système de tics inclus dans la calto et qui permet de mesurer le temps (comme vous en savez plus que moi sur le sujet je demanderais sans doute un peu d'aide ) oui oui c'est bon : j'ai déjà vu, lu signé et approuvé le tuto qui en parle.
Passons au cœur du projet : vous connaissez tous les Tamagotchi : ces petites consoles vendu au Japon vers la moitié des années 90 (1996 au Japon et 97 en Europe pour être précis). Le but et de chouchouter, pouponner et nourrir un petit animal virtuel dans le but de le faire... vivre... oui oui c'est ça le but ultime par le tuer en un minimum de temps... je vois votre déception d'ici.
Bon pour mon premier jet je vais essayer de faire un truc le plus basique possible (mais je le fait en C) J'ai déjà mis sur pied mon systèmes de points et tout je fais mes sprites prochaines étape : le code.

J'ai hiérarchisé mes idées en plusieurs catégories :
les Actions
On fait des actions grâce au touche F1~F5
F1 : lui donner à manger
F2 : aller au Wc (j'invente rien c'est dans le jeu original...)
F3 : le laver
F4 : jouer
F5 : le faire dormir
Voila pour les Actions disponibles

les Points
Je les ai subdivisé en 5 catégories :
-Pts d'équilibre (eq) correspond à l'équilibre de son alimentation
-Pts d'énergie (en) rien d'extraordinaire vous savez à quoi ça sert l'énergie...
-Pts de faim (f) correspond à la satiété : plus on a de Pts de faim moins il a faim...
-Pts d'humeur (hu) Si il en a beaucoup il est sympa sinon il te fait la gueule
-Pts d'hygiène (hy) Comprenez la propreté.

gestion du temps
Avec les temps les points évolue.
Les points :
-d'énergie
-de faim
-d'humeur
-d'hygiène
perdent 2 par heures

Le temps intervient également dans les envies du moment attention : ces envies relèvent non pas des besoins de l'animal mais de sa "volonté" ainsi il aura envie :
-de manger toutes les heures
-de jouer toutes les deux heures
-d'aller au Wc toutes les 2h30
-de se laver toutes les 4 heures
-et de dormir toutes les 5 heures

les Stats
Elles seront composées de jauges aves un petit logo devant qui indiques quel points la jauge représente.
Un petit éclair pour l'énergie, un savon avec des bulles pour l'hygiène, une fourchette pour la faim, et une balance pour l'équilibre.
Les stats pourrons être appelées via [OPTN]

Manger
Cette action m'étant fort sympathique j'ai décider d'étayer les choix...
Le joueur pourra choisir entre plusieurs mets ayant chacun leurs bon et les mauvais points...
-Le bol de riz : eq+2 / en+80 / f+100 / hu-5 / hy-30
-le burger : eq-10 / en+80 / f+80 / hu+10 / hy-30
-le gâteau : eq-5 / en+50 / f+100 / hu+10 / hy-30
-la soupe : eq+10 / en+50 / f+80 / hu-5 / hy-30
-le lait : eq+5 / en+20 / f+20 / hu+5 / hy-30
-le soda : eq-2 / en+10 / f+10 / hu+5 / hy-30
Voila
Lorsque la touche F1 est pressée, le bord droit de l'image se décale vers la gauche ménageant ainsi un espace dans lequel vous aurez deux flèches de part et d'autre du logo de la nourriture place au milieu. En dessous le nom de la nourriture apparaitra et en haut un indication : "[F1]⇒Ok [F6]⇒Non"


les autre Actions et les Points
Toutes action interagissent avec les points :
-manger (déjà fait)
-aller au Wc : en-5 / hy+20
-jouer : eq+5 / en-20 / f-20 / hu+20 / hy-20
-dormir : en au max / f-80 / hu+60 / hy-60
-le laver : en-20 / f-20 / hu+20 / hy+80

les Jeux
Le menu des jeux se présente de la même manière que celui pour manger sauf que le logo est celui du jeu en question et le nom de la nourriture est remplacer par une règle succincte du jeu.
Exemple : le logo est une balle qui tombe et la règle est "Attrapez les balles".
Les points pourrait varier d'un jeu à l'autre mais je n'en suis pas là.
J'ajouterais surement "faire une balade" et "caresser" et pis après je m'en remet à vous

Dans les améliorations à venir noter que j'ai l'intention de mettre sur pied un système qui permet de faire communiquer les Tamagotchi entre eux comme les vrais...

Je pense que j'ai fait le tour de l'état du projet théorique actuel.



Etat du projet...
...en ruines

Le code de compatibilité SH4 doit être nettoyé
la créations de fonctions pour l'affichages des animations fait !
utilisation des matrices Inutile


Fichier joint


Pages : Précédente1, 2, 3, 4, 5, 6, 7, 8, 9, ... 11Suivante
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 18/08/2018 20:30 | #


Je checke ça demain ou après demain
pour le tableau c'est nickel merci

Ajouté le 19/08/2018 à 16:34 :
Les deux erreurs précédentes ont été réglée au profit d'une troisième : une L2310(E) Undefined external symbol "_BFile_CreateFile" referenced in "C:\user\..."
Si j'ai bine compris il s'agit d'une fonction non-déclarée (ici BFile_CreateFile) mais comment je peux faire pour la déclarer ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
ZezombyeHors ligneRédacteurPoints: 1625 Défis: 12 Message

Citer : Posté le 19/08/2018 16:36 | #


C'est Bfile_CreateFile
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 16:38 | #


Merci mon dieux quel con je fait...

Ajouté le 19/08/2018 à 16:45 :
J'ai eu une idée... (aïe) Est-ce que je peux créer plusieurs tableaux pour le temps :
-timeref (mis à jour au lancement et au sortir de l'add-in, permet d'avoir une référence)
-timeborn (sauvegarde du temps lors de la naissance)
-timeecou (mis à jour en permanence dans la boucle principale il permet de connaître le temps écoulé depuis la naissance)
-timeactu ( mis à jour en même temps que timeecou il permet de connaître le temps depuis le dernier lancement de l'add-in)
Est-ce une bonne idée, et si oui, es-ce faisable ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 16:47 | #


Niveau « bonne idée », tu fais ce qui t'arrange à vrai dire. Moi je trouve que c'est pas mal, par contre il ne faut pas confondre les dates et heures comme timeborn des temps écoulés comme timeecou. Ce ne sont pas vraiment les mêmes choses ; en général les temps écoulés on préfère les représenter en nombre de secondes plutôt que par morceaux heure-minute-seconde.
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 16:51 | #


Bon après je n'y suis pas encore...
Pour lire un tableau dans un fichier avec Bfile_ comment fait-on ?
Je me heute également à un autre problème : dès le début je demande au code de créer un fichier mais va-t-il comprendre que si le fichier est déjà créer il suffit de récupérer les données ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 16:53 | #


Première question : tu utilises Bfile_ReadFile(). Ça marche comme Bfile_WriteFile(), je te laisse exprès aller voir dans la doc du SDK.

Seconde question : non. La création va probablement échouer. Tu dois d'abord décider si le fichier existe, si oui tu le charges, si non tu le crées. Une autre solution c'est de décider de l'action à faire selon que ton joueur sélectionne « nouvelle partie » ou « charger partie » sur l'écran principal du jeu.
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 16:57 | #


C'est pas bête du tout de faire un écran au début...
Je verrais plus tard pour gérer les bêtises du joueur qui veut charger un partie qu'il n'as pas commencé...

Ajouté le 19/08/2018 à 17:11 :
la bonne nouvelle est que j'ai trouvé la doc https://wiki.planet-casio.com/fr/Fxlib.h#Bfile_ReadFile
la mauvaise est que je reste un débutant qui ne connait pas grand-chose aux handle et aux buffers...
Si j'ai bien compris la fonction qui me permet d'ouvrir un fichier me renvoie un nombre "handle" qui est spécifique au fichier ouvert, ce chiffre me permet par la suite de "cibler" ce fichier ? c'est cela ? Je pense qu'il s'agit de la variable "fd" que tu as mises Lephe, sans me dire à quoi elle sert...



"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 17:12 | #


Eh bien, en fait... c'est tout à fait ça. Il n'y a rien à ajouter, la valeur du handle est un mystère pour tout le monde sauf l'OS.
Dark stormEn ligneMembre d'honneurPoints: 10828 Défis: 176 Message

Citer : Posté le 19/08/2018 17:12 | #


Si j'ai bien compris la fonction qui me permet d'ouvrir un fichier me renvoie un nombre "handle" qui est spécifique au fichier ouvert, ce chiffre me permet par la suite de "cibler" ce fichier ? c'est cela ?

C'est cela, en effet.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 17:18 | #


bon il me reste le buffer d'après me modestes connaissances il s'agit d'un espace mémoire... qui est occupé temporairement mais la doc me parle d'un pointeur de buffers pour recevoir des données dans un tableau... J'ai l'impression de tout mélanger... Comment je peux faire pour recevoir mes données ? il faut que je fasse un autre tableau ? dont je passe le nom en pointeur et hop ?
après il me reste le nombres d'octets à lire j'en ai aucune idée
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 17:42 | #


Un buffer c'est un espace mémoire, en effet. Occupé temporairement, pas forcément.

Un tableau c'est une zone de mémoire par exemple... donc basiquement tu peux utiliser ton tableau comme buffer. Le tout c'est que tu utilises une variable du même type quand tu lis et quand tu écris.
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 17:46 | #


Donc si je met en unsigned int timeref[]={0,0,0,0}
puis dans la fonction : Bfile_ReadFile(int fd,*timeref)
il va récupérer les données et les mettre dans timeref ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 17:51 | #


Il faut te souvenir que quand tu écris...

int fd;
/* ou bien */
int fd = ...;

tu crées une variable qui s'appelle fd et tu dis que son type est int. Mais la variable s'appelle fd. Donc Bfile_ReadFile(fd, ...), pas Bfile_ReadFile(int fd, ...).

De la même façon, le prototype de Bfile_ReadFile() se lit :

int Bfile_ReadFile(int handle, void *buffer, size_t size);
- La fonction s'appelle [Bfile_ReadFile]
- Son premier argument est de type [int]
- Son deuxième argument est de type [void *]
- Son troisième argument est de type [size_t]
- Elle renvoie un objet de type [int]

L'étoile dans void * fait partie du type. C'est bien void * d'un côté et buffer de l'autre. Tu n'as pas à recopier l'étoile quand tu fais l'appel.

Donc Bfile_ReadFile(fd, timeref, ...). Et là il faut spécifier combien d'octets tu veux lire.
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 17:53 | #


J'aimerais qu'il me lise tous le tableau Mais je n'ai pas compris : le nom du tableau que je donne va être lu ou va recevoir les données ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 19/08/2018 17:54 | #


Quand tu utilises Bfile_WriteFile(), le contenu du tableau est copié dans le fichier. L'ancien contenu du fichier est perdu.

Quand tu utilises Bfile_ReadFile(), le contenu du fichier est copié dans le tableau. L'ancien contenu du tableau est perdu.
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 19/08/2018 17:55 | #


ok
merci

Ajouté le 20/08/2018 à 10:34 :
Bon, j'ai réussi à lancer l'addin l'écran de démarrage est ok la naissance est gérée.
Pour le temps je me empêtrer dans mes idées je ne sais pas comment faire...
Il faudrait que je puisse le temps depuis la dernière partie mais aussi (c'est là ou je suis embrouillé) le temps depuis le lancement de l'addin. Je m'explique il me faudrait un tableau timeref pour savoir combien se temps s'est écoulé entre chaque partie ce qui permet de faire évoluer le jeu même lorsque l'on ne joue pas.
Un autre tableau genre timeactu mis à jour en permanence, se soustrait à timeref pour donner timeecou ce qui permet de savoir le temps écoulé depuis le lancement du jeu...

Ajouté le 20/08/2018 à 10:59 :
Comment je peux faire pour afficher le contenu du tableau timeactu ?
char str[100];
//d'autre déclarations...
main(){
sprint(str,"%d heures",timeactu[0]);
PrintMini(10,10,str,0);
}


Le programme m'affiche "o&m"...
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 20/08/2018 11:04 | #


Eh bien, c'est comme tu as fait normalement. On peut voir un peu plus de code ?
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 20/08/2018 11:07 | #


bien sûr le voici :
int i=0;
char str[100];
unsigned int hours=0, mins=0, secs=0, msecs=0;
unsigned int timeactu[]={0,0,0,0},timeref[]={0,0,0,0},timeecou[]={0,0,0,0};
static int SysCallCode[] = { 0xD201422B, 0x60F20000, 0x80010070 };
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void *)&SysCallCode;
void RTC_GetTime (unsigned int *hours, unsigned int *mins, unsigned int *secs, unsigned int *msecs)
{
    SysCall((unsigned int)hours,(unsigned int)mins,(unsigned int)secs,(unsigned int)msecs, 0x03a);
}

int eq=50,en=100,f=100,hu=100,hy=100,key=0,fd=0,partie=0;

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    partie=accueil();
    time();
    sprintf(str,"%d heures",timeactu[0]);
    PrintMini(10,10,str,0);
    key=0;
    GetKey(&key);

    return 1;
}


Ajouté le 20/08/2018 à 11:15 :
  fd=Bfile_OpenFile(PathName,_OPENMODE_READ);
        Bfile_ReadFile(fd,timeref,4,-1);
        Bfile_DeleteFile(PathName);
        Bfile_CreateFile(PathName, 1000);
        RTC_GetTime(&hours, &mins, &secs, &msecs);
        timeactu[0]=hours;
        timeactu[1]=mins;
        timeactu[2]=secs;
        timeactu[3]=msecs;
        for(i==0;i<3;i++)
        {
            timeecou[i]=timeactu[i]-timeref[i];
            timeref[i]=timeactu[i];
        }
        fd=Bfile_OpenFile(PathName, _OPENMODE_WRITE);
        Bfile_WriteFile(fd, &timeref, sizeof(timeref));
        Bfile_CloseFile(fd);
        

C'est la suite désolé de la latence
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 20/08/2018 11:17 | #


Par hasard, est-ce que tu as pensé à inclure stdio.h en ajoutant cette ligne au début de ton code ?

#include <stdio.h>
Shadow15510En ligneAdministrateurPoints: 3799 Défis: 15 Message

Citer : Posté le 20/08/2018 11:18 | #


ah non tiens... merci

Ajouté le 20/08/2018 à 12:44 :
J'ai une question : Si je lance le jeu et que je clique sur "nouvelle partie" le programme va alors déclarer les variables des points. Maintenant je quitte le jeu puis j'y retourne et je clique sur Continuer... Le programme ne va pas déclarer les variables des points mais peut-il s'en servir quand même vu qu'elles ont été déclarées lors du dernier lancement ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirEn ligneAdministrateurPoints: 15785 Défis: 136 Message

Citer : Posté le 20/08/2018 12:47 | #


Absolument pas. Lorsque tu quittes l'add-in l'univers s'effondre et est détruit. Lorsque tu le lances, un Big Bang se produit dans la calculatrice et ton programme est chargé en mémoire.
Pages : Précédente1, 2, 3, 4, 5, 6, 7, 8, 9, ... 11Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 89 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