Commit 02afd77f authored by Fardale's avatar Fardale

initialisation du projet

parents
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".
private var tailleX = 9
private var tailleY = 9
// 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](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](9,9)
// 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 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) {
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 }
}
}
}
// 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 min(nb_mines-1,tailleX*tailleY-1)) {
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 }
}
}
}
// 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) : 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) {
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"))
}
}
}
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 swing._
import java.awt.Color
import javax.swing.ImageIcon
class MonBouton(protected var x : Int, protected var y : Int) extends Button {
preferredSize = new Dimension(50, 50)
borderPainted = true
def getTheX = x
def getTheY = y
var compteur_spe = false
}
import swing._
import event._
import Array._
import java.awt.{Color, Graphics2D}
import javax.swing.ImageIcon
object HelloWorld extends SimpleSwingApplication {
def top = new MainFrame {
// Valeurs et variables.
private var jeu = new Demineur
private var bts = jeu.getBoutons
private var tx = jeu.getTailleX
private var ty = jeu.getTailleY
// Renouvellement des variables
private def renewbts = bts = jeu.getBoutons
private def renewtx = tx = jeu.getTailleX
private def renewty = ty = jeu.getTailleY
// Convertisseur sécurisé
private def string_to_int (s: String) = {
try {
s.toInt
} catch {
case e:Exception => 0
}
}
val but_fac = new RadioButton("Facile")
val but_moy = new RadioButton("Moyen")
val but_dur = new RadioButton("Difficile")
val but_per = new RadioButton("Personnalisé")
val mutex = new ButtonGroup
val radios = List(but_fac, but_moy, but_dur, but_per)
mutex.buttons ++= radios
mutex.select(but_fac)
// Création d'un nouveau jeu
private def new_game = {
jeu = new Demineur
mutex.selected.get match {
case `but_fac` =>
case `but_moy` => jeu.reparametrage(16,16,40)
case `but_dur` => jeu.reparametrage(16,16,99)
case `but_per` => val r_lig = Dialog.showInput(contents.head, "Entrez le nombre de lignes :",
title="Génération personnalisée", initial = "9",
icon = new ImageIcon(getClass.getResource("case_un.png")))
val r_col = Dialog.showInput(contents.head, "Entrez le nombre de colonnes :",
title="Génération personnalisée", initial = "9",
icon = new ImageIcon(getClass.getResource("case_deux.png")))
val r_mine = Dialog.showInput(contents.head, "Entrez le nombre de mines :",
title="Génération personnalisée", initial = "10",
icon = new ImageIcon(getClass.getResource("case_trois.png")))
var li = 9
var co = 9
var nm = 10
r_lig match {
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 None =>
}
r_mine match {
case Some(s) => if (string_to_int(s) != 0) { nm = string_to_int(s) }
case None =>
}
jeu.reparametrage(li,co,nm)
}
jeu.initialise
renewbts
renewtx
renewty
contents = new GridPanel(tx,ty) {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
contents += bts(i)(j)
}
}
}
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
}
// Redémarrage du jeu
private def redemarrage = {
jeu.creation_boutons
renewbts
contents = new GridPanel(tx,ty) {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
contents += bts(i)(j)
}
}
}
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
}
// Génération à partir d'une graine aléatoire
private def genere_a_parametre = {
val r = Dialog.showInput(contents.head, "Entrez une graine de génération :",
title="Génération paramétrée", initial = "12",
icon = new ImageIcon(getClass.getResource("case_mine.png")))
r match {
case Some(s) => jeu = new Demineur
mutex.selected.get match {
case `but_fac` =>
case `but_moy` => jeu.reparametrage(16,16,40)
case `but_dur` => jeu.reparametrage(16,16,99)
case `but_per` => val r_lig = Dialog.showInput(contents.head, "Entrez le nombre de lignes :",
title="Génération personnalisée", initial = "9",
icon = new ImageIcon(getClass.getResource("case_un.png")))
val r_col = Dialog.showInput(contents.head, "Entrez le nombre de colonnes :",
title="Génération personnalisée", initial = "9",
icon = new ImageIcon(getClass.getResource("case_deux.png")))
val r_mine = Dialog.showInput(contents.head, "Entrez le nombre de mines :",
title="Génération personnalisée", initial = "10",
icon = new ImageIcon(getClass.getResource("case_trois.png")))
var li = 9
var co = 9
var nm = 10
r_lig match {
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 None =>
}
r_mine match {
case Some(s) => if (string_to_int(s) > 0) { nm = string_to_int(s) }
case None =>
}
jeu.reparametrage(li,co,nm)
}
jeu.initialise(string_to_int(s))
renewbts
renewtx
renewty
contents = new GridPanel(tx,ty) {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
contents += bts(i)(j)
}
}
}
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
listenTo(bts(i)(j))
listenTo(bts(i)(j).mouse.clicks)
}
}
case None =>
}
}
// Création d'un jeu initial.
jeu.initialise
// Elément de décor.
title = "The Great Satanist Programming Project"
// Barre de menu.
menuBar = new MenuBar {
contents += new Menu("Jeu") {
contents += new MenuItem(Action("Nouveau jeu") {
new_game
})
contents += new MenuItem(Action("Redémarrer") {
redemarrage
})
contents += new MenuItem(Action("Génération paramétrée...") {
genere_a_parametre
})
contents += new Menu("Difficulté") {
contents ++= radios
}
}
}
//contents += new Label("Il te reste 10 mines !")
// Elements de la fenêtre.
contents = new GridPanel(tx,ty) {
for (i <- 0 to (tx-1)) {
for (j <- 0 to (ty-1)) {
contents += bts(i)(j)
}
}
}
// Activation des surveillances de boutons.
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) => 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