Commit 301c078e authored by Patrick Lafrance's avatar Patrick Lafrance

Version finale

parent 27f16f98
package dti.g04.démineur;
import java.io.Serializable;
enum Type{
VIDE,
BOMBE;
public String toString() {
switch(name()) {
case "VIDE" : return " ";
case "BOMBE" : return "<>";
}
return "";
}
}
enum Marque{
VIDE,
BOMBE,
INCONNUE;
public String toString() {
switch(name()) {
case "VIDE" : return "▒▒";
case "BOMBE" : return "|>";
case "INCONNUE" : return "? ";
}
return "";
}
}
class Case implements Serializable{
Type type;
Marque marque;
boolean cachée;
public Case(Type unType) {
type=unType;
cachée=true;
marque=Marque.VIDE;
}
public Case() {
this(Type.VIDE);
}
public void découvrir() {
cachée=false;
}
public void marquer() {
if(marque==Marque.VIDE) {
marque=Marque.BOMBE;
}
else if ( marque == Marque.BOMBE ){
marque=Marque.INCONNUE;
}
else{
marque=Marque.VIDE;
}
}
public boolean estCachée() {
return cachée;
}
public Type getType() {
return type;
}
public Marque getMarque() {
return marque;
}
public String toString() {
String représentation="";
if ( cachée ) {
représentation = getMarque().toString();
}
else {
représentation = getType().toString();
}
return représentation;
}
}
package dti.g04.démineur;
import java.util.Scanner;
public class Démineur {
static class Coup{
public int x;
public int y;
public char action;
public Coup(char _action, int _x, int _y){
action=_action;
x=_x;
y=_y;
}
}
static Coup getProchainCoup(){
Scanner scan=new Scanner(System.in);
System.out.print("Prochain mouvement (A X Y): ");
String coup[]=scan.nextLine().split(" ");
char action=coup[0].toLowerCase().charAt(0);
int x=0;
int y=0;
if(coup.length>=3){
x=Integer.parseInt(coup[1]);
y=Integer.parseInt(coup[2]);
}
return new Coup(action,x,y);
}
public static void main(String args[])
{
Démineur démineur = new Démineur();
Scanner scan=new Scanner(System.in);
System.out.print("Choisissez la taille de la grille (Largeur Hauteur): ");
Grille g=new Grille(scan.nextInt(), scan.nextInt());
System.out.println(g);
Coup coup=getProchainCoup();
g.placerBombes( coup.x, coup.y, 10 );
g.découvrirCase(coup.x,coup.y);
System.out.println(g);
boolean fin=false;
while(!fin){
coup=getProchainCoup();
switch(coup.action){
case 'm':
g.marquerCase(coup.x, coup.y);
break;
case 'd':
Type type=g.découvrirCase(coup.x, coup.y);
if(type==Type.BOMBE){
System.out.println("BOUM!!!");
g.révélerTout();
fin=true;
}
break;
}
if(g.estRéussi()){
System.out.println("Bravo!");
fin=true;
g.révélerTout();
}
System.out.println(g);
}
}
}
package dti.g04.démineur;
import java.util.Random;
import java.io.Serializable;
class Grille implements Serializable{
int largeur;
int hauteur;
Case[][] cases;
public Grille( int uneLargeur, int uneHauteur ) {
largeur=uneLargeur;
hauteur=uneHauteur;
cases=new Case[largeur][hauteur];
for ( int i=0;i<largeur;i++ ) {
for ( int j=0;j<hauteur;j++ ) {
cases[i][j]=new Case( Type.VIDE );
}
}
}
public Grille() {
this( 10, 10 );
}
private String getReprésentationCase( int x, int y ) {
String représentation = cases[x][y].toString();
if ( représentation == " " ) {
int nbVoisins=compterVoisins( x, y );
représentation = ( nbVoisins == 0 ? " " : " " + nbVoisins );
}
return représentation;
}
private int compterVoisins( int x, int y ) {
int cpt=0;
for ( int i=x-1;i<x+2;i++ )
for ( int j=y-1;j<y+2;j++ )
if ( i>=0 && j>=0 && i<largeur && j<hauteur && cases[i][j].getType()==Type.BOMBE ) cpt+=1;
return cpt;
}
public String toString() {
String res=" ";
for ( int i=0;i<largeur;i++ ) {
res+=i+( i<10?" ":" " );
}
res+="\n ╔";
for ( int i=0;i<largeur-1;i++ ) {
res+="══╦";
}
res+="══╗\n 0";
for ( int j=0;j<hauteur;j++ ) {
for ( int i=0;i<largeur;i++ ) {
res+="║" + getReprésentationCase( i, j );
}
res+="║";
if ( j==hauteur-1 ) break;
res+="\n ╠";
for ( int i=0;i<largeur-1;i++ ) {
res+="══╬";
}
res+="══╣\n" +( j<9?" "+(j+1):(j+1) );
}
res+="\n ╚";
for ( int i=0;i<largeur-1;i++ ) {
res+="══╩";
}
res+="══╝";
return res;
}
public void placerBombes( int premierCoupX, int premierCoupY, int nbBombes ) {
Random rand=new Random();
int bombesPosées=0;
while ( bombesPosées < nbBombes ) {
int positionX = rand.nextInt( largeur );
int positionY = rand.nextInt( hauteur );
//Place un bombe sur n'importe quelle case vide sauf autour de la case découverte
if ( ( positionX < premierCoupX-1 || positionX > premierCoupX+1 ) &&
( positionY < premierCoupY-1 || positionY > premierCoupY+1 ) &&
cases[positionX][positionY].getType() == Type.VIDE ) {
cases[positionX][positionY] = new Case( Type.BOMBE );
bombesPosées++;
}
}
}
public int getLargeur() {
return largeur;
}
public int getHauteur() {
return hauteur;
}
public Case getCase( int x, int y ) {
return cases[x][y];
}
public Type découvrirCase( int x, int y ) {
cases[x][y].découvrir();
if ( compterVoisins(x, y)==0 ) {
for ( int i=x-1;i<x+2;i++ )
for ( int j=y-1;j<y+2;j++ )
if ( i>=0 && i<largeur &&
j>=0 && j<hauteur &&
cases[i][j].estCachée() &&
cases[i][j].getType()!=Type.BOMBE) {
découvrirCase( i, j );
}
}
return cases[x][y].getType();
}
public void marquerCase( int x, int y ) {
cases[x][y].marquer();
}
public void révélerTout() {
for ( int i=0;i<largeur;i++ ) {
for ( int j=0;j<hauteur;j++ ) {
cases[i][j].cachée=false;
}
}
}
public boolean estRéussi() {
for ( int i=0;i<largeur;i++ ) {
for ( int j=0;j<hauteur;j++ ) {
if ( cases[i][j].estCachée() && cases[i][j].getType()!=Type.BOMBE ) {
return false;
}
}
}
return true;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment