Java et vecteur

freedumz

Chasseur de castors
Salut à tous,
Je suis en train de concevoir un pendu en java, je commence a voir le bout, sauf que je voudrais juste pouvoir comparer une lettre entrée au clavier avec les lettres deja entre precedement donc voici ma ligne:

for (i=1;i<tampon.length-1;i++){
if (tampon==a){
memo=true;
}
else {
memo=false;
}
}

Le soucis est que ma memoire est toujours a true, je ne vois vraiment pas pourquoi, si quelqu'un a une petite idée
 

horny

Elite
uhm ne devrais-tu pas commencer par parcourir ton vecteur en 0 ?
 
1er
OP
freedumz

freedumz

Chasseur de castors
Oui pardon, je le commence en 0 en effet, faute de frappe
mais le soucis c'est que je viens de mettre un system.out dans les deux if et rien ne sort donc j'ai l'impression que ma boucle ne passe pas par la :/
 

Skarbone

Le méchant Ω
Je suppose que la variable "a" contient le caractère entré au clavier. déja c'est un très mauvais nom de variable :D.

Ensuite, tu parles de vecteur, mais a priori tu utilises un tableau? Y'a un classe Vector en java, ca te facilitera peut être la tâche? (bien qu'un tableau est tout aussi utilisable..)

Sinon juste avec ce bout de code on peut difficilement te dire ce qui va pas, on sait pas ce que contient ton tableau ni rien.. A priori je vois pas d'erreur dedans. Sinon jpense que plutot qu'un if/else, tu pourrais faire:

memo = (tampon==a);

ou encore

memo = (tampon==a) ? true : false;

si tu veux te familiariser avec les if ternaire


edit: et si tu n'as aucun résultat avec un SOUT, c'est... Que ton tableau est vide.
 
1er
OP
freedumz

freedumz

Chasseur de castors
private void jeu(){
String s, t;
char a;
s = field.getText();
a = s.charAt(0);

for (i=0;i<20;i++){
if (tampon==a){
memo=false;

}
else {

memo=true;

}
}

if (memo=false) {
JOptionPane.showMessageDialog(this, "Attention!!! cette lettre à déja été utilisée", "Erreur", 1);
return;
}

if (memo=true{
if (motgen.indexOf(s) == -1){//cas où la lettre n'est pas dans le mot
erreurs++;
tampon[k]=a;
k++;
Image();
if (erreurs==gameover){ //Si le nombre d'erreur vaut le nombre de fautes autorisés, la partie est terminée
JOptionPane.showMessageDialog(this, "Perdu", "note", 1);

}
return;
}
for (int i=0; i<motgen.length(); i++){
if (motgen.charAt(i) == a){
gword.setCharAt(i, a);
labelmot.setText(String.valueOf(gword));
System.out.println(gword);
}
}
tampon[k]=a;
System.out.println(tampon);
k++;
t = new String(gword);

if (t.indexOf('.') == -1){ // si tout les . ont été remplacé, la partie est gagné
message="You win!";
return;
}
}
}

Ca ne fonctionne pas :/ mais deja merci pour votre aide, je vous montre ma fonction complete, je ne vois vraiment pas d'où vient mon soucis, la premiere fois, le pendu doit forcement passer par le false comme mon tampon est encore vide
et pour le vecteur un tableau a une dimension, n'est pas un vecteur? (car si je me souviens de mes cours de C c'etait le cas non? )
 
1er
OP
freedumz

freedumz

Chasseur de castors
Okay j'ai trouvé,
Il me suffissait de mettre un break; quand la condition etait verifié :)
 

Skarbone

Le méchant Ω
wait, what? oO
 
1er
OP
freedumz

freedumz

Chasseur de castors
for (i=0;i<20;i++){
if (tampon==a){
memo=false;

}
else {

memo=true;

}
}

dans tampon, je stockais mes lettres au fur et a mesure donc après une lettre il me restait 19 espaces vides donc imaginons
j'entre un e, il me l'accepte
J'entre une deuxieme fois un e, il me le refuse et passe a true mais ensuite il compare 19 fois le e a rien donc il passe a false
 
1er
OP
freedumz

freedumz

Chasseur de castors
j'ai de nouveau un soucis, je reviens donc vers vous
Pour mon pendu, j'ai trouvé un dictionnaire sur un fichier texte, je voudrais pouvoir extraire une valeur au hasard mais j'obtiens tjs la meme :/ (le premier mot de mon .txt revient a chaque fois)

