Un nouveau jeu

Espace libre pour faire connaître vos dernières réalisations ou les événements concernant la communauté (concours, jeux individuels, etc.)

Modérateurs: Stormi, Otto Grimwald

Un nouveau jeu

Messagepar SIM54 le Mar Nov 25, 2008 5:41 pm

Bonsoir !

Voilà donc mon nouveau. Dans celui-ci il s'agira de récupérer des objets pour les rassembler dans un boite. Faites attention l'on peut parfois se retrouver bloquer si l'on ne fait pas attention. Dans ce jeu, pas de carte fixe mais différente possibilité à chaque fois.

Le jeu ( pour Mac OS X ) et son code source sont en ligne sur la base de téléchargement du site.

Bon jeu !
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Otto Grimwald le Mar Nov 25, 2008 10:10 pm

J'ai placé 2 binaires pour ton jeu ici (windows et linux) :
http://ifiction.free.fr/telechargement/SIM54/

J'ai essayé de compiler depuis windows, mais je n'y arrive pas du tout. En revanche, j'ai pu le faire depuis linux avec mingw32-gcc.
Là où sous linux j'ai un simple avertissement (warning: conflicting types for 'laby2' etc), sous windows cela met une erreur, et je n'ai pas trouvé d'option pour corriger cela.

Par contre il reste un gros problème d'affichage des accents avec windows. J'ai essayé tous les encodages possible, mais c'est toujours pas les bons.

Au niveau du jeu en lui-même, l'idée est amusante et intéressante, et le résultat ressemble bien à une fiction interactive, mais la même critique faite auparavant s'applique toujours :
Code: Tout sélectionner
Vous voyez une lampe


> prendre la lampe
=> fonctionne

> prendre lampe
=> ne fonctionne pas (ainsi que le variante : prendre une lampe etc.)

c'est du détail ici, mais vu que tes tests sont codés directement, il est de façon générale impossible d'utiliser des synonymes ou des variations dans les phrases, et il faut souvent deviner la construction de la bonne phrase, ce qui limite un peu l'interactivité :(

Tu es certain que tu ne veux pas utiliser un moteur de jeu existant ? Cela te permettra de te concentrer sur l'histoire, plus que sur le codage.

Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3031
Inscription: Mar Aoû 24, 2004 12:02 pm

Re: Un nouveau jeu

Messagepar SIM54 le Mer Nov 26, 2008 8:31 am

Otto Grimwald a écrit:Tu es certain que tu ne veux pas utiliser un moteur de jeu existant ? Cela te permettra de te concentrer sur l'histoire, plus que sur le codage.


En fait si je code en C c'est pour améliorer mon niveau dans ce langage, donc d'une certaine manière je le fais un peu plus pour le codage. Mais j'arrive aussi à m'occuper, un peu, de l'histoire.

Je pense qu'il faudrait que je fasse une sorte de bibliothéque C, contenant divers phrases, ex : "Prendre une lampe", "poser le vase sur la table"

Donc pour le moment je ne veux pas trop utiliser un moteur de jeu existant.

Et sinon Otto, le jeu est jouable ? Tu a pu finir le jeu sans problème ( bug, erreur, mort imprévue, blocage, ... ) ?
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Otto Grimwald le Mer Nov 26, 2008 12:09 pm

j'ai été un peu bloqué malheureusement, du fait de la manipulation des objets.
Pour la bibliothèque, il faudrait que tu créés un moyen de manipuler les objets indépendamment de l'appellation par le joueur.

"poser le vase sur la table" devient => [verbe pour déposer un objet] [objet vase] [particule associée au verbe de dépose] [objet table]

Ainsi, selon ce que taperas le joueur :

poser / déposer / laisser / lâcher => peut être compris par ton interpréteur
vase / vase bleu / petit vase / pot => peut être compris par ton interpréteur
sur / dessus => peut être compris par ton interpréteur
table / guéridon / grande table etc. => peut être compris par ton interpréteur

Il faudrait rajouter des verbes de manipulation également, pour pouvoir regarder, fouiller, lire un objet.

Tu peux regarder comment c'est géré dans Inform 6 pour essayer d'adapter dans ton système :
http://svn.tuxfamily.org/viewvc.cgi/inf ... iew=markup

Sans entrer dans les détails, tu devrais pouvoir faire un interpréteur de commande simple (de type verbe + nom) qui permettrait dans un premier temps de gérer beaucoup de cas de figures, mais il faut que tu le fasses en tant que bibliothèque séparée à ton jeu. Tu peux également envisager d'intercepter les commandes du joueur pour retirer tous les articles non nécessaires à l'interpréteur : le la les un une des ce cette ces etc

