Microsoft Small Basic

Program Listing: CXS991-0
'DEBUG = "True"
DEBUG = "False"

INTERNET_photos = "True"
'INTERNET_photos = "False"

If DEBUG Then
'pour debugage affichage de ligne dans fenêtre texte
initialise_debug()
Endif

'choix des évenement gérés
GraphicsWindow.MouseDown = clic_souris
Controls.ButtonClicked = clic_bouton

'mise en forme de la fenêtre du jeu
initialise_graphique()

'définition des options du jeu
jeu_options()

'remplissage du tableaux des couleurs de base
couleurs_base()

'point d'initialisation du cadre
nouveau_cadre()

'affichage de la fenêtre d'initialisation
GraphicsWindow.Show()

'Program.End()
'================== fin du programme princiale =================

'------gestion des évenements ---

Sub clic_bouton
'gestion des clics sur boutons
If DEBUG Then
TextWindow.WriteLine("sub=clic_bouton")
EndIf

bouton_nom = Controls.LastClickedButton
bouton_légende = Controls.GetButtonCaption(bouton_nom)

If DEBUG Then
texte_message = "BOUTON nom:" + bouton_nom + " légende:" + bouton_légende
TextWindow.WriteLine(texte_message)
EndIf

If bouton_légende = "RECADRAGE" Then
'redimensionnement du cadre
GraphicsWindow.ShowMessage("nouvelle partie","CADRE")
Shapes.Remove(pointeur)
nouveau_cadre()
Goto clic_bouton_fin
EndIf

If bouton_légende = "AIDE ?" Then
'affichage d'un guide
GraphicsWindow.ShowMessage("cliquez sur une case et déplacez avec les boutons","AIDE")
Goto clic_bouton_fin
EndIf

If bouton_légende = "MELANGE !" Then
'mélanges de toute les cases
GraphicsWindow.ShowMessage("Avez-vous retenu les couleurs du départ ?","MELANGE")
mélange_case()
Goto clic_bouton_fin
EndIf

If bouton_légende = "RESULTAT ..." Then
'controles des couleurs finales
vérification_couleurs()
Goto clic_bouton_fin
EndIf

If mou_case = "?" Then
GraphicsWindow.ShowMessage("case non sélectionnée","CASE")
Goto clic_bouton_fin
EndIf

If bouton_légende = "H" Then
mou_case = "HAUT"
test_déplacement()
Goto clic_bouton_fin
EndIf

If bouton_légende = "G" Then
mou_case = "GAUCHE"
test_déplacement()
Goto clic_bouton_fin
Endif

If bouton_légende = "D" Then
mou_case = "DROITE"
test_déplacement()
Goto clic_bouton_fin
Endif

If bouton_légende = "B" Then
mou_case = "BAS"
test_déplacement()
Goto clic_bouton_fin
EndIf

GraphicsWindow.ShowMessage("légende inconnue","BOUTON")

clic_bouton_fin:

GraphicsWindow.Show()

EndSub

Sub clic_souris
'gestion des clics sur SOURIS en fonction des coordonnées
If DEBUG Then
TextWindow.WriteLine("sub=clic_souris")
EndIf

x_souris=GraphicsWindow.MouseX
y_souris=GraphicsWindow.MouseY
If DEBUG Then
texte_message = "SOURIS position X:" + x_souris + " Y:" + y_souris
TextWindow.WriteLine(texte_message)
EndIf

If (x_souris > 100 And x_souris < 400) Then
If (y_souris > 100 And y_souris < 400) Then
test_case()
Goto clic_souris_fin
EndIf
EndIf

GraphicsWindow.ShowMessage("cliquez dans une case ou un bouton","colonne")

clic_souris_fin:

GraphicsWindow.Show()

EndSub

'-------------------------------------------------- sous programmes ------------------------

Sub initialise_debug
'création de la fenêtre de débugage
If DEBUG Then
TextWindow.WriteLine("sub=initialize_debug")
EndIf
TextWindow.Title = "Mode execution DEBUG début à " + Clock.Time
TextWindow.Top=100
TextWindow.Left=1000

