DÉMINEUR COMPLET AVEC GESTION DES MEILLEURS TEMPS

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 18 déc. 2007 à 10:08
 attar - 21 sept. 2014 à 17:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45051-demineur-complet-avec-gestion-des-meilleurs-temps

excellent programme .Bravo
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
29 déc. 2007 à 10:33
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);
}
}
}
}
}
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
20 déc. 2007 à 18:57
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.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
20 déc. 2007 à 17:23
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
damned3 Messages postés 22 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 18 décembre 2007
18 déc. 2007 à 22:18
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.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
18 déc. 2007 à 10:08
Bravo, cela a l'air de bien fonctionner.
Ce qu'on pourrait faire encore:
Dans le démineur de Windows on peut cliquer sur un carré simultanément avec les boutons gauche et droit de la souris
pour avoir une fonction spéciale (voir "Stratégies et astuces" dans l'aide du démineur de Windows).
Rejoignez-nous