à ce propos dans Inform cela serait bien de pouvoir traiter "ce cet cette ces" comme un article normal, même si l'utilisation par un joueur de cette forme resterait sans doute marginal.

Avatar de l’utilisateur
Otto Grimwald
Très Ancien
 
Messages: 3031
Inscription: Mar Aoû 24, 2004 12:02 pm

Re: Un nouveau jeu

Messagepar SIM54 le Mer Nov 26, 2008 1:23 pm

Merci pour le lien Otto, je vais voir ce que je peux faire. Je pense pouvoir quelque chose dans le genre :

verbe + nom
ex
aller + nord
ou sud
ou est
ou ouest
autre exemple =
prendre + lampe
ou robot
ou épée
....
ou encore :
attaquer + troll
ou gnome
ou chevalier
ou gobelin
...

Je vais faire ça en même temps que je programme une autre FI ( un peu plus longue cette fois ), cela permettra de tester le système.



Juste pour savoir : Est-ce que d'autres personnes on testé le jeu ?
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Stormi le Mer Nov 26, 2008 2:00 pm

Je viens de tester le jeu. J'ai réussi à collecter 4 objets sur 6.

Pour un auteur il est toujours intéressant de voir comment le joueur a joué, ce qu'il a essayé, ce qui n'a pas marché, donc voici en pièce jointe de ce message une copie de ma partie.