EndSub

Sub initialise_graphique
'création de la fenêtre graphique
If DEBUG Then
TextWindow.WriteLine("sub=initialize_graphique")
EndIf
GraphicsWindow.Title = "CASE couleurs - déplacements par permutation (Cjm)"
GraphicsWindow.BackgroundColor = "Blue"
GraphicsWindow.Width = 500
GraphicsWindow.Height = 500

GraphicsWindow.Left=200
GraphicsWindow.Top=200

'nom de l'auteur
GraphicsWindow.BrushColor = "White"
GraphicsWindow.DrawText(350, 70, "COURCOL Jean-Michel")

'photo identité
If (INTERNET_photos) Then
choix_personne()
image_chemin = personne_photo
Else
image_chemin = "C:\Users\jmc\Mes applications SMALL BASIC\images small basic\DASSAULT - rafale.jpg"
EndIf

GraphicsWindow.DrawText(360, 55, personne_prénom)

photo_perso = ImageList.LoadImage(image_chemin)
photo_largeur = ImageList.GetWidthOfImage(image_chemin)
photo_hauteur = ImageList.GetHeightOfImage(image_chemin)

GraphicsWindow.DrawResizedImage(photo_perso, 450, 0, 35, 60)

Endsub

Sub choix_personne
'choix aléatoire de la personne présente sur mon CLOUD
If DEBUG Then
TextWindow.WriteLine("sub=choix_personne")
EndIf
personne_numéro = Math.GetRandomNumber(5)

If personne_numéro = 1 Then
personne_prénom = "jean-michel"
personne_photo = "https://api.mescontenus.orange.fr/gate/dungeonwire.php?wirecode=waCuTtHkhxNWUq77IgaWGqAfWdPvawpGvcVewt7wGvVrH"
Goto choix_personne_fin
EndIf

If personne_numéro = 2 Then
personne_prénom = "pascal"
personne_photo = "https://api.mescontenus.orange.fr/gate/dungeonwire.php?wirecode=E5nVVp8yw3ClqetFYwKskyHQutMlIwNodfonP3GEbX0le"
Goto choix_personne_fin
EndIf

If personne_numéro = 3 Then
personne_prénom = "nathalie"
personne_photo = "https://api.mescontenus.orange.fr/gate/dungeonwire.php?wirecode=2nkCJjQqiMQaYe4YHEwtg68huTJxEOOdw9k3Vo9L9Egpw"
Goto choix_personne_fin
EndIf

If personne_numéro = 4 Then
personne_prénom = "corentin"
personne_photo = "https://api.mescontenus.orange.fr/gate/dungeonwire.php?wirecode=uYWyGp9ySsZe9ulnMzAatazPJLRCkY0FTVQActnr6cyiP"
Goto choix_personne_fin
EndIf

If personne_numéro = 5 Then
personne_prénom = "camille"
personne_photo = "https://api.mescontenus.orange.fr/gate/dungeonwire.php?wirecode=OEoYk9OlIibtvLq6krneN8ez7n26oEeNOkjihAfeEq7EP"
Goto choix_personne_fin
EndIf

choix_personne_fin:

If DEBUG Then
texte_message = "prénom personne :" + personne_prénom + " numéro :" + personne_numéro
TextWindow.WriteLine(texte_message)
EndIf

EndSub

Sub jeu_options
'DEUX possibilités de pré-remplissage des couleurs 1=aléatoire 2=gamme/nuance
If DEBUG Then
TextWindow.WriteLine("sub=jeu_options")
EndIf
If DEBUG Then
option_couleur = 2
Else
option_couleur = Math.GetRandomNumber(2)
Endif
EndSub

Sub couleurs_base
'remplissage d'un tableau de base de couleur selon gammes (7) et nuances (6)
If DEBUG Then
TextWindow.WriteLine("sub=couleurs_base")
EndIf

'selon les couleurs de bases
base_choix()

