Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 05 Jui 2011, 19:03
Bonjour,bonsoir,
Je vous poste ici un sokoban que j'ai créé hiers soir et aujourd'hui.
Il se lance avec le programme SOKO. La première fois que vous le lançez, sélectionnez "AUTRE NIVEAU" et entrez 1. vous vous déplacez avec les flèches, quittez avec annul (si vous choisisais se sauvegarder, la sauvegarde ne reste valide que tans que vous ne modifiez pas la matrice [A] et que vous ne jouez pas une autre partie de sokoban ; elle doit être rappelée au lancement en choisissant "CHARGER SAUV". Attention, par soucis de fluidité, le programme ne test si vous avez gagnés qu'à l'appuis sur [entrer].
Vous pouvez créer vos propres niveaux (n'hésittez pas à les poster) en créant une matrice dont les dimmentions correspondent au nombre de tuiles, de la remplir de 0 (fonction "Remplir(0,[A])" ou "fill(0,[A])" pour les TI en anglais), de placer pour chaque tuile initiallement occupée :
6 si c'est un mur
5 si c'est une caisse sur un objectif
4 si c'est vous sur un objectif
3 si c'est un objectif seul
2 si c'est une caisse seule
1 si c'est vous seul
0 si c'est vide
Ensuite rajoutez, dans les 2 lignes vides de CHOIXNIV (issérez en d'autres à cet endroit pour avoir assez de place,
Code
If [théta]=Nombre //Nombre est à remplacer par un nombre entier et positif
Then
[rapeler ici la matrice où vous avez placés les code des tuiles] -> [A] //vous pouvez enlever le "]]" de la fin
[abscice du personnage en tuiles (4*4 pixels) ] -> X
[ordonnée du personnage en tuiles (4*4 pixels) ] -> Y
Return
End
Full
FnOff
PlotsOff
GridOff
AxesOff
LabelOff
ExprOff
0 -> Xmin
94 -> Xmax
-62 -> Ymin
0 -> Ymax
While 1
Lbl CN
prgmCHOIXNIV
ClrDraw
dim([A] -> L1
For(A,1,L1(1
For(B,1,L1(2
If 1=[A](A,B:Then:A -> Y:B -> X:End
prgmSOKOAFF
End
End
Lbl C
X -> S
Y -> T
1 -> Z
While Z
Repeat K=24 or K=25 or K=26 or K=34 or K=45 or K=105
getKey -> K
End
If K=45:Goto Q
If K=105:prgmSOKOVICT
Y-(K=25)+(K=34 -> T
X+(K=26)-(K=24 -> S
If 6[différend de][A](T,S
Then
If 3=[A](T,S) or not([A](T,S
Then
[A](Y,X)-1[différend de] [A](Y,X
S -> X
TüY
1+[A](Y,X -> [A](Y,X
Else
If (2=[A](T,S) or 5=[A](T,S)) and (3=[A](2T-Y,2S-X) or not([A](2T-Y,2S-X
Then
[A](T,S)-1 -> [A](T,S
[A](Y,X)-1 -> [A](Y,X
2+[A](2T-Y,2S-X -> [A](2T-Y,2S-X
S -> X
T -> Y
End
End
If K=25 or K=34:Then
For(C,4X-4,4X-1
Line(C,8-4Y,C,ú=-3-4Y,0
End
Y -> A:X -> B:prgmSOKOAFF
Y+1 -> A:prgmSOKOAFF
Y-1 -> A:prgmSOKOAFF
End
If K=24 or K=26:Then
For(C,1-4Y,4-4Y
Line(4X-8,C,4X+3,C,0
End
Y -> A:X -> B:prgmSOKOAFF
X+1 -> B:prgmSOKOAFF
X-1 -> B:prgmSOKOAFF
End
Y -> A:X -> B:prgmSOKOAFF
X-1 -> B:prgmSOKOAFF
X+1 -> B:prgmSOKOAFF
Y+1 -> A:X -> B:prgmSOKOAFF
Y-1 -> A:prgmSOKOAFF
End
End
End
Lbl Q
Menu("","CONTINUER",C,"QUITTER",QQ,"SAUVER+QUITTER",Q2,"CHANGER DE NIV",CN
Lbl Q2
{A,B,C,N,O,S,T,X,Y,Z,[théta] -> ListeSOKO
Goto Q3
Lbl QQ
DelVar [A]ClrList L1
{0 -> ListeSOKO
Lbl Q3
ClrDraw
AxesOn
ExprOn
ZStandard
FnOn
ClrHome
"
Voici CHOIXNIV, le programme ou sont enregistrés les niveaux. (CHOIXNIV.83p)
Code
Lbl AN
Input "NIVEAU N°",[théta]
iPart(abs([théta] -> [théta]
Lbl NA
If [théta]=1
Then
[[0,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0][0,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0][0,0,0,0,6,2,0,0,6,0,0,0,0,0,0,0,0,0,0][0,0,6,6,6,0,0,2,6,6,0,0,0,0,0,0,0,0,0][0,0,6,0,0,2,0,2,0,6,0,0,0,0,0,0,0,0,0][6,6,6,0,6,0,6,6,0,6,0,0,0,6,6,6,6,6,6][6,0,0,0,6,0,6,6,0,6,6,6,6,6,0,0,3,3,6][6,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,3,3,6][6,6,6,6,6,0,6,6,6,0,6,1,6,6,0,0,3,3,6][0,0,0,0,6,0,0,0,0,0,6,6,6,6,6,6,6,6,6][0,0,0,0,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0 -> [A]
12 -> X
9 -> Y
Return
End
If [théta]=2
[[6,6,6,6,6,6,6,6,6,6,6,6,0,0][6,3,3,0,0,6,0,0,0,0,0,6,6,6][6,3,3,0,0,6,0,2,0,0,2,0,0,6][6,3,3,0,0,6,2,6,6,6,6,0,0,6][6,3,3,0,0,0,0,1,0,6,6,0,0,6][6,3,3,0,0,6,0,6,0,0,2,0,0,6][6,6,6,6,6,6,0,6,6,2,0,2,0,6][0,0,6,0,2,0,0,2,0,2,0,2,0,6][0,0,6,0,0,0,0,6,0,0,0,0,0,6][0,0,6,6,6,6,6,6,6,6,6,6,6,6 -> [A]
5 -> Y
8 -> X
Return
End
If [théta]=3
Then
[[0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0][0,0,0,0,0,0,0,0,6,0,0,0,0,0,1,6,0][0,0,0,0,0,0,0,0,6,0,2,6,2,0,6,6,0][0,0,0,0,0,0,0,0,6,0,2,0,0,2,6,0,0][0,0,0,0,0,0,0,0,6,6,2,0,2,0,6,0,0][6,6,6,6,6,6,6,6,6,0,2,0,6,0,6,6,6][6,3,3,3,3,0,0,6,6,0,2,0,0,2,0,0,6][6,6,3,3,3,0,0,0,0,2,0,0,2,0,0,0,6][6,3,3,3,3,0,0,6,6,6,6,6,6,6,6,6,6][6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0 -> [A]
15 -> X
2 -> Y
Return
End
If [théta]=4
Then
[[0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6][0,0,0,0,0,0,0,0,0,0,0,6,0,0,3,3,3,3,6][6,6,6,6,6,6,6,6,6,6,6,6,0,0,3,3,3,3,6][6,0,0,0,0,6,0,0,2,0,2,0,0,0,3,3,3,3,6][6,0,2,2,2,6,2,0,0,2,0,6,0,0,3,3,3,3,6][6,0,0,2,0,0,0,0,0,2,0,6,0,0,3,3,3,3,6][6,0,2,2,0,6,2,0,2,0,2,6,6,6,6,6,6,6,6][6,0,0,2,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0][6,6,0,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0][6,0,0,0,0,6,0,0,0,0,6,6,0,0,0,0,0,0,0][6,0,0,0,0,0,2,0,0,0,6,6,0,0,0,0,0,0,0][6,0,0,2,2,6,2,2,0,0,1,6,0,0,0,0,0,0,0][6,0,0,0,0,6,0,0,0,0,6,6,0,0,0,0,0,0,0][6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0 -> [A]
12 -> Y
11 -> X
Return
End
ClrHome
Pause "NIVEAU INEXISTANT
Goto 1
Voici SOKOAFF (le programme qui gère l'affichage des tuiles SOKOAFF.83p
Code
4A -> O
4B -> N
If 6=[A](A,B
Then
Line(N-1,1-O,N-4,4-O
Line(N-3,1-O,N-4,2-O
Line(N-1,3-O,N-2,4-O
End
If 2=[A](A,B
Then
Pt-On(N-3,3-O
Pt-On(N-3,3-O,2
End
If 3=[A](A,B
Pt-On(N-3,3-O
If 5=[A](A,B
Pt-On(N-3,3-O,2
If 1=[A](A,B) or 4=[A](A,B
Pt-On(N-3,3-O,3
Et enfin le dernier sous-programme, SOKOVICT qui sert à vérifier les victoires (
#SOKOVICT.83p)
Code
ClrHome
Output(3,3,"VERIFICATION DE VICTOIRE EN COURS
0 -> Z
For(A,1,L1(1
For(B,1,L1(2
If 2=[A](A,B
1 -> Z
End
End
ClrHome
If not(Z:Output(4,2,"NIVEAU REUSSIT
If Z:Output(4,1,"VOUS DEVEZ VOUS TROMPER!
Pause
DispGraph
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 06 Jui 2011, 18:23
J'édite mon premmier programme pour rajouter les 2 sous-programmes manquants et pour rajouter les consignes d'utilisation et de création de niveau (malheureusement sans éditeur, direct les matrices).
Sandro
EDIT : je ne crois pas qu'un :2 -> [A](12,13 soit plus intéréssant : ça fait de 9 à 11 octés pour une tuile et ça complique la fabrication du niveau, après, si tu as le courage de créer le niveau comme ça (déjà que ça prend du temps avec la méthode de la matrice), n'ésite pas à le poster, on pourra comparer le résultat.
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 06 Jui 2011, 21:04
Possible que l'on gagne un peu de place, mais celà ralentirrait le programme et rendrait très compliqué la création d'un niveau : il ne suffit plus de faire juste le dessin sur une feuille à carreaux et de remplacer chaque élément par son numérau.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 06 Jui 2011, 21:12
Pour un jeux de type mario, c'est peut-être adapté, mais pour un sokoban, il faut beacoup de niveaux car on ne les rejoue pas plus de 2-3 fois et il est bien plus rapide de créer les niveaux par la méthode expliquée au premier niveau, méthode qui prend au max 800 octés par niveau.
Merci quand même
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mar 07 Jui 2011, 8:07
oui sauf que chaque niveau avait probablement un "scénario", alors que pour le Sokoban il ne s'agit que des positions des tuiles non vides, donc pas de mouvements cycliques à programmer.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes