Variablen Verwendung für Anfänger

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Midimaster

Betreff: Variablen Verwendung für Anfänger

BeitragDi, Dez 22, 2009 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Dies ist ein Tutorial für blutige Anfänger. Es erklärt was Variable sind und welche Typen es gibt. Außerdem gibt es Tipps zur Namensgebung und ob und wie man sie GLOBAL oder LOKAL einsetzt.

(Ich bitte alle, sich mit eigenen Einträgen rauszuhalten und dafür lieber den Thread "Kritik an Midimaster-Tutorials" zu nutzen. Dieses Tutorial soll den Anfänger möglichst durch keine Diskussionen irritieren.) Kritik hier hin: Kritik-Thread

Allen Anfängern lege ich wärmstens ans Herz dieses Tutorial durchzuarbeiten. Es spart euch viele Fehler in späteren Programmen. Fragen von Hilfesuchenden bitte ins BB-Beginners-Corner (https://www.blitzforum.de/forum/viewforum.php?f=18), aber auf keinen Fall hier hin posten!

Das Tutorial ist didaktisch konzipiert aufgebaut. Die Lektionen bauen aufeinander auf. Die Befehle werden nie vollständig erklärt, sondern immer nur soweit man es für diese Lektion unbedingt braucht.


Lektion I: Was ist eine Variable und wie nenn ich sie. Arrow zur Lektion I

Lektion II: Zusammenzählen von Variablen Arrow zur Lektion II

Lektion III: Namensgebung von Variablen Arrow zur Lektion III

Lektion IV: GLOBAL oder LOCAL? Variablen in Funktionen Arrow zur Lektion IV

Lektion V: Listen und Felder sind Arrays Arrow zur Lektion V

Lektion VI:Weitere TYPEN von Variablen Arrow zur Lektion VI
  • Zuletzt bearbeitet von Midimaster am Do, Jan 07, 2010 10:57, insgesamt 13-mal bearbeitet

Midimaster

Betreff: Was ist eine Variable und wie nenne ich sie

BeitragDi, Dez 22, 2009 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Variable ist ein Platzhalter für Zahlen oder Texte am Computer. So kannst Du schreiben....
BlitzBasic: [AUSKLAPPEN]
Print 123

oder eben auch
BlitzBasic: [AUSKLAPPEN]
A=123
Print A


A dient also als Platzhalter für die Zahl 123. Wenn Du Dich gerade fragst, warum der Computer keine "A" angezeigt hat, oder wie man dann den Buchstaben "A" auf dem Monitor anzeigen lässt, dann bist Du schon voll drin im Variablen-Tutorial.

Variablen-Typen

Das A auf den Bildschirm zu bringen ist ganz leicht:
BlitzBasic: [AUSKLAPPEN]
Print "A"

Anführungszeichen sind eine Anweisung an den Computer, dass es sich um Zeichenketten handelt. Nun gibt der Computer nicht den Inhalt einer Variablen A aus, sondern die Zeichenkette "A". Zeichenkette deshalb, weil es auch möglich ist mehrere Zeichen auszugeben:
BlitzBasic: [AUSKLAPPEN]
Print "ABC"

Natürlich lassen sich auch Zeichenketten durch eine Variable ersetzen:
BlitzBasic: [AUSKLAPPEN]
A$="123"
Print A


Es scheint also 2 verschiedene Variablen-Typen zu geben: Solche für Zahlen und solche für Texte. Um eine Variable nun eindeutig für einen Typ festzulegen werden kleine Zusatzzeichen im Variablennamen verwendet. Du kannst diese Zusätze immer mit schreiben, oder nur 1x bei der ersten Verwendung. Dies ist Dir überlassen.

BlitzBasic: [AUSKLAPPEN]
A%=123
B$="ABC"
Während das Prozent-Zeichen für Zahlen steht, verwendest Du das Dollar-Zeichen für Zeichenketten.

Zu letzt noch ein Wort zum guten Programmierstil. Gewöhne Dir gleich an alle verwendeten Variablen am Anfang Deines Codes zu definieren. Dafür sorgt der Befehl GLOBAL
BlitzBasic: [AUSKLAPPEN]
Global A%
Global B$
A=123
B="ABC"
Print A
Print B
  • Zuletzt bearbeitet von Midimaster am Mo, Dez 28, 2009 17:30, insgesamt 2-mal bearbeitet

Midimaster

Betreff: Zusammenzählen von Variablen

BeitragDi, Dez 22, 2009 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Variablen dienen vor allem dafür, die Werte (z.B. 123) durch das ganze Programm hindurchtransportieren zu können. Während des Programms wird mit ihnen gerechnet, sie selbst werden verändert, etc...

Das könntest Du mit der 123 nicht machen. Schreibe ein Programm, das zur 123 5 dazuaddiert und dann das Ergebnis verdoppelt. So etwas ist in einer Zeile schon möglich, aber verteilt auf mehrere Stellen im Programm?
BlitzBasic: [AUSKLAPPEN]
Print (123+5) * 2

und mit Variablen:
BlitzBasic: [AUSKLAPPEN]
Global A%, B%, C%
A=123
B=5
C=2
Print (A+B) * C

und jetzt in mehreren Zeilen:
BlitzBasic: [AUSKLAPPEN]
Global A%, B%, C%
A=123
B=5
C=2
A= A + B
A= A * C
Print A


Die 5.Zeile A= A + B scheint mathematisch völliger Blödsinn zu sein! A kann nie A+5 sein! Aber es handelt sich auch nicht um ein mathematisches "="-Zeichen, sondern der Computer denkt dabei an "sei ab jetzt" (??) Ja:

Zitat:
"A sei ab jetzt A+5"


Der Befehl verändert also A, indem er es durch 123+5 ersetzt. Nach dieser Aktion ist A wirklich zu 128 geworden. Die letzte Zeile ist im Prinzip das gleiche: "A sei ab jetzt A*2" Da A gerade 128 ist, wird es nun zu 256

Addieren von Texten

Ganz anders verhält sich der Computer, wenn er Zeichenketten zu verarbeiten hat:
BlitzBasic: [AUSKLAPPEN]
Global A$, B$
A="123"
B="5"
A= A + B
Print A

Hier wird nicht die 5 zur 123 addiert, sondern die 5 als Zeichen an die Zeichen 123 angehängt. Das Ergebnis ist also 1235.


Versuche abschließend, dieses Beispiel zu verstehen:

BlitzBasic: [AUSKLAPPEN]
Global A$, B$, C%
A="Dein Name"
C=18
C=C+10
B= A + " wird in 10 Jahren "
Print B + C + " sein"
  • Zuletzt bearbeitet von Midimaster am Mo, Dez 28, 2009 17:32, insgesamt 2-mal bearbeitet

Midimaster

Betreff: Namensgebung von Variablen

BeitragDi, Dez 22, 2009 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Du siehst können Variablen durch Buchstaben benannt werden:
Code: [AUSKLAPPEN]
A=123

Es ist aber möglich Namen mit mehr als einem Zeichen zu vergeben. Besser noch gibst Du den Variablen sinnvolle Namen. Dadurch wird der Code sehr verständlich und kann später hier in den Foren auch von anderen verstanden werden.
Code: [AUSKLAPPEN]
Punkte=123

Theoretisch ist jede Buchstabenkombination möglich und auch die Länge des Namens spielt keine Rolle.

Mögliche Namen sind z.B.:

Zitat:
- X Y i j mm jjj
- gjeirhv sdglkdve f_d_ddf
- MupBas ConOff xTot
- Punkte Hans Speed Fall2
- X_Abstand Variante_A loc_Bild
- WindVonRechtsStaerke SpielerName KleinerBaumBild ExplosionsSound

Wie Du schon siehst: alles ist möglich, doch einige der Namen sagen Dir jetzt schon mehr über das, was wahrscheinlich in dieser Variable steht.

Dabei haben sich in den letzten Jahren unterschiedliche Empfehlungen verbreitet. Du solltest aber die Namen immer so vergeben, wie sie Dir am sinnvollsten erscheinen. Grundsätzlich sollen sie immer das GUT beschreiben, wofür sie stehen.

folgende Empfehlungen sind daher von mir:

Bildschirm-Koordinaten werden mit X Y und Z beschrieben. Verwende also diese Zeichen nur, wenn es wirklich um Koordinaten geht. eine Mauskoordinate könnte z.B. MausX heißen, die aktuelle Position PosX, ZSpeed für eine Geschwindigkeit in Z-Richtung, usw....

Kleine Zählvariablen, nur kurz benötigte Variablen heißen gerne i oder j. Verwende diese Namen deshalb nie für bedeutende Variablen im Programm. Einer, der den Code liest, könnte ihre Bedeutung übersehen.

Bedeutende Variablen bekommen komplette Worte oder werden aus mehreren Wortteilen zusammengesetzt, wobei der Wortanfang immer groß geschrieben wird. z.B. SpielerName. Warum dies? Weil es meist in dem Spiel auch SpielerPunkte, SpielerLeben, SpielerX SpielerY gibt und die Variablen so schneller vom Auge erfasst werden können. Vergleiche selbst:

Code: [AUSKLAPPEN]
spielername,spielerpunkte,spielerleben,spielerx,spielery

SpielerName,SpielerPunkte,SpielerLeben,SpielerX,SpielerY

Die Groß- und Kleinschreibung spielt in allen Blitz-Dialekten keine Rolle, aber es gibt Sprachen, die darauf achten, also gilt: Bleib innerhalb des Programms bei der Schreibweise, mit der Du die Variable eingeführt hast. Verwende keine zwei Variablennamen, die sich nur durch die Schreibweise unterscheiden z.B. Gut, gut und guT.

Englisch oder Deutsch
Das ist egal. Wenn Du das Spiel in einem englischen Forum zur Diskussion stellen willst oder später einzelne Routinen veröffentlichen möchtest, mag Englisch hilfreich sein.

Ich halte es so, dass meine Variablen alle deutsche Namen haben, so kann ich sie gut von Code unterscheiden, den ich von Dritten erhalten und eingefügt habe.

Typ-Deklarierung

Werde neue Variablentypen deklariert, dann stellt man durch den Namenszusatz -TYP oder T- immer klar, dass es sich hier um eine Typdeklaration handelt. Verwende also für Variablen keine Namen wie LustigerTyp oder TPanzer, damit Dritte deinen Code gut lesen können. Für Typ-Deklaration verwende immer -TYP oder T-

BlitzBasic: [AUSKLAPPEN]
For Lustiger.TGegner = Each TGegner 
BlitzBasic: [AUSKLAPPEN]
Type FigurTyp
Field ...
End Type
Turm.FigurTyp = New FigurTyp
  • Zuletzt bearbeitet von Midimaster am Di, Jan 19, 2010 12:30, insgesamt 3-mal bearbeitet

Midimaster

Betreff: GLOBAL oder LOCAL Variablen in Funktionen

BeitragDi, Dez 22, 2009 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
GLOBAL oder LOCAL Variablen in Funktionen

Variablen sollen ausschließlich "definiert" eingesetzt werden. Das bedeutet, dass man nicht einfach mitten im Code neue Variablen einführt und ihre Anzahl so nach Belieben ausufert.

Beim Definieren soll der Programmierer sich Gedanken um den Typ der Variablen und der Wirkungsbereich machen. Den Typ hast Du schon kennengelernt, bisher kennst Du zwei Typen
Code: [AUSKLAPPEN]
A% Variable für Zahlen
A$ Variable für Zeichenketten


Neu für Dich wird der Wirkungsbereich. Eine Variable kann im gesamten Programm gültig sein (GLOBAL) oder nur in einem Teil des Programms (LOCAL).. Ein komplette Definition für eine Variable lautet also:
Code: [AUSKLAPPEN]
GLOBAL SpielerPunkte%
GLOBAL SpielerName$

LOCAL Zähler%
LOCAL Ergebnis$


GLOBAL ist leicht zu erklären: Die Definitionszeile stellst Du ganz weit oben in den Code. Die Variable gilt dann immer und überall. Den Wert, den sie enthält, kannst Du immer und überall abrufen oder ändern.

LOCAL ist schon etwas schwieriger zu verstehen, aber sehr wichtig! Lokale Variable gelten nicht überall, sondern nur in dem Teil des Programm, in dem sie definiert sind. Hierzu ein Beispiel:
BlitzBasic: [AUSKLAPPEN]
Global Name$
Global i%
Name="Tarzan"
i=999
DruckeDenNamen()
Print "i steht am Ende bei: " + i
End
BlitzBasic: [AUSKLAPPEN]
Function DruckeDenNamen()
Local i%
For i= 1 To 10
Print Name
Next i
Print "i hat den Wert: " + i
End Function


Die Variable i% wird direkt unter dem Funktions-Header mit dem Befehl LOCAL definiert. Sie läuft in der Funktion DruckeDenNamen von 1 bis 10 durch. Dennoch steht sie im Hauptprogramm wieder auf 999. Wie ist das möglich?
Es ist nicht die gleiche Variable. Innerhalb der Funktion gibt es nun eine lokale Variable i%. Sie kann den gleichen Namen wie Variablen außerhalb der Funktion tragen und ist dennoch eine eigenständige, völlig unabhängige Variable. Der Computer kann beides auseinanderhalten. Die lokale Variable gilt von der Zeile Function DruckeDenNamen() bis zur Zeile End Funktion

kurze Einführung in Funktionen

Funktion sind Unterprogramme die ein Detail eines Programms kompakt abarbeiten. Manchmal dienen sie dazu einen Codeblock deutlicher als Einheit erscheinen zu lassen. Der Codeblock wir aus dem Hauptprogramm ausgeschnitten und in einer Funktion gepackt. Die Funktion wird im Hauptprogramm "aufgerufen":

vorher:
BlitzBasic: [AUSKLAPPEN]
Global Name$
Global i%
Name="Tarzan"
For i=1 To 10
Print Name
Next
Print "Fertig"
End


nachher:
BlitzBasic: [AUSKLAPPEN]
Global Name$
Name="Tarzan"
DruckeDenNamen()
Print "Fertig"
End
BlitzBasic: [AUSKLAPPEN]
Function DruckeDenNamen()
Local i%
For i=1 To 10
Print Name
Next
End Function

Damit hältst Du den Code übersichtlicher. Mehr aber auch nicht....

Variablen an Funktionen übergeben und von dort zurückerhalten

Oft lässt sich eine Funktionen aber von mehreren Stellen im Programm sinnvoll einsetzen. Spätestens dann ist es wichtig, das die darin enthalten Variablen nicht das Hauptprogramm manipulieren. Also:

Eine perfekte Funktion enthält keine Variablen, die vorher GLOBAL definiert wurden. Dazu müssen aber dann irgendwie die Werte GLOBALer Variablen in die Funktion gelangen. So geht es:

Code: [AUSKLAPPEN]
Function DruckeDenNamen(Druck$, WieOft%)

In der Header-Zeile der Funktion kannst Du beliebig viele Variable durchreichen. der Name ist nicht entscheidend, ihr Typ muss aber der gleiche sein, wie der Typ der GLOBALEN Variablen, die Du weiterreichst

Unser Beispiel sieht jetzt so aus:

BlitzBasic: [AUSKLAPPEN]
Global Name$
Name="Tarzan"
DruckeDenNamen Name,10
Print "Fertig"
End
BlitzBasic: [AUSKLAPPEN]
Function DruckeDenNamen(Druck$, WieOft%)
Local i%
For i=1 To WieOft
Print Druck
Next
End Funktion


Wird Dir der Vorteil schon klar? Du kannst diese Funktion jetzt einsetzen wie eine neuen Befehl:

BlitzBasic: [AUSKLAPPEN]
Global Name$
Name="Tarzan"
DruckeDenNamen Name,10
DruckeDenNamen "Jane",5
.....


Wenn Du das Gefühl hast, das sieht jetzt fast aus wie ein BlitzBasic-Befehl, dann liegst Du genau richtig: Funktionen sind Befehlserweiterungen, jeder Blitz-Befehl ist auch nichts anderes als eine Funktion.

Funktionen können auch Werte zurückfunken. Hierzu mein Lielbingsbeispiel einer Funktion. Sie achtet darauf, dass eine Variable deines Programms innerhalb vorgegebener Grenzen bleibt:

BlitzBasic: [AUSKLAPPEN]
Global Zahl%
Zahl=Rand(1000)
Zahl=ZahlZwischen(Zahl,123,155)
Print Zahl
End
BlitzBasic: [AUSKLAPPEN]
Function ZahlZwischen% (Wert%, Min%, Max%)
Local Ergebnis%
If Wert<Min Then
Ergebnis=Min
ElseIf Wert>Max Then
Ergebnis=Max
Else
Ergebnis=Wert
EndIf
Return Ergebnis
End Function


Das Ergebnis wird am Ende der Funktion an das Hauptprogramm zurückgeliefert und wandert direkt in die Variable Zahl:
BlitzBasic: [AUSKLAPPEN]
Zahl=ZahlZwischen(Zahl,123,155)
  • Zuletzt bearbeitet von Midimaster am Mo, Dez 28, 2009 17:43, insgesamt 2-mal bearbeitet

Midimaster

Betreff: Listen und Felder sind Arrays

BeitragMi, Dez 23, 2009 1:21
Antworten mit Zitat
Benutzer-Profile anzeigen
In diesem Kapitel geht es darum wie man ein Dutzend ähnliche Variablen definiert und verwendet. Oft ist es so, dass man ein Spiel für mehrere Spieler schreibt und hier gibt es auch mehrere SpielerNamen zu verwalten. So sieht es nicht richtig gut aus:

Code: [AUSKLAPPEN]
Global SpielerName1$, SpielerName2$, SpielerName3$, SpielerName4$


Dies sind 4 völlig unabhängige Variable, die nur ziemlich ähnlich heißen. Der Nachteil ist hier, dass ich die Spielernamensliste nicht als Gesamtheit nutzen kann. Wären es Hunderte Spieler wäre auch ein Auflisten ein Problem:

Code: [AUSKLAPPEN]
Print SpielName1
Print SpielName2
Print SpielName3
Print SpielName4
Print SpielName5
...


Oder stell Dir vor Du wolltest jeden mit jedem vergleichen. Bei 100 Spielern wären das 10000 Zeilen Code.

Hier hilft uns eine Liste oder Array. Bei einem Array legst Du zunächst fest, wie viele Einträgen du maximal erwartest. Wir nennen dies dimensionieren:
Code: [AUSKLAPPEN]
Dim SpielerName$(101)


Ab sofort kannst Du die einzelnen Listeneinträge mit einer laufenden Nummer ansprechen:

Code: [AUSKLAPPEN]
SpielerName(1)="Tarzan"
Print SpielerName(1)



Anmerkung I: BlitzMax erwartet bei Arrays eckige Klammern und kein DIM:
BlitzMax: [AUSKLAPPEN]
Global SpielerName$[101]
Print SpielerName[1]


Anmerkung II: Dimensioniere deine Felder und Listen zunächst immer 1 Element zu groß. Da es Sprachen gibt wo dies so nötig ist, um Element(100) benutzen zu dürfen, liegst Du so immer auf der sicheren Seite.

Das Auflisten von 100 Namen ist jetzt ganz leicht:

BlitzBasic: [AUSKLAPPEN]
Dim SpielerName$(101)
Global i%
For i=1 To 100
Print SpielerName(i)
Next


wie Du siehst kann die laufende Nummer (die man auch Index nennt) durch eine Variable ersetzt werden. Das ist praktisch, so lässt sich in der Liste leicht herumspringen. Das folgende Beispiel wählt einen Spieler per Zufall aus:
BlitzBasic: [AUSKLAPPEN]
Dim SpielerName$(101)
Global Zufall%
Zufall=Rand(1,100)
Print "Jetzt ist Spieler " + SpielerName(Zufall) + " dran"


Bis jetzt waren unsere Beispiel-Arrays vergleichbar mit Listen. Listen sind 1-dimensional. Stelle Dir vor alle Einträge stehen immer untereinander in Zeilen.

2-dimensionale Arrays wie Feld(10,10)

Aber es gibt auch 2-dimensionale Arrays, die man sich vorstellen muss wie ein Schachbrett. Ein Schachbrett ist 2-dimensionales Array mit 8x8 Feldern. Auf jedes dieser Felder kannst Du etwas stellen. Mit einem 2-dimensionalen Array ist es ähnlich:

BlitzBasic: [AUSKLAPPEN]
Dim Feld%(9,9)
Global Bombe%, X%,Y%
Bombe=555
Feld(1,1)=555
X=3
Y=6
Feld(X,Y)=Bombe

hier hast Du in das 1.Feld der 1.Reihe eine Bombe positioniert und in das 3.Feld der 6.Reihe ebenso

Hier lassen wir uns den gesamten Inhalt des Spielfeldes anzeigen:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
Dim Feld%(9,9)
Global X%,Y%
For X=1 To 8
For Y=1 To 8
Text X*50,Y*50, Feld(X,Y)
Next
Next
Flip
WaitKey
  • Zuletzt bearbeitet von Midimaster am Mi, Jan 13, 2010 11:30, insgesamt 3-mal bearbeitet

Midimaster

Betreff: Weitere TYPEN von Variablen

BeitragMi, Dez 23, 2009 1:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Bisher sind wir mit 2 Variablen-Typen ausgekommen. Solche, die Zahlen aufnehmen und solche, die Zeichenketten aufnehmen.

Allerdings gibt es noch mehr TYPEN:

Der Typ A% kann nicht wirklich alle Zahlen aufnehmen, sondern nur ganze Zahlen ( -15 oder 0 oder 8) aber keine Kommazahlen (1.45 oder -0.0000000000001). Deshalb nennt man diesen Typ auch INTEGER oder Ganzzahlentyp.

Der Typ A# kann jede Zahl aufnehmen, der Computer rechnet aber viel langsamer mit ihnen und manchmal kommt es zu Rundungsfehlern beim Rechnen (1+1=2.000000000001). Man nennt diesen Typ FLOAT.

Faustregel:

Verwende immer INTEGER also A%, wenn Du sicher weißt, dass die Variable nur Ganzzahlen enthalten wird.

Verwende immer FLOAT also A#, wenn es um fließende Aktionen geht, z.B. Beschleunigung, Ausblenden, etc...

Verwende immer STRING also A$, wenn Buchstaben enthalten sein könnten.

Anmerkung:
BlitzMAX kannt noch extra TYPEN, die Bilder oder Sounds enthalten können. Sie werden dann so definiert
Global Bild:TImage, Ton:TSound, .... (mehr darüber dort)

Eigene Typen

Aber auch in BlitzBasic und B3D kannst Du selbst eigene TYPEN erfinden, etwa einen, der eine Zahl und eine Zeichenkette gleichzeitig enthält:

BlitzBasic: [AUSKLAPPEN]
Type SpielerTyp
Field Name$
Field Punkte%
End Type

Spieler.SpielerTyp = New SpielerTyp
Spieler\Name="Tarzan"
Spieler\Punkte=Spieler\Punkte + 1
Print Spieler\Name + " hat schon " + Spieler\Punkte + " Punkte


Doch dies ist schon ein anderes Tutorial und dann wärst Du schon kein Anfänger mehr.....

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group