Comment introduire une base de donnée de questions dans un jeu

cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010 - 26 sept. 2010 à 21:10
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 11 oct. 2010 à 07:27
Bonjour à tous,

J'aurais souhaité savoir s'il existe un moyen d'introduire une base de donnée de questions pour un jeu dans un programme java et pouvoir tirer aléatoirement celles-ci. Dans l'idéal il faudrait que le programme sache aussi la bonne réponse à chaque question.... Je n'arrive pas à trouver une idée. Merci d'avance pour vos réponses.

Cartinsa

17 réponses

Madvin Messages postés 123 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 26 août 2012 3
27 sept. 2010 à 14:02
Salut,

Le plus simple serait de faire un fichier texte ou un fichier de propriétés : chaque ligne contiendra une question suivie d'un séparateur (par exemple "|") et suivi de la réponse :
<question1>|<réponse1>
<question2>|<réponse2>
<question3>|<réponse3>

Ensuite, il suffira juste de charger le fichier, d'utiliser un random pour obtenir un entier quelconque compris dans la plage du nombre de lignes du fichier, et ensuite de récupérer la question et la réponse correspondante.

De plus, le fichier peut être crypté si il ne doit pas être lisible par un utilisateur.

Voilà le concept grossièrement. Après on peut toujours le spécialiser, par exemple en classant les questions par catégorie, par difficulté, etc...

@+
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
27 sept. 2010 à 14:46
Je ne sais pas ce que tu veux avoir au final je vais te donner trois possibilités que tu pourras choisir :

- Le fichier texte est l'idée la plus simple et si ton jeu est "basique", (pas de réseau). Pour les classer en fonction des catégories en faisant plusieurs fichiers.

- Si ton jeu et disponible en réseau et que plusieurs utilisateurs peuvent jouer en parallèle, oubli l'idée du fichier texte. En effet, dans ce cas, plusieurs processus ouvriront le fichier en même temps, ce qui est impossible et ton appli sera inutilisable. Pour t'en sortir dans ce cas, il faudra que tu utilises une base de données avec un SGBD de type mySQL ou Access.

- Si l'objectif recherché est de classer les informations (une hiérarchie avec question, réponse, niveau de difficulté...) renseigne toi sur les fichiers XML, c'est le plus adapté au problème dans cas.

- Et pour finir, s'il y a réseau plus besoin de hiérarchie, tu peux utiliser une base de données XML.

Voilà tout
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
28 sept. 2010 à 10:04
Salut,

Ce n'est pas impossible d'ouvrir un fichier en lecture par plusieurs processus. Cela dit, en général, on utilise un cache, même si tu as 10'000 voire 100'000 questions.

Sinon, si ton jeu est en réseau, tu peux proposer une base de questions initiales et ensuite autoriser les utilisateurs à proposer des questions / à améliorer la formulation de certaines questions / à corriger des réponses...
Bref : un questionnaire collaboratif, auquel cas il te faudra une base de données par contre.
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
3 oct. 2010 à 15:06
Merci tout d'abord pour vos réponse. J'ai opté pour la solution de madvin à savoir un fichier texte contenant les questions et les réponses. Il me reste plus qu'à appeler les questions dans mon programme. Je cherche comment utiliser un streambuffer et je vois pas trop comment faire. Aussi il me fodrait une fonction capable de comparer la réponse donnée par le joueur et la vrai réponse.
Pourriez vous m'aider? Merci d'avance pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
3 oct. 2010 à 19:49
J'ai fais un jeu comme le tiens il y a quelques temps, je viens juste de mettre en ligne une méthode d'accès au fichiers ainsi qu'une méthode pour comparer des chaines de caractères avec une tolérence d'ereur, ca peut t'être utile.

http://www.javafr.com/codes/COMPARER-CHAINES-CARACTERES-AVEC-MARGE-ERREUR_52349.aspx

http://www.javafr.com/codes/LIRE-ECRIRE-FICHIERS-TEXTE_52348.aspx
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
3 oct. 2010 à 22:28
Merci pour ta réponse,