Remarques générales :
- intégrer la structure générale "verbe + objet" serait déjà un grand plus (mais en faisant cela tu ne pourras plus faire "mettre la lampe dans le coffre", donc il faut aussi prévoir des verbes du type "verbe + objet1 + préposition + objet2".
- il faudrait un message d'erreur lorsqu'une action n'est pas reconnue : soit dire que le verbe n'est pas compris, soit que l'objet n'est pas compris
- il y a des incohérences : par exemple on ne peut allumer la lampe qu'à un seul endroit, l'inventaire n'est pas compris partout (en particulier dans la salle du coffre on ne peut pas faire inventaire !). Dans les autres endroits le jeu ne comprend pas la commande. Or du point de vue du joueur (qui a toujours raison :)) il n'est pas logique que la commande ne soit pas comprise. Il faudrait au pire que dans les autres salles cela réponse "cela n'est pas nécessaire ici".
- il manque beaucoup d'actions. Certains objets peuvent être manipulés mais pas regardés, c'est le plus grave. On croit qu'ils ne sont pas importants car le jeu ne comprend pas quand on veut les regarder, mais en fait si.
- quelques bugs (tu les verras dans mon script)
- il n'est pas toujours aisé de deviner la bonne formulation, comme l'a souligné Otto Grimwald

Un système de jeu qui permettrait quelque chose de cohérent devrait (je parle de la structuration du code C là):
- avoir la notion de lieu
- avoir la notion d'objet : peut être pris (ou pas, exemple l'étagère), posé, regardé, éventuellement allumé, éteint, cassé... tous les verbes qui semblent importants pour ton jeu. Chaque objet doit savoir comment réagir quand on le manipule, éventuellement en fonction du lieu dans lequel il se trouve.
- avoir des verbes définis une fois pour toute et non pas redéfinis dans chaque lieu. Ainsi, "regarder objet" fait toujours la même chose : il "demande" à l'objet sa description et l'affiche, "ouvrir objet". S'il faut redéfinir ce que veut dire "regarder" dans chaque salle et pour chaque objet tu vas avoir une duplication énorme de code... surtout si le joueur a pris l'objet avec lui !... alors que tu pourrais arranger les choses plus intelligemment (le programmeur intelligent est paresseux : il cherche toujours la solution lui permettant d'économiser ses efforts à long terme).

C'est comme ça que fonctionnent tous les systèmes avancés de fictions interactives : une programmation structurée en lieux, actions (verbes) et objets. Ensuite toi tu dois juste gérer les combinaisons d'actions, lieux et objets (avec bien sûr des cas particuliers : des actions sans objet, des actions sur plusieurs objets...)

Si tu fais cela tu seras armé pour faire un jeu réellement jouable sans trop de frustration du joueur (ce qui n'est pas le cas du jeu que je viens de tester, je dois le dire franchement, il y a trop de choses qu'il ne comprend pas ou qu'il comprend à un endroit mais pas un autre :))

Bon courage !
Fichiers joints
SIM54.txt
(12.89 Kio) Téléchargé 93 fois
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1207
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Re: Un nouveau jeu

Messagepar SIM54 le Mer Nov 26, 2008 6:30 pm

Je pense avoir trouver une solution à ce problème. Il s'agirait de mettre en place un variable lieu qui prendrait à chaque lieu son numéro (1, 2, etc... ) puis en fonction de cette valeur, différentes possibilités serait "débloquées".
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 8:27 am

Re !

Le système des variables marche ainsi. À chaque chiffre, correspond une salle. Dans le début du code je déclare différente possibilités de phrases ( ex : "aller au nord", "aller nord", "prendre la lampe", "prendre lampe", etc... ) C'est long et fastidieux. Mais dans le même temps ce sera utilisable dans mes futurs FI. D'une certaine manière je ne suis obligé ensuite que de créer les salles et la description, cela par exemple dans le code :

if (strcmp(word,"voir")==0)
{
if ( l ( variable lieu ) = 1 )
{
printf ("Vous voici devant un donjon... \n");
}
...
}

Je peut également créer des actions propres à certaines salles en utilisant cette méthode.

Si vous avez des questions n'hésitez pas ! :D
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Stormi le Jeu Nov 27, 2008 9:25 am

Bonjour,

Il faudrait peut-être définir une liste de correspondance afin que plusieurs formulations pour le même verbe soient reconnues :

"regarder", "voir", "observer", "examiner" => action VOIR
"prendre", "ramasser", "saisir" => action PRENDRE
etc...

(cette solution rudimentaire ne permettra pas de distinguer l'utilisation d'un même verbe avec des sens différents, mais je pense que ça reste négligeable pour ton jeu)
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1207
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 9:44 am

stormi a écrit:Bonjour,

Il faudrait peut-être définir une liste de correspondance afin que plusieurs formulations pour le même verbe soient reconnues :

"regarder", "voir", "observer", "examiner" => action VOIR
"prendre", "ramasser", "saisir" => action PRENDRE
etc...

(cette solution rudimentaire ne permettra pas de distinguer l'utilisation d'un même verbe avec des sens différents, mais je pense que ça reste négligeable pour ton jeu)


L'autre problème est aussi d'allier un verbe avec un nom. Exemple très simple : prendre + lampe. L'idée de la variable permet de créer des actions propre à chaque salles, mais s'en pour autant devoir des lignes de codes dans chaque salle ( avec le système de la variable je me contente de coder les possibilités au début du jeu et ainsi de suite ).

Le problème vient aussi de la logique d'une phrase, dire :

"prendre une lampe" et moins français" que de dire "prendre la lampe". Ou encore "voir la lampe" au lieu de "regarder la lampe".

Je vois pas non plus l'intérêt de commandes du genre "regarder autour" quand on peut faire simple et dire "voir".

Je sais que les possibilités de mes jeux sont très très réduites, mais je préfère faire des commandes plus simples et également plus courante. Je me disais aussi que je devrai peut-être rédiger un petit fichier joint avec le jeu et comportant le liste des commandes disponibles.
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Stormi le Jeu Nov 27, 2008 10:01 am

Pour l'exemple de "voir", je ne sais pas pour Otto Grimwald, mais moi dans tout le jeu je n'ai pas eu l'idée de taper "voir" étant donné que "regarder" ne marchait pas.
Or du point de vue français, "regarder" est une action active, c'est moi qui décide à quel moment je regarde. "voir" est une action passive, c'est pourquoi elle vient moins facilement à l'esprit. C'est pareil en anglais. Tout le monde utilise "look", personne ou presque n'utilise "see".
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1207
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 11:38 am

C'est vrai...
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Stormi le Jeu Nov 27, 2008 12:34 pm

Ce que je veux dire par là, c'est qu'il est important de se mettre à la place du joueur et donc de comprendre le maximum de formulations différentes. La gestion des synonymes des verbes est un premier pas dans ce sens.
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1207
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 1:11 pm

Toujours d'accord. Mais je me pose une question ( au sujet de ce système avec l'inform ) : combien, par exemple, y a-t-il de manière de prendre une lampe ?
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar Stormi le Jeu Nov 27, 2008 2:02 pm

En Inform on ne formulera pas toutes les manières de formuler "prendre une lampe".

En premier lieu, inform décompose la commande du joueur :

0) Il retire tous les accents pour éviter les problèmes et permettre au joueur de taper des mots sans accent s'il le souhaite

1) Il regarde le premier mot de la commande, c'est le verbe (par exemple "poser")

2) Dans sa liste de verbes, il voit que le verbe "poser" (et ses synonymes "déposer", etc...) peut avoir les formulations suivantes :
- poser un objet
- poser un objet dans un autre objet
- poser un objet sur un autre objet
Voilà à quoi ça ressemble dans inform (exemple simplifié par rapport à la réalité) :
Code: Tout sélectionner
Verb 'deposer' 'poser' 'abandonner' 'lacher'
        * noun                       -> Poser
        * noun 'dans' noun     -> MettreDans
        * noun 'sur'                -> MettreSur;

Chaque formulation renvoie vers une action. Ici ce sont les actions Poser, MettreDans, et MettreSur. (On peut noter que la définition du verbe "mettre" aussi aura des formulations qui renverront les mêmes actions MettreDans et MettreSur).

3) Il regarde si la commande du joueur correspond à une définition qu'il connaît.
Exemple : "poser la lampe dans le coffre" ne correspond pas à "poser un objet", mais correspond à "poser un objet dans un autre objet".

4) L'action est maintenant décomposée en :
- action : MettreDans
- objet1 : un objet désigné par "la lampe", s'il existe
- objet2 : un objet désigné par "le coffre", s'il existe
Inform regarde maintenant si il reconnaît "la lampe" et "le coffre".
Pour cela il regarde si parmi les objets qui sont dans le lieu où est le joueur, il y un objet qui peut être désigné par "lampe" (ce même objet, l'auteur qui utilise inform aura précisé qu'il peut aussi être appelé "torche", etc...). Inform supprime tout seul le mot "la" en le considérant comme sans importance.
De même, il regarde s'il y a un objet qui correspond à "le coffre".

5) S'il a bien trouvé des objets qui correspondent à "la lampe" et "le coffre", alors les paramètres de l'action seront :
- action : MettreDans
- objet1 : Objet Lampe
- objet2 : Objet Coffre

Ensuite, (en simplifiant) l'auteur n'a plus qu'à faire une règle pour dire quoi faire avec cette action sur ces objets (sachant qu'inform propose déjà des réponses par défaut pour la plupart des actions).


Résultat :
Comme inform fait tout ça (et bien plus) automatiquement, si l'auteur a prévu plusieurs noms pour désigner ses deux objets, voilà des exemples de formulations qui vont marcher :
- poser la lampe dans le coffre
- poser la lampe dans coffre
- poser lampe dans le coffre
- poser lampe dans coffre
- poser une lampe dans le coffre
- poser une lampe dans coffre
- poser la lampe dans la boîte
- poser la lampe dans boîte
- poser lampe dans la boîte
- poser lampe dans boîte
- poser une lampe dans la boîte
- poser une lampe dans boîte
- poser la torche dans le coffre
- poser la torche dans coffre
- poser torche dans le coffre
- poser torche dans coffre
- poser une torche dans le coffre
- poser une torche dans coffre
- poser la torche dans la boîte
- poser la torche dans boîte
- poser torche dans la boîte
- poser torche dans boîte
- poser une torche dans la boîte
- poser une torche dans boîte
- mettre la lampe dans le coffre
- mettre la lampe dans coffre
- mettre lampe dans le coffre
- mettre lampe dans coffre
- mettre une lampe dans le coffre
- mettre une lampe dans coffre
- mettre la lampe dans la boîte
- mettre la lampe dans boîte
- mettre lampe dans la boîte
- mettre lampe dans boîte
- mettre une lampe dans la boîte
- mettre une lampe dans boîte
- mettre la torche dans le coffre
- mettre la torche dans coffre
- mettre torche dans le coffre
- mettre torche dans coffre
- mettre une torche dans le coffre
- mettre une torche dans coffre
- mettre la torche dans la boîte
- mettre la torche dans boîte
- mettre torche dans la boîte
- mettre torche dans boîte
- mettre une torche dans la boîte
- mettre une torche dans boîte
- déposer la lampe dans le coffre
- déposer la lampe dans coffre
- déposer lampe dans le coffre
- déposer lampe dans coffre
- déposer une lampe dans le coffre
- déposer une lampe dans coffre
- déposer la lampe dans la boîte
- déposer la lampe dans boîte
- déposer lampe dans la boîte
- déposer lampe dans boîte
- déposer une lampe dans la boîte
- déposer une lampe dans boîte
- déposer la torche dans le coffre
- déposer la torche dans coffre
- déposer torche dans le coffre
- déposer torche dans coffre
- déposer une torche dans le coffre
- déposer une torche dans coffre
- déposer la torche dans la boîte
- déposer la torche dans boîte
- déposer torche dans la boîte
- déposer torche dans boîte
- déposer une torche dans la boîte
- déposer une torche dans boîte
- lâcher la lampe dans le coffre
- lâcher la lampe dans coffre
- lâcher lampe dans le coffre
- lâcher lampe dans coffre
- lâcher une lampe dans le coffre
- lâcher une lampe dans coffre
- lâcher la lampe dans la boîte
- lâcher la lampe dans boîte
- lâcher lampe dans la boîte
- lâcher lampe dans boîte
- lâcher une lampe dans la boîte
- lâcher une lampe dans boîte
- lâcher la torche dans le coffre
- lâcher la torche dans coffre
- lâcher torche dans le coffre
- lâcher torche dans coffre
- lâcher une torche dans le coffre
- lâcher une torche dans coffre
- lâcher la torche dans la boîte
- lâcher la torche dans boîte
- lâcher torche dans la boîte
- lâcher torche dans boîte
- lâcher une torche dans la boîte
- lâcher une torche dans boîte

