Sokoban ultracommenté (MAJ annulation+reset+STATS)
Publié : jeu. 29/avr./2010 4:37
Hello,
Voici un petit code que j'ai dû réaliser pour mes élèves.
Je me suis inspiré du jeu gratuit du site http://www.brothersoft.com/games/soukoban.html
J'ai juste rajouté de l'eau qui coule pour faire joli
!
Il y a juste deux niveaux (j'ai fait le code la veille du cours
)
L'objectif est de réaliser un jeu complet (graphisme, son, jouabilité...etc).
La structure du code est assez intuitive. Pour chaque étape, j'ai gardé la première solution qui venait, cela signifie que le code n'est pas du tout optimisé
.
D'ailleurs, si vous avez des simplifications à faire ou même des points qui vous semblent trop obscurs, n'hésitez pas à le signaler !
Avec quelques améliorations, ça pourrait même faire un tuto non ?
Par contre, j'espère que je ne vais choquer personne avec mon GOTO
Dans ce genre de cas, je trouve que c'est super efficace.
Le seul hic, c'est que vous devez rajouter un effet sonore pour les caisses poussées et deux musiques pour l'ambiance et tout ça au format .wav:
Désolé
D'ailleurs, si une bonne âme a ça sous la main (liens de téléchargement)
Si vous avez la flemme, je mets la version sans son à la suite
Planche de sprites à charger et à mettre dans le même dossier que le code :

Version sans le son
Hasta la vista !
Voici un petit code que j'ai dû réaliser pour mes élèves.
Je me suis inspiré du jeu gratuit du site http://www.brothersoft.com/games/soukoban.html
J'ai juste rajouté de l'eau qui coule pour faire joli