Je serais plutôt dans un cas où on propose les 4 réponses sous forme de a,b,c,d et l'utilisateur ne taperai qu'une lettre donc pas besoin de marge d'erreur.
J'ai regardé tes méthodes et j'avoue que je ne comprends pas très bien comment je peux appeler mon fichier de forme <question>| à chaque ligne dans le programme. Dans l'idéal ce serai bien qu'il y ai copiage de la question dans JTextField et que l'utilisateur réponde sa lettre dans un autre cadre qui est comparé etc.... Merci d'avance pour ta réponse
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 oct. 2010 à 09:36
La forme <question>| n'est pas une bonne idée, tu vas avoir du mal à récupérer séparément les questions et les réponses.

Tu devrais faire un truc du genre
Question;reponseA;reponseB;reponseC;reponseD;indiceReponseCorrecte

par exemple
Quelle est la capitale de l'espagne ?;Paris;Londres;Madrid;Barcelone;3

Ensuite, tu dois avoir un objet Question avec comme attributs : intitule, reponseA, reponseB, reponseC, reponseD, indiceReponseCorrecte.

Le but est de créer les objets Question à l'aide du fichier texte, pour celà, tu fais :
List<String> lignes = GestionFichiers.lireFichier(urlFichier)
//La fonction lireFichier est la fonction écrite dans le code que j'ai posté
//Quand tu as besoin de la question i tu fais
StringTokenizer st = new StringTokenizer(lignes.get(i), ";");
Question q = new Question(st.nextToken(), st.nextToken(), st.nextToken(), st.nextToken(), st.nextToken(), Integer.decode(st.nextToken());


Je ne sais pas si tu connais StringTokenizer mais c'est une classe qui te permet de découper une chaîne de caractères en fonction d'un séparateur (ici ";"). Et Integer.decode() te renvoi l'entier associé à une chaine de caractères, à noter que tu ferais bien de gérer les exceptions, au cas ou ton fichier soit mal écrit.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 oct. 2010 à 17:29
Alors ? Tu t'en sort ?
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
4 oct. 2010 à 19:13
J'ai compris le principe et par ailleurs merci bien de m'aider. Si je comprends bien je dois déclaré l'objet question avec ces attribus. je peux le faire comme ça?
class question
{
private string Question;
private string reponseA;
private string reponseB;
private string reponseC;
private string reponceD;
private int indice réponse correcte;
}

Dois-je faire les constructeurs ? Après tu crois que l'objet question pourra être placé dans un JTextField ? Sinon ta méthode marche et ça claque ! Apres il reste a faire une boucle avec timmer que j'ai déjà trouvé pour faire tourner les questions. Est-ce qu'il existe une sorte de méthode strcmp en Java ?

Merci d'avance
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 oct. 2010 à 07:52
JE vais te donner le début de chaque classe, le reste sera facile à compléter.

Alors dans ton package métier, tu met ta classe question qui ressemble à ca :

public class Question{
    private String intitule;
    private List<String> reponses;
    private int indiceBonneReponse;

    public Question(String intitule, List<String> reponses, int indice){
        setIntitule(intitule);
        setReponses(reponses);
        setIndiceBonneReponse(indice)
    }
    
    public Question(){
        this("", new ArrayList<String>(), 0);
    }

    public void addReponse(String reponse){
        getReponses.add(reponse);;
    }

    public void setIntitule(String intitule){
        this.intitule=intitule;
    }

    public void setReponses(List<String> reponses){
        this.reponses=reponses;
    }

    //Il manque des getter et setter
}


Pour l'acces aux fichiers, reprend le code que j'ai posté tel quel.

Pour l'utiliser tu fais ca :
public static Question recupererQuestion(List<String> lignes, int i){
    Question q = new Question();
    StringTokenizer st = new StringTokenizer(lignes.get(i), ";");
    q.setIntitule(st.nextToken());
    for(int k=0; k<4; k++)[
        q.addReponse(st.nextToken());
    }
    q.setIndiceBonneReponse(Integer.decode(st.nextToken());
}


Et pense à stocker ta liste de lignes dans une classe en static final pour ne pas ouvrir le fichier a chaque fois.

Je ne connais pas d'équivalent de strcmp en java, si je me souviens bien strcmp c'est du C++ pour comparer deux chaines de carctères et la comparaison se fait caractere par caractere. Le compareTo de la classe string est le meme que celui de la classe Object, c'est à dire qu'il compare les références. Tu veux faire quoi avec strcmp ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 oct. 2010 à 07:53
Dans la méthode, il faut bien sur ajouter un return q;
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
9 oct. 2010 à 10:37
Merci de ta patience? le fait est que je ne comprends pas ta façon de programmer, j'ai pas compris avec les getter et les Setter. J'ai jamais programmé comme cela. Je veux y arriver par moi même mais je ne pige pas tout ... Pourrait tu me réexpliquer ?
le strcmp permetterai de comparer la réponse du joueur et la bonne réponse

Merci d'avance :)
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
9 oct. 2010 à 15:28
en fait c'est bon j'ai tilté :) c'est juste pour la fonction getReponses. je suis pas sur la programmation. J'ai un propblème sur la déclaration de list string, eclipse le comprend pas. Tu aurais un moyen ?

Merci d'avance :)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 oct. 2010 à 20:29
Pour les getter et setter, au départ c'est quelque chose qui parait vraiment bizarre (voir bete) mais pourtant très utile et assez malin.

On déclare systématiquement les attributs "private" ce qui signifie qu'on ne peut pas y accéder directement (contrairement à "public") Ces attributs ne sont visibles que dans la classe courante.

Pour accéder aux attributs dans les autres classe on utilise la méthode get pour récupérer la valeur et la méthode set pour la modifier.

Un des avantages de cette méthode est de "cacher" le fonctionnement de ta classe à l'utilisateur, c'est un principe assez important du monde objet. En gros, sur un objet tu sais que tu demandes de la modifier et tu ne veux pas forcément savoir comment ca se passe. Ce qui fait que si tu modifie tes attributs alors que ton application est déja distribuée, prenons un exemple, au départ, tu as un attribut age dans une classe personne. Tu décide de ne plus enregistrer l'age mais la date de naissance, tu n'as qu'a modifier le getter et le setter de la variable age pour que java te fasse les consersions.




Pour string qu'éclipse ne comprend pas, je crois que l'erreur est toute bête, remplace par String avec une majuscule. En java String est une classe, il prend donc une majuscule contrairement aux int, double, boolean qui sont des types primitifs et ne prennent pas de majuscule.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 oct. 2010 à 20:31
Ha oui, juste au cas ou tu aurais un doute, le getter sur réponse c'est cette fonction
    public List<String> getReponses(){
        return this.reponses;
    }


Eclipse te les genere tout seul, il suffit de faire click droit --> source --> Gerenate Getters and Setters et là tu séléctionne toutes les variables
0
cartinsa Messages postés 7 Date d'inscription dimanche 26 septembre 2010 Statut Membre Dernière intervention 10 octobre 2010
10 oct. 2010 à 16:43
Merci bien de toutes ces infos, j'ai essayer avec List<String>, String, avec aussi Array list pas moyen, eclipse me dit tjs qui peut pas trouver le type ...
Apres crois tu qu'avec la fonction setText je pourrais changer le contenu d'un Jtextfield pour afficher les questions ? et pour la réponse il tapera un chiffre qui sera comparé a l'indice. Sa devrait marcher comme ça.

Merci d'avance pr ton aide précieuse.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
11 oct. 2010 à 07:27
Je ne sais pas ce qui ne pas pas avec ton type String, je pense que ca vient plutot de List<> je ne sais pas si l'import est correct, vérifie que tu as importé la librairie java.util.List, parce qu'il y a également une librairie liste dans awt.

Sinon ce qu'il faut écrire c'est ca :
List<String> liste = new ArayList<String>();

Mais je pense que c'est ce que tu as fait.

Si ca ne marche vraiment pas, tu peux ouvrir un nouveau topic sur le forum, quelqu'un aura peut etre une idée.

Pour l'affichage de ta question, tu peux surcharger toString dans la classe question tu peux faire des passages à la ligne avec le caractère \n, met ce que tu veux qui soit affiché.

Ensuite, je crois qu'avec le JTextField tu vas avoir un problème, tu ne pourras pas faire de retour a la ligne, il va falloir utiliser un JTextArea et tu fais jtextArea.setText(question.toString()); et ca ira.
0
Rejoignez-nous