Démineur complet avec gestion des meilleurs temps

Soyez le premier à donner votre avis sur cette source.

Vue 10 312 fois - Téléchargée 1 160 fois

Description

Voici le jeu de Démineur que mon collègue et moi avons créé pour un travail de cégep.

Fonctionnalités :
- Niveaux de difficulté : Facile, Intermédiaire, Difficile et Personnalisé.
- Enregistrements des meilleurs scores dans les Préférences de Java
- Les mines ne sont générés qu'après le premier clique de la souris (comme dans le vrai démineur) afin de ne pas tomber sur une mine du premier coup et de crever en partant, ce qui serait chiant. Je sais que c'est normal, mais j'ai cru bon de le dire car pour mon prof c'était une fonctionnalité supplémentaire.
- Le jeu est le plus fidèle au Démineur de Windows (apparence, interface, etc.)
- Possibilité de tricher pour dévoiler les mines (il est impossible d'enregistrer de score dans ce cas, logique):

Pour activer le mode triche, il faut naturellement entrer un mot de passe. Le bout de code qui génère un mot de passe compliqué est volontairement non commenté et exagérémment compliqué (ne notez pas là-dessus). C'est un petit défi que je vous offre (pas bien difficile mais bon). Ce sera enlevé et le mot de passe sera mis en constante dans les prochaines versions. (je n'ai évidemment pas donné ça au prof, je l'ai rajouté juste pour vous)

Ceux qui ont le sens de l'observation remarqueront que j'ai utilisé ma classe LCDPanel pour afficher les mines et le temps.

Le seul bogue connu est lorsqu'on clique sur Annuler pour créer une grille personnalisée, puis qu'on joue et ensuite on recommence, il garde les settings personnalisés même si c'est débutant (donc ça foire)

c'est aussi très lent au niveau de la création d'une nouvelle grille (changement de taille) pour le reste c'est fluide.

Donc amusez-vous !

Source / Exemple :


Dans le zip

Conclusion :


Je vous fournit le projet Eclipse réalisé avec Java 1.5 ainsi qu'un jar de test. Comme c'était un projet d'évaluation pas besoin de vous dire que ça a été rigoureusement testé, mais il peut quand même rester des bogues.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

excellent programme .Bravo
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
Et voici un essai d'intégration dans Minesweeper:
public class GameGrid extends JPanel implements MouseListener, SquareButtonListener {
...
private boolean left;
private boolean right;
private boolean none;
private boolean leftRight;
private boolean leftNotright;
private boolean rightNotleft;
private MouseEvent evt;
private Thread buttonThread;
...
...
private void squareButton_leftrightClick(SquareButton square) {
System.out.println(square.getXSquare() + "," + square.getYSquare() + " leftRight");
}
...
public void mousePressed(MouseEvent e) {
if (buttonThread == null || !buttonThread.isAlive()) {
buttonThread = new Thread(new RunButton());
buttonThread.start();
}
setKey(e, true);

if (AppFrame.getInstance().getGameBoard().isInGame()) {
AppFrame.getInstance().getGameBoard().indicateMousePressed();
}
}

public void mouseReleased(MouseEvent e) {
if (leftNotright) {
leftAction(e);
}
setKey(e, false);

if (AppFrame.getInstance().getGameBoard().isInGame()) {
AppFrame.getInstance().getGameBoard().indicateMouseReleased();
}
}
...
public void leftAction(MouseEvent evt) {
SquareButton square = (SquareButton) evt.getSource();
if (AppFrame.getInstance().getGameBoard().isInGame()) {
this.squareButton_leftClick(square);
}
}

public void rightAction(MouseEvent evt) {
SquareButton square = (SquareButton) evt.getSource();
if (AppFrame.getInstance().getGameBoard().isInGame()) {
this.squareButton_rightClick(square);
}
}

public void leftRightAction(MouseEvent evt) {
SquareButton square = (SquareButton) evt.getSource();
if (AppFrame.getInstance().getGameBoard().isInGame()) {
this.squareButton_leftrightClick(square);
}
}

public void noneAction(MouseEvent evt) {
if (buttonThread != null && buttonThread.isAlive()) {
buttonThread.interrupt();
}
}

private void setKey(final MouseEvent e, final boolean b) {
evt = e;
if (SwingUtilities.isLeftMouseButton(e)) {
left = b;
}
if (SwingUtilities.isRightMouseButton(e)) {
right = b;
}
}

class RunButton implements Runnable {

public void run() {
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
break;
}
if (left && right && !leftRight) {
leftRight = true;
none = false;
leftNotright = false;
rightNotleft = false;
leftRightAction(evt);
} else if (!left && !right && !none) {
leftRight = false;
none = true;
leftNotright = false;
rightNotleft = false;
noneAction(evt);
} else if (left && !right && !leftNotright && !leftRight) {
none = false;
leftNotright = true;
rightNotleft = false;
} else if (!left && right && !rightNotleft && !leftRight) {
none = false;
leftNotright = false;
rightNotleft = true;
rightAction(evt);
}
}
}
}
}
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
Je viens d'optimiser un peu. Dans la première version, le Thread tournait tout le temps.
Maintenant, il est démarré seulement quand on enfonce un bouton de la souris.
Si aucun bouton n'est enfoncé, le Thread est interrompu.
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
9
J'avoue que ce n'est pas très facile. Mais avec un Thread ça devrait marcher. Voici mon premier essai d'implémentation:
http://www.java-forum.org/de/userfiles/user3690/LeftRightClickDemo.java
Messages postés
22
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
18 décembre 2007

En effet, il y a bel et bien une fonction spéciale.

Je suis surpris, je ne la connaissais pas et mon collègue "démineur-freak" ne la connaissais pas non-plus.

J'avoue que c'est utile, mais je ne sais pas comment je pourrais détecter un clic simultané des deux boutons en Java.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.