Zuerst:
Es gibt 6 verschiedene Block-Typen:
Hard-Block: Snake kann nicht durch laufen
Brücken-Block: Snake kann durch laufen
Rampe-Rechts: Eine Rampe, die auf der linken Seite unten und auf der rechten hoch.
Rampe-Runter: Eine Rampe, die auf der oberen Seite unten und auf der unteren hoch.
Rampe-Links: Eine Rampe, die auf der rechten Seite unten und auf der linken hoch.
Rampe-Hoch: Eine Rampe, die auf der unteren Seite unten und auf der oberen hoch.
Die Engine von Jippy Snake 8 hat 6 Ebenen (Im folgenden Layer genannt):
Layer -1: Hintergrund. Snake kann diese nichr betreten
Layer 0: Der unterste Layer in der Snake sich befinden kann
Layer 1: Der Layer direkt über Layer 0.
Layer 2: Der Layer direkt über Layer 1.
Layer 3: Der Layer direkt über Layer 2.
Layer 4: Der Layer direkt über Layer 3.
In jedem Layer kann jeder Block-Typ gesetz werden. Abr ein Rampen-Typ in Layer -1 und 4 macht keinen Sinn.
Jeder Platz, den Snake betreten können soll, muss einen Brücken-Block haben. Über jeder Rampe, die benutz werden können soll, muss ein Brücken-Block sein.
Die folgenden Scetche nutzen folgende Achsen:
X Beliebige Bewegungsrichtung
Y Die Layers
Ein paar Beispiele:
"/" Meint ein Rampen-Block
"#" Meint ein Hard-Block
" " Meint ein Brücken-Block
Richtig: | | Falsch: |
^ #######
| ###
Y | /###
| #######
O-------->
X
|
|
^ #######
| ####
Y | /###
| #######
O-------->
X
|
In den nächsten Scetchen werden die Achsen nicht eingezeichnet
Texturnummern:
Dieser Abschnitt ist nur für die jenigen interessant, die Level manuell editieren wollen, oder eigene Texturen hinzufügen wollen.
Jeder Textur hat eine Nummer. Die Nummer legt fest, welcher Block-Typ die Textur zugeordnet ist:
Sei N die Nummer der Textur:
Wenn N%6 == 0: Die Texturnummer ist ein Hard-Nlock
Wenn N%6 == 1: Die Texturnummer ist ein Brücken-Block
Wenn N%6 == 2: Die Texturnummer ist ein Rampe-Rechts
Wenn N%6 == 3: Die Texturnummer ist ein Rampe-Runter
Wenn N%6 == 4: Die Texturnummer ist ein Rampe-Links
Wenn N%6 == 5: Die Texturnummer ist ein Rampe-Rauf
Wie Snake zwischen den Layern wechselt:
Nach oben:
Wenn Snake in einem Rampen-Typ reinlauft gibt es zwei möglichkeiten:
1. Die Bewegungsrichtung und die richtung der Rampe passen nicht -> Tod.
2. Die Bewegungen passen. Snake wird um eine Ebene angehoben
Scetchshow:
">" Kopf von snake
"[" Ende von snake
"o" Körpe von snake
#######
###
o> /###
#######
| |
#######
###
oo>/###
#######
| |
#######
###>
[oo/###
#######
| |
#######
###o>
[o/###
#######
| |
#######
###oo>
[/###
#######
| |
#######
###[oo>
/###
#######
| |
#######
### [oo
/###
#######
|
Nach unten:
Die EINZIGE Möglichkeit eine Ebene Tiefer zu kommen ist über die Rampen. Snake kann nciht herunter fallen.
Die folgende Scetchshow zeigt, wie Snake sich nach unten bewegt.
"<" Kopf von snake
"]" Ende von snake
#######
### <oo
/###
#######
| |
#######
###<oo]
/###
#######
| |
#######
###oo]
</###
#######
| |
#######
###o]
<o/###
#######
| |
#######
###]
<oo/###
#######
| |
#######
###
oo]/###
#######
| |
#######
###
o] /###
#######
|
Beachte diese Scetchshow, wenn zwei Brücken.Typen übereinander gestapelt sind:
#######
o>
## ##
#######
| |
#######
oo>
## ##
#######
| |
#######
[oo>
## ##
#######
| |
#######
[oo>
## ##
#######
| |
#######
[oo>
## ##
#######
| |
#######
[oo>
## ##
#######
| |
#######
[oo
## ##
#######
| |
#######
[o
## ##
#######
|
Das gilt auch für die unsichbare Brücke!!!
Bewegen von einem Block-Typ zum anderen:
Da sich snake grunsätzlich in einem Brüclen-kopf befindet, ist hier die Rede, von dem Block, der direkt unter Snake sitzt.
Snake kann sich zwischen Hard/Brücken-Block <-> beliegen Rampen-Typ bewgen, wenn die richtungen passen; Sonst stirbt Snake
Snake kann sich bewegen:
Rampe-Rechts <-> Rampe-Links
Rampe-Runter <-> Rampe-Rauf
Rampe-X <-> Rampe-X Bei bestimmten Bedingunen(X steht für "Rechts", "Runter", "Links" oder "Rauf")
Andere Kobinationen sind nicht möglich. Bei versuch stirbt Snake.
Siehe diese Scetchshows für die Rampe-X <-> Rampe-X Bedingunen
#######
###
## /###
o>/####
#######
| |
#######
###
##>/###
oo/####
#######
| |
#######
###>
##o/###
[o/####
#######
|
Funktioniert. Auch in der anderen richtung.
#######
##
o>//###
#######
| |
#######
##>
oo//###
#######
| |
#######
##o>
[o//###
#######
|
Snake stirbt. Auch in der anderen Richtung.
Snake kann auch von Rampe-H<->Rampe-H (H steht für "Rechts" oder "Links") bewegen, wenn die
Bewegungsrichtung "Rauf" oder "Runter ist".
Snake kann auch von Rampe-V<->Rampe-V (H steht für "Runter" oder "Rauf") bewegen, wenn die
Bewegungsrichtung "Rechts" oder "Links".
Die Sache mit den neuen Äpfeln:
Zu beginn eines Levels werden 'Äpfel zu beginn' neue Äpfel platziert. (Runde 0)
Sobald man 'Startwert für Äpfel bis neue' gesammelt hat, beginnt die nächste Runde. Dabei wird
zuerst festgestellt
wieviele Äpfel dazu kommen (Mit Hilfe von 'Funktion für neue Äpfel'),
und
Wieviele man jetzt sammeln muss, bis weitere kommen (Mit Hilfe von 'Funktion für Äpfel bis neue').
Dabei werden folgende Vatriablen gesetzt:
prev: Der letzte Wert der entsprechenden funktion (Bei der ersten Berechnung der Funktion ist es 'Äpfel zu beginn' bzw: 'Startwert für Äpfel bis neue')
apples: Die Anzahl der gesammelten Äpfel
rnd: Die aktuelle Runde
Der startwert ist 0
Bevor die Funktionen berechnet wird, wird rnd um 1 erhöht.
ACHTUNG: Bei den Funktionen wird Punkt vor Strich NICHT beachtet!!!
Folgende Operationen können einsetzt werden:
+ (Addition)
- (Substaktion)
* (Multiplikation)
/ (Division)
< (Wenn a kleiner ist als b ergibt a<b 1; sonst 0)
= (Wenn a gleich b ist ergibt a=b 1; sonst 0)
Sollte der Wert einer Funktion Negativ sein, wird als ergebnis 0 angegeben.
Beispiele:
Äpfel zu beginn: 1
Startwert für Äpfel bis neue: 1
Funktion für neue Äpfel: prev
Funktion für Äpfel bis neue: prev
Das ergibt ein klassisches Snake
Äpfel zu beginn: 1
Startwert für Äpfel bis neue: 1
Funktion für neue Äpfel: rnd+1
Funktion für Äpfel bis neue: rnd+1
Jede Runde gibt es einen Apfel mehr zu sammeln
Äpfel zu beginn: 1
Startwert für Äpfel bis neue: 1
Funktion für neue Äpfel: 2
Funktion für Äpfel bis neue: prev
Für jeden Apfel der gesammelt wird, kommen gleich zwei dazu.
Äpfel zu beginn: 64
Startwert für Äpfel bis neue: 2
Funktion für neue Äpfel: 1
Funktion für Äpfel bis neue: 2
Für alle zwei Äpfel, die gesammelt werden kommt 1 dazu. Hier kann man nur endlich viele Äpfel sammeln
Äpfel zu beginn: 10
Startwert für Äpfel bis neue: 10
Funktion für neue Äpfel: ((1<prev)*(prev-1))+((1=prev)*10)
Funktion für Äpfel bis neue: ((1<prev)*(prev-1))+((1=prev)*10)
Hier gibt es erst 10, dann 9, dann 8, ..., dann 1, dann wieder 10, dann 9, ...
Also ein 10-1 Zyklus
Äpfel zu beginn: 15
Startwert für Äpfel bis neue: 15
Funktion für neue Äpfel: ((apples<120)*(prev-1))+(119<prev)
Funktion für Äpfel bis neue: ((apples<120)*(prev-1))+(119<prev)
Hier gibt es erst 15, dann 14, dann 13, ..., dann 1, dann 1, dann 1
Mathematisches:
Sei a_n die Anzahl der Äpfel, die zu Beginn einer Jeden Runde erscheinen
a_0 = 'Äpfel zu beginn'
Sei b_n die Anzahl der Äpfel, die in Jedee Runde gesammelt werden müssen
b_0 = 'Startwert für Äpfel bis neue'
Dann kann man def:
c_n : Die Anzahl der Äpfel die am Ende einer Jeden Runde noch auf dem Spielfeld liegen
Klar ist: c_0 = a_0-b_0
Und c_{n+1} = c_n+a_{n+1}-b_{n+1}
Darauf ergibt sich:
c_n = Sum_{i=0}^{n}(a_i)-Sum_{i=0}^{n}(b_i)
c_n solle konvergent sein und für alle c_n MUSS gelten: c_n >= 0,
da sonst Runde n+1 nie erreicht wird.
Hinweis: in der Paxis, kann es passiern, dass c_n nicht der def entspricht.
Das liegt daran, dass das Spielfeld nur endlich viel platz hat. Aber in der Theorie sollten die Bedingungen schon gelten.
Beispiel:
Äpfel zu beginn: 2
Startwert für Äpfel bis neue: 1
Funktion für neue Äpfel: prev+1
Funktion für Äpfel bis neue: prev+1
Dieses Level wird immer mehr Äpfel enthalten.
Beweis:
a_0 = 2, b_0 = 1, c_0 = 1
a_{n+1} = a_n+1
b_{n+1} = b_n+1
=>
... Spiel
... Leveleditor
a_n = n+2
b_n = n+1
=>
c_{n+1} = c_n+a_{n+1}-b_{n+1}
= c_n+((n+1)+2)-((n+1)+1)
= c_n+(n+3)-(n+2) = c_n+n+3-n-2 = c_n+1
=>
c_n = n+1
qed.
In einigen Fällen ist es schwer die a_n bzw b_n zu definieren.
In solchen Fällen kann man auch mit tabellen arbeiten:
Beispiel von oben:
Runde | Äpfel die dazkommen | Äpfel zu Beginn der Runde | Zu sammelde Äpfel | Äpfel auf dem Ende am ende der Runde |
0 | 2 | 2 | 1 | (2-1) = 1 |
1 | 3 | 4 | 2 | 2 |
2 | 4 | 6 | 3 | 3
|
3 | 5 | 8 | 4 | 4 |
4 | 6 | 10 | 5 | 5 |
5 | 7 | 12 | 6 | 6 |
6 | 8 | 14 | 7 | 7 |
Kompilizierteres Beispiel:
Äpfel zu beginn: 5
Startwert für Äpfel bis neue: 3
Funktion für neue Äpfel: ((1<prev)*(prev-1))+((1=prev)*5)
Funktion für Äpfel bis neue: ((1<prev)*(prev-1))+((1=prev)*5)
Runde | Äpfel die dazkommen | Äpfel zu Beginn der Runde | Zu sammelde Äpfel | Äpfel auf dem Ende am ende der Runde |
0 | 5 | 5 | 3 | 2 |
1 | 4 | 6 | 2 | 4 |
2 | 3 | 7 | 1 | 6 |
3 | 2 | 8 | 5 | 3 |
4 | 1 | 4 | 4 | 0 |
5 | 5 | 5 | 3 | 2 |
6 | 4 | 6 | 2 | 4 |
7 | 3 | 7 | 1 | 6 |
8 | 2 | 8 | 5 | 3 |
9 | 1 | 4 | 4 | 0 |