Et encore je n'ai prévu que deux noms par objet (on en a souvent plus que ça), et je n'ai pas fait de variations sur les accents !
Samuel V.
Avatar de l’utilisateur
Stormi
Grand Ancien
 
Messages: 1207
Inscription: Dim Avr 16, 2006 8:07 pm
Localisation: Lyon

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 2:32 pm

D'accord...

Mais si on veut créer ça en C, comment faire ?

Au départ j'avait l'idée de créer une sorte de "dictionnaire", un pour les verbes, un pour les mots. Ca donnerait en exemple :

dico verbe : "aller"
"prendre"
...

dico mot : "lampe",
"nord",
...

Ensuite il faudrait créer un truc pour donner quelque chose du genre : verbe + mot

Ensuite l'ordinateur devrait analyser l'assemblage des deux mots et voir si cela marche

Enfin il déclencherai l'action.
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm

Re: Un nouveau jeu

Messagepar SIM54 le Jeu Nov 27, 2008 2:49 pm

#include <stdio.h>
#include <stdbool.h>


struct entry
{
char verb[15];
char definition[50];
};
struct entry2
{
char word[15];
char definition[50];
};

bool equalStrings (const char s1[], const char s2[] )
{
int i = 0;
bool areEqual;

while ( s1[i] == s2 [i] &&
s1[i] != '\0' && s2[i] != '\0' )
++i;

if ( s1[i] == '\0' && s2[i] == '\0' )
areEqual = true;
else
areEqual = false;

return areEqual;
}

int lookup2 (const struct entry2 dictionaryWord[], const char search[], const int entries2)
{
int i;
bool equalStrings (const char s1[], const char s2[]);

for ( i = 0; i < entries2; ++i )
if ( equalStrings (search, dictionaryWord[i].word) )
return i;

return -1;
}
int lookup1 (const struct entry dictionaryVerb[], const char search[], const int entries)
{
int i;
bool equalStrings (const char s1[], const char s2[]);

for ( i = 0; i < entries; ++i )
if ( equalStrings (search, dictionaryVerb[i].verb) )
return i;

return -1;
}

int main (void)
{
const struct entry2 dictionaryWord[100] =
{ { "maison", "lieuMaison" } };

const struct entry dictionaryVerb[100] =
{ { "regarder", "actionVoir" } };

char verb[10];
char word[10];
int entries = 10;
int entries2 = 10;
int entry;
int lookup1 (const struct entry dictionaryVerb[], const char search[], const int entries);
int lookup2 (const struct entry2 dictionaryWord[], const char search[], const int entries2);

printf ("> ");
scanf ("%14s%14s", verb, word);

entry = lookup1 (dictionaryVerb, verb, entries);
entry = lookup2 (dictionaryWord, word, entries2);

printf ("%s\n", dictionaryVerb[entry].definition);
printf ("%s\n", dictionaryWord[entry].definition);

return 0;
}


Voilà un début solution.

Dans ce cas, l'ordinateur récupère le verbe et le mot, analyse et donne les défintions.

Maintenant je travaille pour que l'ordi réagissent selon des cas.
SIM54
Grand Ancien
 
Messages: 299
Inscription: Mer Fév 07, 2007 12:44 pm


Retourner vers Annonces

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron