aide jeu (morpion) - Java - Programmation
Marsh Posté le 29-05-2011 à 14:09:05
Coucou,
Alors j'ai fait un jeu de morpion de l'année dernière avec GUI donc je peux t'aider.
Pour la vérification, c'est simple : dès qu'un joueur joue et si son coup est valide (s'il ne clique pas sur une case déjà occupée par X ou O), tu utilises une fonction de vérification.
Cette fonction de vérification comporte 3 étapes :
Mais cette fonction devrait plutôt se trouver dans la partie Contrôle que dans ta Vue (si tu utilises le MVC).
Marsh Posté le 29-05-2011 à 14:48:01
Oui j'avais déjà pensé aux boucles, le problème est que on est vraiment mauvais en programmation et que la façon dont on a eu cours fait que on ne sais pas faire grand chose ... Du coup je sais même pas comment faire pour que l'ordinateur vérifie par exemple la case en (1;1) pour savoir si il y a un "x" ou un "o". Je ne sais même pas comment faire pour que une fois que le joueur ayant "x" clique sur une case, cette case ne puisse plus être modifiée. Je voudrais en faite éteindre le bouton une fois que l'on a cliqué dessus.
Marsh Posté le 29-05-2011 à 15:21:46
Pour la vérification, tu n'as pas besoin de vérifier le contenu de la case mais que des cases alignées ont la même valeur. En clair, le 1er test pourrait être :
case[0][0] == case[0][1] && case[0][0] == case[0][2]. Avec ça, tu vérifies la 1ere ligne, c'est-à-dire les X sur ce schéma:
XXX
OOO
OOO
Si tu colles ça dans une boucle ça dans une boucle for, ça te vérifie 3 lignes horizontale (ou verticale, je me souviens jamais de l'ordre des 2 [][]) :
Citation : for(int i = 0; i < 3; i++) |
Pour les 3 lignes verticales, tu inverses le contenu des [][] de case.
Pour les diagonales, ça se fait à la main.
C'est setEnabled(false) pour rendre un bouton inactif.
Marsh Posté le 29-05-2011 à 17:18:37
Merci, ça m'aide déjà bien mais quand je lance le programme y me met directement une fenêtre avec écrit 3x gagné. Dans le "if" au lieu de mettre un "return true" qui n'est pas accepté dans un "void", j'ai mis un "System.out.println("gagné" )". Mais évidement quand on lance le programme, les cellules des 3 colonnes sont toutes identiques. Il faudrait donc que la boucle ne se lance qu'après la première case jouée ... Je suis de nouveau face à un mur.
Si tu sais m'aider, ce serait génial.
Merci.
Marsh Posté le 29-05-2011 à 17:36:23
Ah oui je n'avais pas pensé aux cases vides... A priori, il suffit de compléter la condition comme ça dans ton for :
if(case[i][0] == case[i][1] && case[i][0] == case[i][2] && case[i][0] != caseVide)
caseVide étant à remplacer la valeur d'une case vide dans ton jeu.
Marsh Posté le 29-05-2011 à 17:56:31
Je n'avais pas tilté sur le return true; non accepté dans if. Change le void par boolean.
Marsh Posté le 30-05-2011 à 16:58:31
j'ai réussi à faire ce que je voulais. Ca renvoie true quand j'ai 3 "x" ou "o" aligné. Maintenant j'aimerai savoir comment faire pour faire un if "true" alors en grand au millieu de l'écran de jeu, on voit un message "vous avez gagné"
merci de votre aide.
Marsh Posté le 30-05-2011 à 17:04:15
Pour une popup, tu peux utiliser http://www.siteduzero.com/tutoriel [...] #ss_part_1
Marsh Posté le 31-05-2011 à 19:32:58
oui ça ça va je sais les utiliser mais je demande comment écrire la méthode. Voila ce que j'ai comme code pour le moment :
*************Morpion************
import javax.swing.*;
import java.awt.*;
import javax.swing.JOptionPane;
public class Morpion extends JFrame
{
//crée un fond pour recevoir l'interface graphique.
private JPanel fond = new JPanel();
//servira à créer notre tableau.
private Case[][] grille;
public Morpion()
{
super();
this.setPreferredSize(new Dimension(350,350));
this.setResizable(false);
//crée une grille de 3x3 à l'aide d'un tableau.
grille = new Case[3][3];
fond.setLayout(new GridLayout(3,3,10,10));
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 0 ; j < 3 ; j++)
{
grille[j][i] = new Case("",this,i,j);
fond.add(grille[j][i]);
}
}
this.setContentPane(fond);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public boolean aGagneEn(int x,int y)
{
//on test la ligne horizontale
if(grille[0][x].equals(grille[1][x]) && grille[0][x].equals(grille[2][x]))
{
return true;
}
//on test la ligne vertical
if(grille[y][0].equals(grille[y][1]) && grille[y][0].equals(grille[y][2]))
{
return true;
}
//on test la ligne oblique de la case en haut à gauche à la case en bas à droite
if(grille[0][0].equals(grille[1][1]) && grille[0][0].equals(grille[2][2]))
{
return true;
}
// on test la ligne oblique de la case en haut à droite à la case en bas à gauche
if(grille[2][0].equals(grille[1][1]) && grille[2][0].equals(grille[0][2]))
{
return true;
}
else
{
return false;
}
}
public void messageGagne()
{
if(true)
{
System.out.println("Tu as gagné !" );
}
}
}
************Case************
import javax.swing.*;
import java.awt.event.*;
public class Case extends JButton implements ActionListener
{
private static int joueur = 0;
int x,y;
private Morpion m;
private String t;
public Case(String t,Morpion m,int x,int y)
{
super(t);
this.t = t;
this.x = x;
this.y = y;
this.addActionListener(this);
this.m = m;
}
public void actionPerformed(ActionEvent ae)
{
joueur = (joueur+1)%2;
if(joueur==0)
{
this.setText("O" );
t = "O";
}
else
{
this.setText("X" );
t = "X";
}
setEnabled(false);
System.out.println(m.aGagneEn(this.x,this.y));
}
public boolean equals(Case c)
{
return this.t.equals(c.t);
}
}
en executant le prog, on voit qu'il y a un souci avec les true. Ce problème ne se pose pas si je ne mets pas les diagonales... Ce qui m'ennuye puisque j'aimerai les laisser.
Ensuite pour le message pour dire que le joueur a gagné, ça ne fonctionne pas non plus mais ça ne m'étonne pas. Ceci dit je ne sais pas comment faire. J'aimerai encore abuser de ton aide pour me guider si tu vois une solution. D'avance merci du temps que tu prends pour me répondre.
Marsh Posté le 31-05-2011 à 20:21:52
Je ne vois pas comment tu gères la partie (alternance des joueurs, vérif d'un gain de la partie, ...). Il est où ton main() qui gère la partie ?
Et je ne comprends pas ton codage de la vérification... Je t'avais proposé une méthode nettement plus simple avec les boucles. Tu n'as pas réussi à l'adapter ?
Marsh Posté le 31-05-2011 à 21:21:01
J'avais tenté de le faire, ensuite je l'ai amené en cours mais le prof la fait à sa façon ... L'alternance des joueurs se fait de façon un peu simpliste. Une fois sur deux quand on clique, s'affiche soit un "x" soit un "o". Le main() qui gère la partie se trouve la partie "morpion". Ma vérification se fait par un if pour la ligne horizontale, un if pour la verticale puis manuellement pour la partie diagonale. Notre professeur passe dans les bancs mais nous sommes plusieurs groupes à faire un jeu différent. Il ne s'attarde pas longtemps sur un projet. Nous sommes en 6ème secondaire 4 de programmation java par semaine. C'est pour ça que c'est pas très poussé comme jeu. On fait au plus simple pour avoir un résultat juste ce qu'il faut. On ne rentre pas dans la complexité.
Marsh Posté le 31-05-2011 à 21:32:04
Ah tu es en 6ème... A mon époque (expression de vieux con ^^), on n'avait pas de cours de programmation.
Bref, la méthode de ton prof est assez bizarre. Si tu cliques sur une case invalide, ça compte comme un changement de joueur ?
Tu peux poster le code de ton main() ?
Marsh Posté le 01-06-2011 à 19:25:18
Ton mon code est là en fait... le morpion gère toutes les "régles" et les vérif et case ne fait que dire ce que représente une case dans le jeu. Comment elle réagit.
Marsh Posté le 01-06-2011 à 19:29:26
Tout ton programme ? Mais tu n'as même pas public static void main(String[] args) pour lancer ton programme...
Marsh Posté le 03-06-2011 à 16:13:34
Bah je peux t'assurer que quand je le lance ça fonctionne ... On utilise BlueJ comme compilateur.
Marsh Posté le 08-06-2011 à 19:00:33
Je ne connais pas ce compilo.
Tu as avancé ?
Marsh Posté le 29-05-2011 à 12:40:01
Bonjour à tous et toutes, je dois créer pour mon cours de programmation un jeu en java qui est le morpion. donc qui consiste en une interface graphique de 3x3 cases où l'on place un x ou un o en fonction du joueur et le premier qui aligne en diagonal ou en en colonne gagne. J'ai fini de créer l'interface graphique mais je ne vois pas du tout comment faire pour que le programme vérifie si il y a 3 "x" ou 3 "o" aligné... J'ai besoin de votre aide car je passe mon examen vendredi prochain et le jeu doit être fonctionnel ...
Je vous mets le code que j'ai déjà fait ici en dessous :
************interface graphique**************
import javax.swing.*;
import java.awt.*;
public class Morpion extends JFrame
{
//crée un fond pour recevoir l'interface graphique.
private JPanel fond = new JPanel();
//servira à créer notre tableau.
private Case[][] grille;
//Permettra de calculer le nombre de case jouées et de savoir quand la partie sera fini.
private int nombreCaseJouees;
public Morpion()
{
this.setPreferredSize(new Dimension(350,350));
this.setResizable(false);
//crée une grille de 3x3 à l'aide d'un tableau.
grille = new Case[3][3];
fond.setLayout(new GridLayout(3,3,10,10));
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 0 ; j < 3 ; j++)
{
fond.add(new Case("" ));
}
}
this.setContentPane(fond);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
***************Case********************
import javax.swing.*;
import java.awt.event.*;
public class Case extends JButton implements ActionListener
{
private static int joueur = 0;
public Case(String t)
{
super(t);
this.addActionListener(this);
}
public void actionPerformed(ActionEvent ae)
{
joueur = (joueur+1)%2;
if(joueur==0)
{
this.setText("O" );
}
else
{
this.setText("X" );
}
}
}
Le code ci-dessus fonctionne donc, et affiche plus ou moins ce que je désire au niveau graphique si ce n'est que j'aimerais agrandir la taille du "x" et du "o". Si vous pouvez m'aider pour ça aussi ce n'est pas de refus ....
Je vous remercie d'avance et vous souhaite une bonne journée ou soirée. (Tout dépend de l'heure à laquelle vous verrez ce message >< );