Commit 8971c25c authored by Fardale's avatar Fardale
Browse files

Start

parent 49fb99eb
import scala.util.Random
import Array._
import javax.swing.ImageIcon
import scala.math._
class Demineur {
// Taille du champ de mine. Par défaut, réglé en "Facile".
......@@ -10,14 +11,20 @@ class Demineur {
// Nombre de mines dans le champ. Réglé en "Facile"
private var nb_mines = 10
// Compteur du nombre de mines trouvées.
private var m_trouvees = 0
// Détermine si on a gagné.
def victoire : Boolean = (nb_mines == m_trouvees)
// Matrice représentant le champ de mines. Ses valeurs sont comprises entre 0 et 9.
// 0-8 : Nombre de mines autour de la case vide.
// 9 : Signale l'emplacement d'une mine sur la case.
// Par défaut, on est réglé sur facile.
private var champ = ofDim[Int](tailleX,tailleY)
private var champ = ofDim[Int](9,9)
// Matrice des boutons associés aux cases (il me semble plus pertinent de l'inclure dans le jeu).
private var boutons = ofDim[MonBouton](tailleX,tailleY)
private var boutons = ofDim[MonBouton](9,9)
// Réinitialise les paramètres ci-dessus en cas de changement de difficulté.
def reparametrage (x: Int, y: Int, n: Int) = {
......@@ -56,35 +63,35 @@ class Demineur {
}
var x = Random.nextInt(tailleX)
var y = Random.nextInt(tailleY)
for (i <- 0 to nb_mines - 1) {
for (i <- 0 to min(nb_mines-1,tailleX*tailleY-1)) {
while(champ(x)(y) == 9) {
x = Random.nextInt(tailleX)
y = Random.nextInt(tailleY)
}
champ(x)(y) = 9
if (x != 0 && champ(x-1)(y) != 9) {
champ(x-1)(y) += 1
if (x != 0) {
if (champ(x-1)(y) != 9) { champ(x-1)(y) += 1 }
}
if (x != (tailleX-1) && champ(x+1)(y) != 9) {
champ(x+1)(y) += 1
if (x != (tailleX-1)) {
if (champ(x+1)(y) != 9) { champ(x+1)(y) += 1 }
}
if (y != 0 && champ(x)(y-1) != 9) {
champ(x)(y-1) += 1
if (y != 0) {
if (champ(x)(y-1) != 9) { champ(x)(y-1) += 1 }
}
if (y != (tailleY-1) && champ(x)(y+1) != 9) {
champ(x)(y+1) += 1
if (y != (tailleY-1)) {
if (champ(x)(y+1) != 9) { champ(x)(y+1) += 1 }
}
if (x != 0 && y != 0 && champ(x-1)(y-1) != 9) {
champ(x-1)(y-1) += 1
if (x != 0 && y != 0) {
if (champ(x-1)(y-1) != 9) { champ(x-1)(y-1) += 1 }
}
if (x != 0 && y != (tailleY-1) && champ(x-1)(y+1) != 9) {
champ(x-1)(y+1) += 1
if (x != 0 && y != (tailleY-1)) {
if (champ(x-1)(y+1) != 9) { champ(x-1)(y+1) += 1 }
}
if (x != (tailleX-1) && y != 0 && champ(x+1)(y-1) != 9) {
champ(x+1)(y-1) += 1
if (x != (tailleX-1) && y != 0) {
if (champ(x+1)(y-1) != 9) { champ(x+1)(y-1) += 1 }
}
if (x != (tailleX-1) && y != (tailleY-1) && champ(x+1)(y+1) != 9) {
champ(x+1)(y+1) += 1
if (x != (tailleX-1) && y != (tailleY-1)) {
if (champ(x+1)(y+1) != 9) { champ(x+1)(y+1) += 1 }
}
}
}
......@@ -100,7 +107,7 @@ class Demineur {
}
var x = ran.nextInt(tailleX)
var y = ran.nextInt(tailleY)
for (i <- 0 to nb_mines) {
for (i <- 0 to min(nb_mines-1,tailleX*tailleY-1)) {
while(champ(x)(y) == 9) {
x = ran.nextInt(tailleX)
y = ran.nextInt(tailleY)
......@@ -132,37 +139,75 @@ class Demineur {
}
}
}
// Propagation du dévoilement des cases vides
def propage(x: Int, y: Int){
if (x > 0) {
if(boutons(x-1)(y).enabled){clique_action(x-1,y)}
if(y > 0){
if(boutons(x-1)(y-1).enabled){clique_action(x-1,y-1)}
}
if(y < tailleY-1){
if(boutons(x-1)(y+1).enabled){clique_action(x-1,y+1)}
}
}
if (x < tailleX-1) {
if(boutons(x+1)(y).enabled){clique_action(x+1,y)}
if(y > 0){
if(boutons(x+1)(y-1).enabled){clique_action(x+1,y-1)}
}
if(y < tailleY-1){
if(boutons(x+1)(y+1).enabled){clique_action(x+1,y+1)}
}
}
if(y>0){
if(boutons(x)(y-1).enabled){clique_action(x,y-1)}
}
if(y<tailleY-1){
if(boutons(x)(y+1).enabled){clique_action(x,y+1)}
}
}
// Définit les conséquences d'un clic sur un bouton.
def clique_action (x: Int, y: Int) = {
def clique_action (x: Int, y: Int) : Boolean = {
champ(x)(y) match {
case 0 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_zero.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_zero.png"))
propage(x,y)
false
case 1 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_un.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_un.png"))
false
case 2 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_deux.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_deux.png"))
false
case 3 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_trois.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_trois.png"))
false
case 4 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_quatre.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_quatre.png"))
false
case 5 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_cinq.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_cinq.png"))
false
case 6 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_six.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_six.png"))
false
case 7 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_sept.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_sept.png"))
false
case 8 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_huit.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_huit.png"))
false
case 9 => for (i <- 0 to (tailleX-1)) {
for (j <- 0 to (tailleY-1)) {
if (champ(i)(j) == 9) {
......@@ -172,10 +217,26 @@ class Demineur {
}
}
}
println("Vous avez perdu !")
true
}
}
// Affichage des drapeaux
def drapeau(x: Int, y: Int) = {
if (boutons(x)(y).enabled == true) {
boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_drapeau.png"))
boutons(x)(y).enabled = false
boutons(x)(y).compteur_spe = true
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_drapeau.png"))
if (champ(x)(y) == 9) { m_trouvees += 1 } else { m_trouvees -= 1 }
}
else {
if (boutons(x)(y).compteur_spe) {
boutons(x)(y).icon = scala.swing.Swing.EmptyIcon
boutons(x)(y).enabled = true
boutons(x)(y).compteur_spe = false
if (champ(x)(y) == 9) { m_trouvees -= 1 } else { m_trouvees += 1 }
}
}
}
}
import scala.util.Random
import Array._
import javax.swing.ImageIcon
class Demineur {
// Taille du champ de mine. Par défaut, réglé en "Facile".
private var tailleX = 9
private var tailleY = 9
// Nombre de mines dans le champ. Réglé en "Facile"
private var nb_mines = 10
// Matrice représentant le champ de mines. Ses valeurs sont comprises entre 0 et 9.
// 0-8 : Nombre de mines autour de la case vide.
// 9 : Signale l'emplacement d'une mine sur la case.
// Par défaut, on est réglé sur facile.
private var champ = ofDim[Int](tailleX,tailleY)
// Matrice des boutons associés aux cases (il me semble plus pertinent de l'inclure dans le jeu).
private var boutons = ofDim[MonBouton](tailleX,tailleY)
// Réinitialise les paramètres ci-dessus en cas de changement de difficulté.
def reparametrage (x: Int, y: Int, n: Int) = {
tailleX = x
tailleY = y
nb_mines = n
champ = ofDim[Int](tailleX, tailleY)
boutons = ofDim[MonBouton](tailleX, tailleY)
}
// Pour récupérer les valeurs tailleX et tailleY
def getTailleX = tailleX
def getTailleY = tailleY
// Pour récupérer la matrice de boutons.
def getBoutons = boutons
// (Re)crée un champ de boutons sans toucher aux valeurs
def creation_boutons = {
for (i <- 0 to (tailleX-1)) {
for (j <- 0 to (tailleY-1)) {
boutons(i)(j) = new MonBouton(i,j)
}
}
}
// Initialisation basique d'un champ de mine.
// On crée les boutons ; puis on génère nb_mines positions aléatoires, et on
// incrémente les cases alentour pour chaque mine placée.
def initialise = {
creation_boutons
for (i <- 0 to (tailleX-1)) {
for (j <- 0 to (tailleY-1)) {
champ(i)(j) = 0
}
}
var x = Random.nextInt(tailleX)
var y = Random.nextInt(tailleY)
for (i <- 0 to nb_mines - 1) {
while(champ(x)(y) == 9) {
x = Random.nextInt(tailleX)
y = Random.nextInt(tailleY)
}
champ(x)(y) = 9
if (x != 0 && champ(x-1)(y) != 9) {
champ(x-1)(y) += 1
}
if (x != (tailleX-1) && champ(x+1)(y) != 9) {
champ(x+1)(y) += 1
}
if (y != 0 && champ(x)(y-1) != 9) {
champ(x)(y-1) += 1
}
if (y != (tailleY-1) && champ(x)(y+1) != 9) {
champ(x)(y+1) += 1
}
if (x != 0 && y != 0 && champ(x-1)(y-1) != 9) {
champ(x-1)(y-1) += 1
}
if (x != 0 && y != (tailleY-1) && champ(x-1)(y+1) != 9) {
champ(x-1)(y+1) += 1
}
if (x != (tailleX-1) && y != 0 && champ(x+1)(y-1) != 9) {
champ(x+1)(y-1) += 1
}
if (x != (tailleX-1) && y != (tailleY-1) && champ(x+1)(y+1) != 9) {
champ(x+1)(y+1) += 1
}
}
}
// Même fonction, mais avec la composante "random seed" en paramètre.
def initialise (n: Int) = {
creation_boutons
var ran = new Random(n)
for (i <- 0 to (tailleX-1)) {
for (j <- 0 to (tailleY-1)) {
champ(i)(j) = 0
}
}
var x = ran.nextInt(tailleX)
var y = ran.nextInt(tailleY)
for (i <- 0 to nb_mines) {
while(champ(x)(y) == 9) {
x = ran.nextInt(tailleX)
y = ran.nextInt(tailleY)
}
champ(x)(y) = 9
if (x != 0) {
if (champ(x-1)(y) != 9) { champ(x-1)(y) += 1 }
}
if (x != (tailleX-1)) {
if (champ(x+1)(y) != 9) { champ(x+1)(y) += 1 }
}
if (y != 0) {
if (champ(x)(y-1) != 9) { champ(x)(y-1) += 1 }
}
if (y != (tailleY-1)) {
if (champ(x)(y+1) != 9) { champ(x)(y+1) += 1 }
}
if (x != 0 && y != 0) {
if (champ(x-1)(y-1) != 9) { champ(x-1)(y-1) += 1 }
}
if (x != 0 && y != (tailleY-1)) {
if (champ(x-1)(y+1) != 9) { champ(x-1)(y+1) += 1 }
}
if (x != (tailleX-1) && y != 0) {
if (champ(x+1)(y-1) != 9) { champ(x+1)(y-1) += 1 }
}
if (x != (tailleX-1) && y != (tailleY-1)) {
if (champ(x+1)(y+1) != 9) { champ(x+1)(y+1) += 1 }
}
}
}
def propage(x: Int, y: Int){
if (x > 0) {
if(boutons(x-1)(y).enabled){clique_action(x-1,y)}
if(y > 0){
if(boutons(x-1)(y-1).enabled){clique_action(x-1,y-1)}
}
if(y < tailleY-1){
if(boutons(x-1)(y+1).enabled){clique_action(x-1,y+1)}
}
}
if (x < tailleX-1) {
if(boutons(x+1)(y).enabled){clique_action(x+1,y)}
if(y > 0){
if(boutons(x+1)(y-1).enabled){clique_action(x+1,y-1)}
}
if(y < tailleY-1){
if(boutons(x+1)(y+1).enabled){clique_action(x+1,y+1)}
}
}
if(y<0){
if(boutons(x)(y-1).enabled){clique_action(x,y-1)}
}
if(y<tailleY-1){
if(boutons(x)(y+1).enabled){clique_action(x,y+1)}
}
}
// Définit les conséquences d'un clic sur un bouton.
def clique_action (x: Int, y: Int) = {
champ(x)(y) match {
case 0 => {boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_zero.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_zero.png"))
propage(x,y)}
case 1 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_un.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_un.png"))
case 2 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_deux.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_deux.png"))
case 3 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_trois.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_trois.png"))
case 4 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_quatre.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_quatre.png"))
case 5 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_cinq.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_cinq.png"))
case 6 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_six.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_six.png"))
case 7 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_sept.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_sept.png"))
case 8 => boutons(x)(y).icon = new ImageIcon(getClass.getResource("case_huit.png"))
boutons(x)(y).enabled = false
boutons(x)(y).disabledIcon = new ImageIcon(getClass.getResource("case_huit.png"))
case 9 => for (i <- 0 to (tailleX-1)) {
for (j <- 0 to (tailleY-1)) {
if (champ(i)(j) == 9) {
boutons(i)(j).icon = new ImageIcon(getClass.getResource("case_mine.png"))
boutons(i)(j).enabled = false
boutons(i)(j).disabledIcon = new ImageIcon(getClass.getResource("case_mine.png"))
}
}
}
println("Vous avez perdu !")
}
}
}
......@@ -8,4 +8,6 @@ class MonBouton(protected var x : Int, protected var y : Int) extends Button {
def getTheX = x
def getTheY = y
var compteur_spe = false
}
......@@ -83,6 +83,7 @@ object HelloWorld extends SimpleSwingApplication {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
}
......@@ -101,6 +102,7 @@ object HelloWorld extends SimpleSwingApplication {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
}
......@@ -129,15 +131,15 @@ object HelloWorld extends SimpleSwingApplication {
var co = 9
var nm = 10
r_lig match {
case Some(s) => if (string_to_int(s) != 0) { li = string_to_int(s) }
case Some(s) => if (string_to_int(s) > 0) { li = string_to_int(s) }
case None =>
}
r_col match {
case Some(s) => if (string_to_int(s) != 0) { co = string_to_int(s) }
case Some(s) => if (string_to_int(s) > 0) { co = string_to_int(s) }
case None =>
}
r_mine match {
case Some(s) => if (string_to_int(s) != 0) { nm = string_to_int(s) }
case Some(s) => if (string_to_int(s) > 0) { nm = string_to_int(s) }
case None =>
}
jeu.reparametrage(li,co,nm)
......@@ -156,6 +158,7 @@ object HelloWorld extends SimpleSwingApplication {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
case None =>
......@@ -183,13 +186,11 @@ object HelloWorld extends SimpleSwingApplication {
contents += new Menu("Difficulté") {
contents ++= radios
}
contents += new MenuItem(Action("Prout"){
println("Méga Prout !!!");
sys.exit(0)
})
}
}
//contents += new Label("Il te reste 10 mines !")
// Elements de la fenêtre.
contents = new GridPanel(tx,ty) {
for (i <- 0 to (tx-1)) {
......@@ -203,12 +204,31 @@ object HelloWorld extends SimpleSwingApplication {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
// Réaction aux évènements.
reactions += {
case ButtonClicked(component : MonBouton) => jeu.clique_action(component.getTheX, component.getTheY)
case ButtonClicked(component : MonBouton) => var bo = jeu.clique_action(component.getTheX, component.getTheY)
if (bo) {
Dialog.showMessage(contents.head, "Désolé, vous avez perdu !", "Boum !!!",
Dialog.Message.Info, new ImageIcon(getClass.getResource("case_mine.png")))
new_game
} else {
if (jeu.victoire) {
Dialog.showMessage(contents.head, "Félicitations, vous avez gagné !", "Victoire !!!",
Dialog.Message.Info, new ImageIcon(getClass.getResource("case_drapeau.png")))
new_game
} }
case (e: MouseEvent) => if (e.peer.getButton() == java.awt.event.MouseEvent.BUTTON3) {
jeu.drapeau(e.peer.getComponent.getY/50, e.peer.getComponent.getX/50)
if (jeu.victoire) {
Dialog.showMessage(contents.head, "Félicitations, vous avez gagné !", "Victoire !!!",
Dialog.Message.Info, new ImageIcon(getClass.getResource("case_drapeau.png")))
new_game
}
}
}
}
......
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