EndSub

Sub base_choix
'choix des bases de couleurs par gammes (colonnes) et nuances (lignes)
If DEBUG Then
TextWindow.WriteLine("sub=base_choix")
EndIf
'les rouges

base[1][1] = "IndianRed"
base[2][1] = "LightCoral"
base[3][1] = "Salmon"
base[4][1] = "Crimson"
base[5][1] = "FireBrick"
base[6][1] = "Red"

'les roses

base[1][2] = "LightPink"
base[2][2] = "HotPink"
base[3][2] = "DeepPink"
base[4][2] = "MediumVioletRed"
base[5][2] = "PaleVioletRed"
base[6][2] = "Pink"

'les oranges

base[1][3] = "LightSalmon"
base[2][3] = "Coral"
base[3][3] = "Tomato"
base[4][3] = "OrangeRed"
base[5][3] = "DarkOrange"
base[6][3] = "Orange"

'les jaunes

base[1][4] = "Gold"
base[2][4] = "LemonChiffon"
base[3][4] = "LightGoldenrodYellow"
base[4][4] = "PapayaWhip"
base[5][4] = "Moccassin"
base[6][4] = "Yellow"

'les violets

base[1][5] = "Thistle"
base[2][5] = "Plum"
base[3][5] = "Orchid"
base[4][5] = "Fuchsia"
base[5][5] = "DarkViolet"
base[6][5] = "BlueViolet"

'les verts

base[1][6] = "Chartreuse"
base[2][6] = "Lime"
base[3][6] = "PaleGreen"
base[4][6] = "MediumSeaGreen"
base[5][6] = "OliveDrab"
base[6][6] = "Green"

'les bleus

base[1][7] = "Aqua"
base[2][7] = "PaleTurquoise"
base[3][7] = "Turquoise"
base[4][7] = "SteelBlue"
base[5][7] = "LightSteelBlue"
base[6][7] = "LightBlue"

EndSub

Sub nouveau_cadre
'mise en place cadre
If DEBUG Then
TextWindow.WriteLine("sub=nouveau_cadre")
EndIf
'définition de la zone (cadre) des cases
définir_cadre()

'chargement des couleurs du départ et actuelle
couleurs_départ()

'mise en place des cases dans le cadre avec leurs couleurs respectives
charge_cadre()

'mise en place des boutons disponible
définir_boutons()

'définition du pointeur cible de case
GraphicsWindow.PenColor = "Black"
GraphicsWindow.BrushColor = "White"
pointeur = Shapes.AddEllipse(lar_rectangle,hau_rectangle)
Shapes.Move(pointeur,0,0)

'initialisation des paramètres de contrôle du jeu
jeu_paramètres()

EndSub

Sub définir_cadre
'définition des dimensions du cadre (centré dans la fenêtre graphique) et nombre de colonnes et de lignes
If DEBUG Then
TextWindow.WriteLine("sub=définir_cadre")
EndIf
cadre_largeur = 300
cadre_hauteur = 300

cadre_x = (GraphicsWindow.Width - cadre_largeur) / 2
cadre_y = (GraphicsWindow.Height - cadre_hauteur) / 2

GraphicsWindow.PenColor = "Red"
GraphicsWindow.DrawRectangle(cadre_x, cadre_y, cadre_largeur, cadre_hauteur)

'nombre de colonnes (2 à 7) et de lignes (2 à 6) aléatoires
If DEBUG Then
maxi_colonnes = math.GetRandomNumber(2)
Else
maxi_colonnes = math.GetRandomNumber(6)
Endif
maxi_colonnes = maxi_colonnes + 1

If DEBUG Then
maxi_lignes = math.GetRandomNumber(2)
Else
maxi_lignes = math.GetRandomNumber(5)
EndIf
maxi_lignes = maxi_lignes + 1

If DEBUG Then
texte_message = "maximum de colonnes =" + maxi_colonnes + " et deligne:" + maxi_lignes
TextWindow.WriteLine(texte_message)
EndIf