Il y a juste deux niveaux (j'ai fait le code la veille du cours

L'objectif est de réaliser un jeu complet (graphisme, son, jouabilité...etc).
La structure du code est assez intuitive. Pour chaque étape, j'ai gardé la première solution qui venait, cela signifie que le code n'est pas du tout optimisé

D'ailleurs, si vous avez des simplifications à faire ou même des points qui vous semblent trop obscurs, n'hésitez pas à le signaler !
Avec quelques améliorations, ça pourrait même faire un tuto non ?
Par contre, j'espère que je ne vais choquer personne avec mon GOTO



Dans ce genre de cas, je trouve que c'est super efficace.
Le seul hic, c'est que vous devez rajouter un effet sonore pour les caisses poussées et deux musiques pour l'ambiance et tout ça au format .wav:
Code : Tout sélectionner
LoadSound(#son_caisse_pousse,"son_caisse_poussee.wav")
LoadSound(1,"musique1.wav")
LoadSound(2,"musique2.wav")
Désolé

D'ailleurs, si une bonne âme a ça sous la main (liens de téléchargement)

Si vous avez la flemme, je mets la version sans son à la suite

Planche de sprites à charger et à mettre dans le même dossier que le code :

Code : Tout sélectionner
;sokoban avec son
;auteur Huitbit
;amélioration des déplacements par Le Soldat Inconnu
;pb v4.41
;une partie des sprites est tirée du site ci-dessous
;http://www.brothersoft.com/games/soukoban.html
;*********************************
;-___________________________________
;-déclaration des variables et des constantes
;-___________________________________
;-L'énumération permet de travailler avec des noms plutôt qu'avec des chiffres
Enumeration
#spr_planche
#mur
#sol
#but
#caisse
#caisse_rouge
#soko1
#soko2
#eau
#spr_decor
#son_caisse_poussee
EndEnumeration
;-déclaration des variables
niveau.b;numéro du niveau
musique.b
largeur_niveau.b
hauteur_niveau.b
y.b;variable utilisée pour les lignes du tableau
x.b;variable utilisée pour les colonnes du tableau
type_tuile.b;variable utilisée pour le contenu de la case du tableau
nbre_caisses.b
compteur.b;permet de vérifier si les caisses sont rangées
x_soko.b;colonne où se trouve le personnage
y_soko.b;ligne où se trouve le personnage
soko.b;sprite choisi pour le personnage, soit #soko1, soit #soko2
chrono_soko.i; variable utilisée pour temporiser l'animation du personnage
chrono_keyboard.i;variable utilisée pour temporiser la fonction KeyboardPushed()
largeur_ecran.i
hauteur_ecran.i
x_clip_eau.i;variable utilisée pour découper le sprite "planche" pixel par pixel au niveau de l'eau
chrono_eau.i; variable utilisée pour temporiser l'animation de l'eau
;-_____________________________________________
;- Cette macro "clavier", permet en une seule fois de gérer les quatre directions,
;-il suffit de l'appeler en changeant les valeurs des paramètres direction, dx et dy.
Macro clavier(dx,dy)
;-si la place est libre devant, on avance dans la direction choisie
If carte(x_soko+dx,y_soko+dy)=#sol Or carte(x_soko+dx,y_soko+dy)=#but
x_soko=x_soko+dx
y_soko=y_soko+dy
;-s'il y a une caisse
ElseIf carte(x_soko+dx,y_soko+dy)=#caisse
;-si la place est libre devant la caisse, on peut la pousser
If carte(x_soko+2*dx,y_soko+2*dy)=#sol
carte(x_soko+dx,y_soko+dy)=#sol
carte(x_soko+2*dx,y_soko+2*dy)=#caisse
x_soko=x_soko+dx
y_soko=y_soko+dy
PlaySound(#son_caisse_poussee)
;-si la place libre devant la caisse est un point d'arrivée, on bouge la caisse et on l'affiche en rouge
ElseIf carte(x_soko+2*dx,y_soko+2*dy)=#but
carte(x_soko+dx,y_soko+dy)=#sol
carte(x_soko+2*dx,y_soko+2*dy)=#caisse_rouge
x_soko=x_soko+dx
y_soko=y_soko+dy
PlaySound(#son_caisse_poussee)
EndIf
;-si la caisse poussée est rouge
ElseIf carte(x_soko+dx,y_soko+dy)=#caisse_rouge
;-si on la déplace, on fera apparaître une case arrivée et elle redeviendra de couleur normale
If carte(x_soko+2*dx,y_soko+2*dy)=#sol
carte(x_soko+dx,y_soko+dy)=#but
carte(x_soko+2*dx,y_soko+2*dy)=#caisse
x_soko=x_soko+dx
y_soko=y_soko+dy
PlaySound(#son_caisse_poussee)
;-si on la déplace on fera apparaître une case arrivée et elle restera rouge
ElseIf carte(x_soko+2*dx,y_soko+2*dy)=#but
carte(x_soko+dx,y_soko+dy)=#but
carte(x_soko+2*dx,y_soko+2*dy)=#caisse_rouge
x_soko=x_soko+dx
y_soko=y_soko+dy
PlaySound(#son_caisse_poussee)
EndIf
EndIf
EndMacro
;-on prévient le compilateur que l'on va utiliser les sprites et le clavier
InitSprite()
InitKeyboard()
InitSound()
;-on charge le son et les musiques
LoadSound(#son_caisse_poussee,"son_caisse_poussee.wav")
LoadSound(1,"musique1.wav")
LoadSound(2,"musique2.wav")
;-on choisit le niveau de départ
niveau=1
;-"jeu:" s'appelle un label, c'est une adresse, un numéro de ligne où l'on peut renvoyer le programme
jeu:
;-en fonction du niveau, on se place au bon endroit pour lire les informations correspondantes
Select niveau
Case 1
Restore niveau1
Case 2
Restore niveau2
EndSelect
;-lecture et lancement de la musique de fond
Read.b musique
PlaySound(musique,#PB_Sound_Loop)
SoundVolume(musique,70)
;-lecture des dimensions (en nombre de cases) de la zone de jeu
Read.b largeur_niveau
Read.b hauteur_niveau
;-transformation des dimensions en nombre de pixels, sachant que chaque image fait 32 pixels
largeur_ecran=(largeur_niveau+1)*32
hauteur_ecran=(hauteur_niveau+1)*32
;-lecture du nombre de caisses
Read.b nbre_caisses
;-création du tableau pour y ranger toutes les informations
Dim carte.b(largeur_niveau,hauteur_niveau)
;-utilisation de deux boucles pour remplir le tableau
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
;-lecture des data
Read.b type_tuile
carte(x,y)=type_tuile
;-récupération des coordonnées de départ du personnage
If type_tuile=#soko1
x_soko=x
y_soko=y
carte(x,y)=#sol
EndIf
Next x
Next y
;-______________________
;-PROGRAMME PRINCIPAL
;-______________________
OpenWindow(0,0,0,largeur_ecran,hauteur_ecran,"Sokoban niveau "+Str(niveau),#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,largeur_ecran,hauteur_ecran,0,0,0)
;-on précise le type d'image utilisée
UsePNGImageDecoder()
;-on charge l'image de taille 352*32 pixels
;-Remarque : j'ai choisi une image où tous les sprites sont présents, dans la suite du programme, je la "découpe" avec clipsprite() en fonction de mes besoins.
;-j'aurais pu charger plusieurs images pour ne pas avoir à utiliser ClipSprite() !
LoadSprite(#spr_planche,"planche.png")
;-on dessine le décor (c'est dire, tout ce qui est immobile) en utilisant les sprites et les informations du tableau carte(x,y)
ClearScreen(RGB(0,0,0))
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
If carte(x,y)>0;quand carte(x,y)=0, on affiche rien
If carte(x,y)<4;affichage des murs et du sol, caisses, soko,eau non affichés
ClipSprite(#spr_planche,(carte(x,y)-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
Else;si carte(x,y) supérieur ou égal à 4 on affiche le sol à la place
If carte(x,y)=5;caisse rouge, on affiche donc une case arrivée à la place
ClipSprite(#spr_planche,(#but-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
Else
ClipSprite(#spr_planche,(#sol-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
EndIf
EndIf
EndIf
Next x
Next y
;-on prend une "photo" du sprite crée et on l'appelle #spr_decor
GrabSprite(#spr_decor,0,0,largeur_ecran,hauteur_ecran)
;-choix de l'image de départ du personnage "soko"
soko=#soko1
;-choix de l'abscisse de départ de l'image "eau"
x_clip_eau=(#eau-1)*32
;-_________________________________
;-BOUCLE PRINCIPALE
;-_________________________________
Repeat
FlipBuffers() ;voir l'aide pour cette fonction
;-on affiche le décor
DisplaySprite(#spr_decor,0,0)
;-on affiche les éléments restants
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
;-affichage des caisses
If carte(x,y)=#caisse Or carte(x,y)=#caisse_rouge
ClipSprite(#spr_planche,(carte(x,y)-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
EndIf
;-cas de l'eau
If carte(x,y)=#eau
;-animation de l'eau
If ElapsedMilliseconds()-chrono_eau>60
chrono_eau=ElapsedMilliseconds()
x_clip_eau=x_clip_eau+1
If x_clip_eau>(#eau-1+3)*32
x_clip_eau=(#eau-1)*32
EndIf
EndIf
;-affichage de l'eau
ClipSprite(#spr_planche,x_clip_eau,0,32,32)
DisplayTranslucentSprite(#spr_planche,x*32,y*32,128)
EndIf
;-enlevez les points virgules et vous verrez !
; StartDrawing(ScreenOutput())
; DrawText(x*32,y*32,Str(carte(x,y)))
; StopDrawing()
Next x
Next y
;-animation du personnage
If ElapsedMilliseconds()-chrono_soko>500
chrono_soko=ElapsedMilliseconds()
soko=soko+1
;-test pour revenir à la première image
If soko>#soko2
soko=#soko1
EndIf
EndIf
;-affichage du personnage
ClipSprite(#spr_planche,(soko-1)*32,0,32,32)
DisplaySprite(#spr_planche,x_soko*32,y_soko*32)
;-vérification du nombre de caisses placées
compteur=0
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
If carte(x,y)=#caisse_rouge
compteur=compteur+1
If compteur=nbre_caisses
Delay(100)
MessageRequester("Victoire !",Str(nbre_caisses)+" caisses rangées")
;-passage au niiveau suivant
niveau=niveau+1
StopSound(musique)
If niveau=3
niveau=1
EndIf
;-retour au label "jeu:"
Goto jeu
EndIf
EndIf
Next x
Next y
;-gestion du clavier
If ElapsedMilliseconds()-chrono_keyboard>200
ExamineKeyboard()
;-appel de la macro clavier
If KeyboardPushed(#PB_Key_Right)
clavier(1, 0)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Left)
clavier(-1, 0)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Down)
clavier(0, 1)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Up)
clavier(0, -1)
chrono_keyboard=ElapsedMilliseconds()
EndIf
EndIf
Delay(10)
Until WindowEvent() = #PB_Event_CloseWindow
End
;-____________________________
;-FIN DU PROGRAMME PRINCIPAL
;-____________________________
;-____________________________
;-DONNEES SUR LES NIVEAUX
;-____________________________
DataSection
;mur=1;sol=2;but=3;caisse=4;caisse_rouge=5;soko1=6;soko2=7;eau=8
niveau1:
Data.b 1,9,7,3; musique n°1,dimensions 10*8; 3 caisses
Data.b 1,1,1,1,1,0,0,0,0,0
Data.b 1,2,2,6,1,0,0,0,0,0
Data.b 1,2,2,2,1,1,0,0,0,0
Data.b 1,2,4,2,2,1,1,1,1,1
Data.b 1,2,4,2,4,2,2,8,8,1
Data.b 1,1,1,2,2,2,2,3,8,1
Data.b 8,8,1,2,2,2,3,3,2,1
Data.b 8,8,1,1,1,1,1,1,1,1
niveau2:
Data.b 2,11,5,4; musique n°2, dimensions 12*6; 4 caisses
Data.b 1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,8,1,8,1,8,8,2,8,2,8,1
Data.b 1,6,2,2,2,2,8,2,2,2,8,1
Data.b 1,2,4,4,2,2,4,2,4,2,2,1
Data.b 1,2,3,2,3,2,3,2,3,2,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1,1
EndDataSection
Code : Tout sélectionner
;sokoban
;pb v4.41
;Auteur Huitbit
;amélioration des déplacements par Le soldat Inconnu
;une partie des sprites est tirée du site ci-dessous
;http://www.brothersoft.com/games/soukoban.html
;*********************************
;-___________________________________
;-déclaration des variables et des constantes
;-___________________________________
;-L'énumération permet de travailler avec des noms plutôt qu'avec des chiffres
Enumeration
#spr_planche
#mur
#sol
#but
#caisse
#caisse_rouge
#soko1
#soko2
#eau
#spr_decor
EndEnumeration
;-déclaration des variables
niveau.b;numéro du niveau
largeur_niveau.b
hauteur_niveau.b
y.b;variable utilisée pour les lignes du tableau
x.b;variable utilisée pour les colonnes du tableau
type_tuile.b;variable utilisée pour le contenu de la case du tableau
nbre_caisses.b
compteur.b;permet de vérifier si les caisses sont rangées
x_soko.b;colonne où se trouve le personnage
y_soko.b;ligne où se trouve le personnage
soko.b;sprite choisi pour le personnage, soit #soko1, soit #soko2
chrono_soko.i; variable utilisée pour temporiser l'animation du personnage
chrono_keyboard.i;variable utilisée pour temporiser la fonction KeyboardPushed()
largeur_ecran.i
hauteur_ecran.i
x_clip_eau.i;variable utilisée pour découper le sprite "planche" pixel par pixel au niveau de l'eau
chrono_eau.i; variable utilisée pour temporiser l'animation de l'eau
;-_____________________________________________
;- Cette macro "clavier", permet en une seule fois de gérer les quatre directions,
;-il suffit de l'appeler en changeant les valeurs des paramètres direction, dx et dy.
Macro clavier(dx,dy)
;-si la place est libre devant, on avance dans la direction choisie
If carte(x_soko+dx,y_soko+dy)=#sol Or carte(x_soko+dx,y_soko+dy)=#but
x_soko=x_soko+dx
y_soko=y_soko+dy
;-s'il y a une caisse
ElseIf carte(x_soko+dx,y_soko+dy)=#caisse
;-si la place est libre devant la caisse, on peut la pousser
If carte(x_soko+2*dx,y_soko+2*dy)=#sol
carte(x_soko+dx,y_soko+dy)=#sol
carte(x_soko+2*dx,y_soko+2*dy)=#caisse
x_soko=x_soko+dx
y_soko=y_soko+dy
;-si la place libre devant la caisse est un point d'arrivée, on bouge la caisse et on l'affiche en rouge
ElseIf carte(x_soko+2*dx,y_soko+2*dy)=#but
carte(x_soko+dx,y_soko+dy)=#sol
carte(x_soko+2*dx,y_soko+2*dy)=#caisse_rouge
x_soko=x_soko+dx
y_soko=y_soko+dy
EndIf
;-si la caisse poussée est rouge
ElseIf carte(x_soko+dx,y_soko+dy)=#caisse_rouge
;-si on la déplace, on fera apparaître une case arrivée et elle redeviendra de couleur normale
If carte(x_soko+2*dx,y_soko+2*dy)=#sol
carte(x_soko+dx,y_soko+dy)=#but
carte(x_soko+2*dx,y_soko+2*dy)=#caisse
x_soko=x_soko+dx
y_soko=y_soko+dy
;-si on la déplace on fera apparaître une case arrivée et elle restera rouge
ElseIf carte(x_soko+2*dx,y_soko+2*dy)=#but
carte(x_soko+dx,y_soko+dy)=#but
carte(x_soko+2*dx,y_soko+2*dy)=#caisse_rouge
x_soko=x_soko+dx
y_soko=y_soko+dy
EndIf
EndIf
EndMacro
;-on prévient le compilateur que l'on va utiliser les sprites et le clavier
InitSprite()
InitKeyboard()
;-on choisit le niveau de départ
niveau=1
;-"jeu:" s'appelle un label, c'est une adresse, un numéro de ligne où l'on peut renvoyer le programme
jeu:
;-en fonction du niveau, on se place au bon endroit pour lire les informations correspondantes
Select niveau
Case 1
Restore niveau1
Case 2
Restore niveau2
EndSelect
;-lecture des dimensions (en nombre de cases) de la zone de jeu
Read.b largeur_niveau
Read.b hauteur_niveau
;-transformation des dimensions en nombre de pixels, sachant que chaque image fait 32 pixels
largeur_ecran=(largeur_niveau+1)*32
hauteur_ecran=(hauteur_niveau+1)*32
;-lecture du nombre de caisses
Read.b nbre_caisses
;-création du tableau pour y ranger toutes les informations
Dim carte.b(largeur_niveau,hauteur_niveau)
;-utilisation de deux boucles pour remplir le tableau
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
;-lecture des data
Read.b type_tuile
carte(x,y)=type_tuile
;-récupération des coordonnées de départ du personnage
If type_tuile=#soko1
x_soko=x
y_soko=y
carte(x,y)=#sol
EndIf
Next x
Next y
;-______________________
;-PROGRAMME PRINCIPAL
;-______________________
OpenWindow(0,0,0,largeur_ecran,hauteur_ecran,"Sokoban niveau "+Str(niveau),#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,largeur_ecran,hauteur_ecran,0,0,0)
;-on précise le type d'image utilisée
UsePNGImageDecoder()
;-on charge l'image de taille 352*32 pixels
;-Remarque : j'ai choisi une image où tous les sprites sont présents, dans la suite du programme, je la "découpe" avec clipsprite() en fonction de mes besoins.
;-j'aurais pu charger plusieurs images pour ne pas avoir à utiliser ClipSprite() !
LoadSprite(#spr_planche,"planche.png")
;-on dessine le décor (c'est dire, tout ce qui est immobile) en utilisant les sprites et les informations du tableau carte(x,y)
ClearScreen(RGB(0,0,0))
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
If carte(x,y)>0;quand carte(x,y)=0, on affiche rien
If carte(x,y)<4;affichage des murs et du sol, caisses, soko,eau non affichés
ClipSprite(#spr_planche,(carte(x,y)-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
Else;si carte(x,y) supérieur ou égal à 4 on affiche le sol à la place
If carte(x,y)=5;caisse rouge, on affiche donc une case arrivée à la place
ClipSprite(#spr_planche,(#but-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
Else
ClipSprite(#spr_planche,(#sol-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
EndIf
EndIf
EndIf
Next x
Next y
;-on prend une "photo" du sprite crée et on l'appelle #spr_decor
GrabSprite(#spr_decor,0,0,largeur_ecran,hauteur_ecran)
;-choix de l'image de départ du personnage "soko"
soko=#soko1
;-choix de l'abscisse de départ de l'image "eau"
x_clip_eau=(#eau-1)*32
;-_________________________________
;-BOUCLE PRINCIPALE
;-_________________________________
Repeat
FlipBuffers() ;voir l'aide pour cette fonction
;-on affiche le décor
DisplaySprite(#spr_decor,0,0)
;-on affiche les éléments restants
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
;-affichage des caisses
If carte(x,y)=#caisse Or carte(x,y)=#caisse_rouge
ClipSprite(#spr_planche,(carte(x,y)-1)*32,0,32,32)
DisplaySprite(#spr_planche,x*32,y*32)
EndIf
;-cas de l'eau
If carte(x,y)=#eau
;-animation de l'eau
If ElapsedMilliseconds()-chrono_eau>60
chrono_eau=ElapsedMilliseconds()
x_clip_eau=x_clip_eau+1
If x_clip_eau>(#eau-1+3)*32
x_clip_eau=(#eau-1)*32
EndIf
EndIf
;-affichage de l'eau
ClipSprite(#spr_planche,x_clip_eau,0,32,32)
DisplayTranslucentSprite(#spr_planche,x*32,y*32,128)
EndIf
;-enlevez les points virgules et vous verrez !
; StartDrawing(ScreenOutput())
; DrawText(x*32,y*32,Str(carte(x,y)))
; StopDrawing()
Next x
Next y
;-animation du personnage
If ElapsedMilliseconds()-chrono_soko>500
chrono_soko=ElapsedMilliseconds()
soko=soko+1
;-test pour revenir à la première image
If soko>#soko2
soko=#soko1
EndIf
EndIf
;-affichage du personnage
ClipSprite(#spr_planche,(soko-1)*32,0,32,32)
DisplaySprite(#spr_planche,x_soko*32,y_soko*32)
;-vérification du nombre de caisses placées
compteur=0
For y=0 To hauteur_niveau
For x=0 To largeur_niveau
If carte(x,y)=#caisse_rouge
compteur=compteur+1
If compteur=nbre_caisses
Delay(100)
MessageRequester("Victoire !",Str(nbre_caisses)+" caisses rangées")
;-passage au niiveau suivant
niveau=niveau+1
If niveau=3
niveau=1
EndIf
;-retour au label "jeu:"
Goto jeu
EndIf
EndIf
Next x
Next y
;-gestion du clavier
If ElapsedMilliseconds()-chrono_keyboard>200
ExamineKeyboard()
;-appel de la macro clavier
If KeyboardPushed(#PB_Key_Right)
clavier(1, 0)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Left)
clavier(-1, 0)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Down)
clavier(0, 1)
chrono_keyboard=ElapsedMilliseconds()
EndIf
If KeyboardPushed(#PB_Key_Up)
clavier(0, -1)
chrono_keyboard=ElapsedMilliseconds()
EndIf
EndIf
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
Delay(1)
ForEver
;-____________________________
;-FIN DU PROGRAMME PRINCIPAL
;-____________________________
;-____________________________
;-DONNEES SUR LES NIVEAUX
;-____________________________
DataSection
;mur=1;sol=2;but=3;caisse=4;caisse_rouge=5;soko1=6;soko2=7;eau=8
niveau1:
Data.b 9,7,3; dimensions 10*8; 3 caisses
Data.b 1,1,1,1,1,0,0,0,0,0
Data.b 1,2,2,6,1,0,0,0,0,0
Data.b 1,2,2,2,1,1,0,0,0,0
Data.b 1,2,4,2,2,1,1,1,1,1
Data.b 1,2,4,2,4,2,2,8,8,1
Data.b 1,1,1,2,2,2,2,3,8,1
Data.b 0,0,1,2,2,2,3,3,2,1
Data.b 0,0,1,1,1,1,1,1,1,1
niveau2:
Data.b 11,5,4; dimensions 12*6; 4 caisses
Data.b 1,1,1,1,1,1,1,1,1,1,1,1
Data.b 1,8,1,8,1,8,8,2,8,2,8,1
Data.b 1,6,2,2,2,2,8,2,2,2,8,1
Data.b 1,2,4,4,2,2,4,2,4,2,2,1
Data.b 1,2,3,2,3,2,3,2,3,2,2,1
Data.b 1,1,1,1,1,1,1,1,1,1,1,1
EndDataSection