public void motinconnu()
{
ligne = (int)(Math.random()*336530);//génere correctement le nombre
System.out.println(ligne);
try {
file = new File("data.txt");
reader = new LineNumberReader(new FileReader(file));
reader.setLineNumber(ligne);
System.out.println(reader.getLineNumber());
MotCache = reader.readLine();
System.out.println(MotCache);
} catch (IOException ex) {}

}
 

Skarbone

Le méchant Ω
pourquoi * 336530 ?

Sinon math.random ca t'envoie un double entre 0 et 1, donc comme tu caste en int ca va toujours te faire 336530.

Fais plutot

ligne = new Random().nextInt(100);

ou 100 doit etre remplacé par le nombre de ligne de ton fichier.
 

titoum

OPTC:970342646
un random DOIT toujours etre base sur un time sinon c'est pas du random.
dans le genre new Random(System.nanoTime());
 
1er
OP
freedumz

freedumz

Chasseur de castors
Le 336530 vient du fait que j'ai 336530 mot dans ma base de donné et je le transforme en int car il me faut une valeur entiere ou peut etre un peu plus simple, ranger mon fichier texte dans un tableau et la prendre une valeur aleatoire de mon tableau non?
Sauf que mon fichier est separé ligne par ligne, quelqu'un aurait une idée de comment puis je faire ca?
 

horny

Elite
lol .. y a pas plus simple ? genre utiliser une fonction génératrice de nombres entier dans un certain range ?
 

Skarbone

Le méchant Ω
ligne = new Random().nextInt(336530);

comme je l'ai dit plus tot.

un random DOIT toujours etre base sur un time sinon c'est pas du random.
dans le genre new Random(System.nanoTime());
Ca sert a rien ce que tu fais, le constructeur par défaut de Random prend déja le temps systeme comme seed:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#Random()

(et j'ajouterai que même si c'est basé sur le temps, ca n'a rien de random, ils le disent d'ailleurs: deux random basés sur le même seed auront toujours la même séquence d'apparition des nombres. On ne peut pas faire de l'aléatoire, c'est toujours pseudo aléatoire.)
 
1er
OP
freedumz

freedumz

Chasseur de castors
Merci pour votre aide, je viens de trouver un truc qui fonctionne relativement bien a l'instant:
File wordFile = new File("G:\\\\hangman\\Dico.txt");
ArrayList<String> words = new ArrayList<String>();
try
{
BufferedReader reader = new BufferedReader(new FileReader(wordFile));
String word = null;
while (( word = reader.readLine()) != null)
words.add(word);
}
catch(IOException e)
{
System.out.println(e);
}

Random rand = new Random();
int i = rand.nextInt(words.size());
motgen = words.get(i);
System.out.println(motgen);

gword = new StringBuffer();
field.setText("");

J'ai surtout un gain de temps car il ne doit pas s'amuser a tout lire

Mainteant, j'ai encore un dernier soucis^^, je bloque pour jouer des sons tout simple pourtant le code fonctionnait dans mes anciens programmes, juste en 3 lignes car c'est uniquement pour faire un son lors de la mort du pendu et un lorsqu'il est sauvé donc voic mon code:

URL url_1 = test.class.getResource( "G:\\\\hangman\\fatality.wav" );
AudioClip ac1 = Applet.newAudioClip(url_1);
ac1.play();



je sais je suis une chevre en java , alors que tout les autres logiques de programmation ne presentent aucune reelle difficulté
 

Skarbone

Le méchant Ω
Charger tout le fichier dans une arraylist, tu crois que c'est pas tout lire?

C'est dommage de charger 300.000 mots dans une arraylist pour n'en sortir qu'un par partie non?
Tu ferais bien aussi de mettre un chemin relatif pour ton fichier dico. Si tu dois remettre ton projet a quelqu'un, ca ne marchera pas comme ca.

Enfin, tu prend un random entre 0 et la taille de ta liste. Si ton random te renvoie le dernier numéro, tu va faire (en gros) words.get(words.size()), ce qui va planter car l'indice commence a 0. Bon ok ca se passera théoriquement une fois sur 350.000 mais quand même.
 
1er
OP
freedumz

freedumz

Chasseur de castors
le chemin relatif, tu entends quoi?
si je le place dans la racine de mon projet, je fais .\\dico.txt?
C'est bien ca? si oui ca ne fonctionne pas :/
 

Skarbone

Le méchant Ω
c'est que tu le fais mal :D
 
Haut