'largeur des cases en fonction du nombre de colonnes
lar_rectangle= cadre_largeur / maxi_colonnes
'hauteur des case en fonction du nombre de lignes
hau_rectangle= cadre_hauteur / maxi_lignes

EndSub

Sub couleurs_départ
'détermination du choix des couleurs du tableaux du départ et donc actuelle
If DEBUG Then
TextWindow.WriteLine("sub=couleurs_départ")
EndIf
For ligne = 1 to maxi_lignes
For colonne = 1 to maxi_colonnes
If option_couleur = 1 Then
'couleurs aléatoire (doubles possibles)
case_colonne = Math.GetRandomNumber(7)
case_ligne = Math.GetRandomNumber(6)
couleur_départ[ligne][colonne] = base[case_ligne][case_colonne]
Else
'selon les couleurs de bases
couleur_départ[ligne][colonne] = base[ligne][colonne]
EndIf
couleur_actuelle[ligne][colonne] = couleur_départ[ligne][colonne]

EndFor
EndFor

EndSub

Sub charge_cadre
'mise en place des cases selon couleurs et nombre de colonnes et ligne
If DEBUG Then
TextWindow.WriteLine("sub=charge_cadre")
EndIf
For ligne = 1 to maxi_lignes
For colonne = 1 to maxi_colonnes

GraphicsWindow.BrushColor=couleur_actuelle[ligne][colonne]

case[ligne][colonne]=Shapes.AddRectangle(lar_rectangle,hau_rectangle)
x_rectangle = 100 + (lar_rectangle * (colonne - 1))
y_rectangle = 100 + (hau_rectangle * (ligne - 1))

Shapes.Move(case[ligne][colonne],x_rectangle,y_rectangle)
If DEBUG Then
texte_message = "couleur actuelle=" + couleur_actuelle[ligne][colonne] + " ligne:" + ligne + " colonne:" + colonne
TextWindow.WriteLine(texte_message)
Endif
EndFor
EndFor

EndSub

Sub définir_boutons
'mise en place des boutons dans la fenêtre graphique
If DEBUG Then
TextWindow.WriteLine("sub=définir_boutons")
EndIf
'les boutons de déplacements
bouton_largeur = 50
bouton_hauteur = 50
GraphicsWindow.BrushColor = "Red"

bouton_haut = Controls.AddButton("H",225,25)
Controls.SetSize(bouton_haut,bouton_largeur, bouton_hauteur)

bouton_gauche = Controls.AddButton("G",25,225)
Controls.SetSize(bouton_gauche,bouton_largeur, bouton_hauteur)

bouton_droite = Controls.AddButton("D",425,225)
Controls.SetSize(bouton_droite,bouton_largeur, bouton_hauteur)

bouton_bas = Controls.AddButton("B",225,425)
Controls.SetSize(bouton_bas,bouton_largeur, bouton_hauteur)

'les boutons annexes (aide,départ=mélange, controle=résultat)
GraphicsWindow.BrushColor = "Orange"
bouton_aide = Controls.AddButton("AIDE ?",320,25)
bouton_mélange = Controls.AddButton("MELANGE !",50,450)
bouton_nouvelle = Controls.AddButton("RECADRAGE",50,420)
bouton_résultat = Controls.AddButton("RESULTAT ...",320,450)

EndSub

Sub jeu_paramètres
'initialisation des paramètres de départ du jeu
If DEBUG Then
TextWindow.WriteLine("sub=jeu_paramètres")
EndIf
mou_case="?"
case_colonne=0
case_ligne=0

nouvelle_colonne=0
nouvelle_ligne=0

nombre_déplacements = 0

''chrono (seconde du jeu)
départ_secondes = Clock.Second + (Clock.Minute * 60) + (Clock.Hour * 3600)

'point de départ du pointeur
Shapes.Animate(pointeur,0,0,1000)

EndSub

