Type-Tutorial für Elefanten (und Anfänger!)

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Propellator

Betreff: Type-Tutorial für Elefanten (und Anfänger!)

BeitragMi, Jan 04, 2012 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Type-Tutorial für Elefanten!

Stell dir vor, du seist ein Elefant im Regenwald. Du stehst vor einem sehr kniffeligen Problem: Vor dir befinden sich sehr viele verschiedene Bananen, und du weisst nicht, welche von denen du als erstes essen sollst. Da du, wie alle Elefanten, ziemlich klug bist, öffnest du also die BlitzBasic IDE um ein Programm zu schreiben, um das Problem zu lösen.
Deine Anforderungen sind Reife und und Grösse der Bananen. Du bist nämlich ein Gourmet-Elefant, und weisst, dass die perfekte Banane 300 Gramm wiegt und satt gelb ist.
user posted image
Künstlerische Darstellung der oben beschriebenen Situation.

Da du alles mit deinem Rüssel tippen musst, und deshalb durch dieses Handicap verlangsamt bist, hast du noch nichts von Types gehört. Deshalb würdest du einfach ein Array mit einer bestimmten Grösse erstellen für jeweils eine Eigenschaft, und dann beide Arrays durchgehen. Die Nummer mit der Farbe Gelb und der Grösse 300 würde dann für dich gewinnen.
Nun ist diese Methode aber etwas schlecht - einerseits musst du dich mit einem Array für jede Eigenschaft rumschlagen, andererseits musst du erst die Bananen zählen um ihre Anzahl zu wissen. (Und Elefanten haben keine Finger fürs Zählen.)

Zum Glück ist Bobo der Bonobo anwesend, und kann dir helfen. Neben allerlei Obszönitäten weiss er nämlich auch mit Types umzugehen, und er ist bereit diese dir beizubringen, sofern er alle grünen Bananen bekommt. (Er ist ein sehr intelligenter Bonobo und legt für die Zukunft an.)

Die Type-Definition
Ein Type ist eine Vorlage - Er gibt an welche Eigenschaften ein Objekt haben kann. Ein Type ist keine Variable, die existiert, Objekte sind Variablen die einem gewissen Type entsprechen.
Klingt kryptisch, ist es aber nicht!
BlitzBasic: [AUSKLAPPEN]
Type TBanane
Field gewicht%
Field farbe$
End Type

Dies wäre die Definition des Typs für Bananen. Wir nennen den Typ hier "TBanane". Eine Banane (ein Objekt) vom Typ TBanane (der Type) kann also die Eigenschaften 'gewicht' (ein Integer, Grammangabe) und 'farbe' (ein String) haben.
Was wir nun haben ist eine Definition für die Eigenschaften einer Banane, aber wir haben noch keine Banane. Das sollten wir ändern!
BlitzBasic: [AUSKLAPPEN]
erstebanane.TBanane = New TBanane

Nun haben wir eine Banane! Das Objekt ist in der Variable "erstebanane" gespeichert. Jedes Objekt hat nun die Eigenschaften des Typs TBanane. Nun können wir der Banane Werte für diese Eigenschaften zuweisen!
BlitzBasic: [AUSKLAPPEN]
erstebanane\gewicht = 300
erstebanane\farbe = "Gelb"

Vor dem Backslash ist das Objekt, nach dem Backslash die Eigenschaft des jeweiligen Objektes. Eigenschaften (Fields) sind nichts anderes als Variablen, die zu einem gewissen Objekt gehören. Das heisst, wenn wir eine zweite Banane erstellen, hat sie eigene Variablen, unabhängig vom ersten Objekt.
Machen wir das doch!
BlitzBasic: [AUSKLAPPEN]
nocheinebanane.TBanane = New TBanane
nocheinebanane\gewicht = 400
nocheinebanane\farbe = "Grün"


Herauszufinden, welche Banane die perfekte Banane ist, und welche an Bobo geht, ist nun noch Trivial. Aber stellen wir uns mal vor, wir hätten 100 Bananen. Ja, machen wir mal 100 Bananen.
BlitzBasic: [AUSKLAPPEN]
For i% = 1 To 100
banane.TBanane = New TBanane
banane\gewicht = Rand(100,600)
farbe% = Rand(1,4)
If farbe = 1 Then
banane\farbe = "Grün"
Else
banane\farbe = "Gelb"
EndIf
Next

In einer For-Schleife werden nun 100 zufällige Bananen erstellt. Die Wahrscheinlichkeit dass die Perfekte Banane unter ihnen ist, ist ziemlich gering, aber wir werden ja herausfinden ob wir sie finden.

Aufmerksame Elefanten haben nun bemerkt, dass wir gar keine Variablen haben die auf alle Bananen-Objekte zeigen. Nicht so schlimm, brauchen wir nicht! Alle Bananen werden im Prinzip ja gleich auf Gewicht und Farbe überprüft.
Aber wie kommen wir nun wieder an die Bananen-Objekte ran?
BlitzBasic erstellt uns automatisch eine Liste aller Bananen! In dieser Liste ist jedes Objekt vom Typ TBanane automatisch verzeichnet, und wir können sie jederzeit mit einer For-Schleife durchgehen. Das Zauberwort ist Each.
BlitzBasic: [AUSKLAPPEN]
For b.TBanane = Each TBanane
Print "Banane mit Farbe " + b\farbe + " und Gewicht " + b\gewicht + " Gramm!"
Next

Nun spuckt unser Programm uns für jede Banane eine Zeile Text aus, die ihre Eigenschaften enthält.
In der Schleife definieren wir das Objekt b, welches bei jedem Schleifendurchlauf auf ein Objekt in der Liste zeigt. Beim ersten Durchlauf ist b das erste Objekt in der Liste, beim Zweiten das zweite, beim Dritten das Dritte und so weiter. Somit gehen wir alle Bananen ein mal durch!
Nun müssen wir nur noch die Bananen überprüfen, und die perfekte Banane essen.
BlitzBasic: [AUSKLAPPEN]
For b.TBanane = Each TBanane
If b\gewicht = 300 And b\farbe = "Gelb" Then
Print "Die Perfekte Banane!"
BananeEssen(b)
ElseIf b\farbe = "Grün" Then
Print "Eine Banane für Bobo."
EndIf
Next

Function BananeEssen(b.TBanane)
Print "Mjam mjam, die perfekte Banane!"
Delete b
End Function

Falls eine Banane 300 Gramm schwer ist und dazu noch Gelb, dann essen wir sie, in dem wir sie der Funktion "BananeEssen" als Parameter übergeben, und sie darin mit Delete löschen. (Da Elefanten ja keine Wiederkäuer sind!)
Ist die Banane Grün, dann sagen wir Bonobo dass es eine Banane für ihn hat.
Tipp: Ihr könnt nicht auf ein Objekt zugreiffen, nachdem es gelöscht wurde. Ist ein Objekt gelöscht, so entspricht in diesem Beispiel b = Null.

Das wärs auch eigentlich schon. Solltet ihr bei dem Beispiel nie auf die perfekte Banane stossen, könnt ihr mit folgender Zeile die Zufallszahlen etwas aufmischen, in dem ihr sie irgendwo vor dem Erstellen der Bananen hineinkopiert.
BlitzBasic: [AUSKLAPPEN]
SeedRnd MilliSecs()


Ich hoffe ich konnte mit diesem einführenden Tutorial helfen!

user posted image
Fröhliches Tröten!
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Triology

BeitragMi, Jan 04, 2012 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Super Tutorial!

Das mit den Arrays sollte doch hoffentlich keine Anspielung auf meine Typefeiniche Codes sein Very Happy
 

bjh

BeitragMi, Jan 04, 2012 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
so ein geniales tutorial Very Happy
jetzt weiß ich auch endlich, wie man das "x"\Type verwendet.

dir auch ein fröhliches tröten propellator. Wink

Tankbuster

BeitragMi, Jan 04, 2012 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Gutes Tut!
Wenn Elefanten das verstehen können, hilft es sicherlich auch den Anfängern Smile
Twitter
Download Jewel Snake!
Windows|Android

Dottakopf

BeitragDo, Jan 05, 2012 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
- Kurz und knackig !
- Alle wensentlichen Inhalte vermittelt!
- Witzig zu lesen
- Toller Einstieg in Types

... Wunderbar Wink


(Eventuell noch ein Satz für was man Types in der Spieleentwicklung braucht. Ich hatte damals das Problem das immer alle von Types geredet haben, ich aber nicht verstanden habe für was genau die gebraucht werden..)
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Silvio

BeitragSo, Feb 19, 2012 6:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe es nicht richtig. In der For-Schleife werden 100 neue Bananen erstellt, aber heißen die Bananen alle gleich? Wie kann ich die denn Unterscheiden?
Und wie kann ich einzelne Objekte löschen?

Tankbuster

BeitragSo, Feb 19, 2012 6:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst zum Beispiel eine neue Type-Variable anlegen, das eine ID beinhaltet.

BlitzBasic: [AUSKLAPPEN]
Type irgendwas
Type irgendwas
Field ID ;HIER!
Field x,y
Field Breite
Field sonstwas$
End Type

SeedRnd(MilliSecs())

For i=1 To 100
BLUB.irgendwas = New irgendwas
BLUB\ID=i ;Die verschiedenen Type-Instanzen werden nach i nummeriert, also von 1 bis 100
BLUB\x=Rnd(100)
BLUB\y=Rnd(100)
BLUB\Breite=Rnd(100)
BLUB\sonstwas="blubub"+Str(Rnd(100))
Next

GesuchteInstanz=12


For BLUB.irgendwas = Each irgendwas
If BLUB\ID=GesuchteInstanz ;Nur, wenn die ID=12 werden die Eigenschaften ausgegeben.
Print "ID: "+Str(BLUB\ID)
Print "x: "+Str(BLUB\x)
Print "y: "+Str(BLUB\y)
Print "Breite: "+Str(BLUB\Breite)
Print "sonstwas: "+Str(BLUB\sonstwas)

BLUB\x=BLUB\x+1 ;so lässt sich auch ein wert der instanz verändern.
EndIf
Next


WaitKey()
End

Twitter
Download Jewel Snake!
Windows|Android

Propellator

BeitragSo, Feb 19, 2012 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
...was aber völlig sinnlos ist, da die Type-Instanz bereits die gesamte ID-Funktion übernimmt. Es würde mehr Sinn machen die Dinger einfach in ein Array abzulegen, anstatt die gesamte Liste durchzugehen für einen bestimmten ID-Eintrag.
Je nach Anwendung musst du auch überhaupt nicht wissen welche bestimmte Instanz du ansprichst, sondern nur was für Eigenschaften dass sie hat.
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group