Sub test_case
'calcul de la colonne en fonction de la largeur de case
If DEBUG Then
TextWindow.WriteLine("sub=test_case")
EndIf
indice_colonne= (x_souris - 100) / lar_rectangle
case_colonne = 1 + Math.Floor(indice_colonne)
'calcul de la ligne en fonction de la hauteur de case
indice_ligne = (y_souris - 100) / hau_rectangle
case_ligne= 1 + Math.Floor(indice_ligne)

If DEBUG Then
texte_message = "CASE - colonne:" + case_colonne + " ligne:" + case_ligne
TextWindow.WriteLine(texte_message)
EndIf

'repérage de la case sélectionnée
repère_case()
mou_case = "NOUVELLE"

EndSub

Sub repère_case
'positionnement du pointeur sur la case sélectionnée
If DEBUG Then
TextWindow.WriteLine("sub=repère_case")
EndIf
x_rectangle = 100 + (lar_rectangle * (case_colonne - 1))
y_rectangle = 100 + (hau_rectangle * (case_ligne - 1))

Shapes.Animate(pointeur, x_rectangle, y_rectangle, 1000)

EndSub

Sub test_déplacement
'détermination du nouvel emplacement de la case sélectionnée
If DEBUG Then
TextWindow.WriteLine("sub=test_déplacement")
EndIf
nouvelle_ligne = case_ligne
nouvelle_colonne = case_colonne

If mou_case = "HAUT" Then
If case_ligne = 1 Then
GraphicsWindow.ShowMessage("déplacement impossible sur première ligne","HAUT")
Else
nouvelle_ligne = nouvelle_ligne - 1
nombre_déplacements = nombre_déplacements + 1
EndIf
Goto déplacement_case
EndIf

If mou_case = "BAS" Then
If case_ligne = maxi_lignes Then
GraphicsWindow.ShowMessage("déplacement impossible sur dernière ligne","BAS")
Else
nouvelle_ligne = nouvelle_ligne + 1
nombre_déplacements = nombre_déplacements + 1
EndIf
Goto déplacement_case
EndIf

If mou_case = "GAUCHE" Then
If case_colonne = 1 Then
GraphicsWindow.ShowMessage("déplacement impossible sur première colonne","GAUCHE")
Else
nouvelle_colonne = nouvelle_colonne - 1
nombre_déplacements = nombre_déplacements + 1
EndIf
Goto déplacement_case
EndIf

If mou_case = "DROITE" Then
If case_colonne = maxi_colonnes Then
GraphicsWindow.ShowMessage("déplacement impossible sur dernière colonne","DROITE")
Else
nouvelle_colonne = nouvelle_colonne + 1
nombre_déplacements = nombre_déplacements + 1
EndIf
Goto déplacement_case
EndIf

GraphicsWindow.ShowMessage("déplacement inconnu:" + mou_case,"DEPLACEMENT")
Goto test_déplacement_fin

déplacement_case:

If DEBUG Then
texte_message = "DEPLACEMENT vers colonne:" + nouvelle_colonne + " ligne:" + nouvelle_ligne
TextWindow.WriteLine(texte_message)
EndIf

'permutation de la case sélectionnée (pointeur) selon le mouvement (direction)
permute_case()

'la nouvelle position devient case cible
case_ligne = nouvelle_ligne
case_colonne = nouvelle_colonne

'repérage de la case déplacée
repère_case()

test_déplacement_fin:

EndSub

Sub mélange_case
'mélange des cases
If DEBUG Then
TextWindow.WriteLine("sub=mélange_case")
EndIf
For ligne = 1 to maxi_lignes
For colonne = 1 to maxi_colonnes
'choix aléatoire d'une autre case

nouvelle_colonne = Math.GetRandomNumber(maxi_colonnes)
nouvelle_ligne = Math.GetRandomNumber(maxi_lignes)

case_colonne = colonne
case_ligne = ligne

permute_case()

EndFor
EndFor

'réinitialisation des repères
jeu_paramètres()

'jou le son de CLOCHE du départ
Sound.PlayBellRing()

If DEBUG Then
texte_message = "TOP départ à :" + Clock.Time + " soit " + départ_secondes
texte_message = texte_message + " secondes"
TextWindow.WriteLine(texte_message)
EndIf

EndSub

Sub permute_case
'permutation des éléments d'une case (tableau, couleur, emplacement)
If DEBUG Then
TextWindow.WriteLine("sub=permute_case")
EndIf
' permutation des cases dans fenetres
x_rectangle = 100 + (lar_rectangle * (nouvelle_colonne - 1))
y_rectangle = 100 + (hau_rectangle * (nouvelle_ligne - 1))
Shapes.Move(case[case_ligne][case_colonne],x_rectangle,y_rectangle)

x_rectangle = 100 + (lar_rectangle * (case_colonne - 1))
y_rectangle = 100 + (hau_rectangle * (case_ligne - 1))
Shapes.Move(case[nouvelle_ligne][nouvelle_colonne],x_rectangle,y_rectangle)

'permutation dans tableaux
case_tampon = case[nouvelle_ligne][nouvelle_colonne]
case[nouvelle_ligne][nouvelle_colonne] = case[case_ligne][case_colonne]
case[case_ligne][case_colonne] = case_tampon

'permutation des couleurs
couleur_tampon = couleur_actuelle[nouvelle_ligne][nouvelle_colonne]
couleur_actuelle[nouvelle_ligne][nouvelle_colonne] = couleur_actuelle[case_ligne][case_colonne]
couleur_actuelle[case_ligne][case_colonne] = couleur_tampon

EndSub

Sub vérification_couleurs
'controle couleur des cases
If DEBUG Then
TextWindow.WriteLine("sub=vérification_couleurs")
EndIf
case_bonne = 0
case_erreur = 0

For case_ligne = 1 to maxi_lignes
For case_colonne = 1 to maxi_colonnes
'couleur de la case (actuelle) identique à celle de départ
If couleur_actuelle[case_ligne][case_colonne] = couleur_départ[case_ligne][case_colonne] Then
case_bonne = case_bonne + 1
Else
If DEBUG Then
texte_message = "CASE erreur colonne:" + case_colonne + " ligne:" + case_ligne
TextWindow.Write(texte_message)
texte_message = " COULEUR départ:" + couleur_départ[ligne][colonne] + " actuelle:" + couleur_actuelle[ligne][colonne]
TextWindow.WriteLine(texte_message)
EndIf
case_erreur = case_erreur + 1
EndIf
EndFor
EndFor

'fin du CHRONO (secondes) pour afficage du résultat
résultat_secondes = Clock.Second + (Clock.Minute * 60) + (Clock.Hour * 3600)

If DEBUG Then
texte_message = "TOP résultat à :" + Clock.Time + " soit " + résultat_secondes
texte_message = texte_message + " secondes"
TextWindow.WriteLine(texte_message)
EndIf

'calcul du temps de jeu
durée_secondes = résultat_secondes - départ_secondes
durée_heures = Math.Floor(durée_secondes / 3600)
reste_secondes = durée_secondes - (3600 * durée_heures)
durée_minutes = Math.Floor(reste_secondes / 60)
reste_secondes = reste_secondes - (60 * durée_minutes)

'jou le CARILLON pour résultat
Sound.PlayChime()

If case_erreur = 0 Then
texte_message = "BRAVO vous avez bien placé(es) " + case_bonne + " case(s) en " + nombre_déplacements + " déplacement(s)"
Else
texte_message ="PAS TERMINE - vous avez " + case_bonne + " case(s) bien placée(s) et " + case_erreur + " case(s) mal placée(s)"
EndIf

texte_message = texte_message + " en " + durée_heures + " heure(s)"
texte_message = texte_message + " " + durée_minutes + " minute(s)"
texte_message = texte_message + " et " + durée_secondes + " seconde(s)"

GraphicsWindow.ShowMessage(texte_message,"RESULTAT")

'réinitialisation des paramètres
jeu_paramètres()

EndSub