Du bist nicht angemeldet.

#1 23.07.2014 10:17

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Monkey X - Tutorial 1

Monkey X - Tutorial 1


Vorbetrachtung:
Um mit dem Tutorial loslegen zu koennen muessen vorher folgende Schritte gemacht werden:

- auf http://www.monkey-x.com einen Account anlegen
- sich danach die kostenlose Monkey X-Version herunterladen (HTML5 und Desktop Ziele). Es stehen Fassungen fuer Linux, Mac und Windows zur Verfuegung

optional:
- um Desktopapplikationen kompilieren zu koennen, muss eine sogenannte Buildumgebung eingerichtet werden (bei Windows ist dies MinGW). Im Monkey X-Forum hat ein User zur erleichterten Einrichtung ein Tool bereitgestellt, damit sollte sich dieser Vorgang automatisieren lassen:
http://www.monkey-x.com/Community/posts.php?topic=8519

- TED starten (bzw "Monkey"), dies ist ein sehr rudimentaerer Editor. Es gibt andere (fortgeschrittenere) Editoren, aber das ist jetzt nicht notwendig oder von Belang.
- "File" -> "New" -> Ort auswaehlen, Dateiname "Schritt1.monkey"



Los gehts:
Kopiert folgenden Text und fuegt ihn im Editor ein:

Function Main()
	Print "hi"
End Function

Nun, schaut nach, ob im Editor das richtige Ziel ausgewaehlt ist (bspweise "HTML5 Game") und drueckt F5 oder drueckt auf die 2. Rakete in der Nagigationsleiste.
Habt ihr "HTML5" ausgewaehlt gehabt, starten sich nun ein kleiner Miniserver, und Euer Standardbrowser. Im Browser solltet ihr eine "localhost"-Seite geoeffnet vorfinden - die sieht allerdings ziemlich leer aus, mit ausnahme des kleinen "hi"-Textes.


Was ist passiert?
Fuehrt man ein mit Monkey X erstelltes Programm aus, wird versucht die Funktion "Main()" auszufuehren.
Funktionen? Funktionen sind Anweisungsgruppen - aehnlich Makros in Officeprogrammen. Damit Monkey X weiss, wann eine Funktion beginnt, wann sie endet, welche Eingabewerte sie erwartet - und ob sie ein Ergebnis zurueckgibt, muss sich an eine spezielle Formatierung gehalten werden.

function name:rueckgabetyp(parameter:typ)
  inhalt
end function

In unserem Fall ist "inhalt" die Zeile print "hi". Print - also "Drucken/Ausgeben" ist netterweise gleich eine fuer uns schon bereitstehende Funktion. Ja richtig, irgendwo in den Tiefen von Monkey X steht soetwas wie "function print:Void(parameter)". Diese Funktion versteckt vor uns die Komplexitaet die dahintersteckt, Texte und Zahlen an den vom System vorgegebenen Stellen auszugeben.
Interessant ist auch: Monkey X erlaubt es, Funktionen mit oder ohne Klammern aufzurufen. Waehrend bei print "text" dieses noch uebersichtlich erscheint, ist bei print("text") sofort klar, was an die print-Funktion weitergereicht werden soll. Dieser Aspekt wird dann interessant, wenn eine Funktion als Parameter einer anderen Funktion herhalten soll, oder wenn gar tiefergehende Verschachtelungen anfallen (function1( function2( function3() ) )).


Ok, die erste Textausgabe war jetzt nicht so schwer ... damit anfangen laesst sich aber noch nichts so wirklich.


Bevor wir aber nun mit komplexeren Dingen voranschreiten wollen, muessen noch weitere Grundlagen geschaffen werden. Wir wissen nun, wir koennen Anweisungen gruppieren, doch welche Anweisungen gibt es ueberhaupt? Wie in der Sprache, gibt es Bedingungen (Wenn Du nicht dein Zimmer aufraeumst, dann gibt es kein Taschengeld), logische Verknuepfungen (Zimmer aufgeraeumt und Hausaufgaben erledigt) und Schleifen (Solange dein Kinderzimmer nicht aufgeraeumt ist, ...). Da wir aber "Kinderzimmer aufraeumen" nicht fuer einen Monkey X (und andere Sprachen) formulieren koennen, muessen wir diese Dinge mathematisch beschreiben: in Programmiersprachen gibt es hierfuer boolesche Werte: Wahr, Falsch - oder englisch True, False. Oder anders ausgedrueckt: 1 und 0 (willkommen in der digitalen Welt). Eine Bedingung wird dann also zu einem "erfuellt" oder "nicht erfuellt" (Wahr/Falsch).
Damit wir hier jetzt aber nicht zu ausschweifend werden, kuerze ich dieses Thema ab und komme zum naechsten Punkt: Variablen. Variablen sind Faecher um bestimmte Daten abzulegen. Anstatt also immer den eigenen Namen hinzuschreiben, kann man diesen in einer Variable ablegen, und dann spaeter nur noch auf diese Variable zugreifen.
Genug gequatscht:


Die If-Bedingung
Ersetze Schritt1.monkey mit folgendem Inhalt und druecke die Rakete (die schraege "Build and Run"-Rakete).

Function Main()
    Local name:String = "Ich"

    'eine Bedingung die unwahr ist
    If name = "du" Then Print "kann nicht sein"
    'eine Bedingung die wahr ist
    If name = "Ich" Then Print "jepp, ich bin es"
    'eine Bedingung die ebenfalls wahr ist
    If name <> "du" Then Print "jepp, ich bin nicht du"

    If name <> "Ich" And name <> "Du"
        Print "weder ich"
        Print "noch du"
    Endif 

    'waehrend einzelne If-Anweisungen nacheinander
    'ausgefuehrt werden, fuehrt folgende Art nur
    'das zutreffende aus
    If name = "Ich"
        Print "ich bins"
    'andernfalls ueberpruefe ob
    Elseif name = "Du"
        Print "ich bin nicht du"
    'in allen anderen Faellen als die obigen zwei
    Else
        Print "wer bin ich?"
    Endif
End Function

Hier hast du gleich noch die Kommentarfunktion von Monkey kennengelernt. mittels des Hochkommas kann man sich prima Erklaerungen neben den Code schreiben, manchmal ist es halt doch komplex und einem fremden Leser (oder wenn man spaeter selber noch mal ueber den Code stolpert) nicht gleich klar, was die geniale Arithmetik da eigentlich vollbringt). Ach und gleich noch eine Sache habe ich im obigen Code untergejubelt: Folgen von Bedingungen koennen auch auf mehreren Zeilen stattfinden. In diesem Fall muss die Anweisungsgruppe mit einem "EndIf" abgeschlossen werden. Die Bedingungen selbst (name = "Du" ...) muessen auf eine Zeile geschrieben werden (man kann sie aber auf mehrere Zeilen verteilen, wenn man ans Zeilenende ".." schreibt, dazu aber sicher mehr in weiteren Beispielen).



Logische Verknuepfungen

Function Main()
	Local name:String = "Hund"
	Local name2:String = "Katze"

	'Sowohl 1 Hund als auch 1 Katze
	If name = "Hund" and name2 = "Katze" Then Print "Grrr"
	'Mindestens 1 Hund oder 1 Katze	
	If name = "Hund" or name2 = "Katze" Then Print "Och suess"
	'Mindestens 1 Hund, aber keine Katze
	If name = "Hund" and name2<>"Katze" Then Print "Katzenfrei"
End Function

Neben dem "and" und "or" gibt es noch andere bedingungen (exklusives oder "xor") aber die sind fuer die einfache Programmierung nicht notwendig.



Schleifen

Function Main()
	'eine zahlenvariable mit dem Startwert 0
	Local zahl:Int = 0

	'wiederhole solange die zahl kleiner 5 ist
	'sollte die Zahl zu beginn schon 5 sein, 
	'wird nichts gemacht. Ueberpruefung am Anfang
	Print "While:"
	While zahl < 5
		Print zahl
		'erhoehe die Zahl um 1
		zahl = zahl + 1
	Wend

	'zahl wieder zuruecksetzen damit die folgende
	'Schleife korrekt ablaufen kann
	zahl = 0


	'wiederhole solange bis die Zahl groessergleich 5 ist
	'sollte die Zahl zu beginn schon 5 sein, wird die Schleife
	'dennoch einmal durchgefuehrt. Ueberpruefung erst am Ende
	Print "Repeat:"
	Repeat
		Print zahl
		'erhoehe die Zahl um 1
		zahl = zahl + 1
	Until zahl >= 5

	'zahl wieder zuruecksetzen damit die folgende
	'Schleife korrekt ablaufen kann
	zahl = 0


	'wiederhole mit einem automatisch erhoehenden Wert
	'die Zaehlervariable haben wir gleich platzsparend mit
	'reingepackt
	'es wird von 0 bis einschliesslich 4 wiederholt
	Print "For (to):"
	For Local i:Int = 0 To 5
		Print zahl + " Durchlauf: "+i
		zahl = zahl + 1
	Next

	'zahl wieder zuruecksetzen damit die folgende
	'Schleife korrekt ablaufen kann
	zahl = 0


	'alternative Version mit "until"
	'es wird von 0 bis einschliesslich 5 wiederholt
	Print "For (until):"
	For Local i:Int = 0 Until 5
		Print zahl + " Durchlauf: " + i
		zahl = zahl + 1
	Next
End Function

Neben den Schleifen habe ich hier gleich noch etwas eingefuehrt, was man "Konkatenation" nennt: Das Verknuepfen von Texten. Waehrend ein "1 + 1" eine mathematische Operation durchfuehrt, verhaelt sich dies bei Texten ("Strings") anders. ein "Text1" + "Text2" ergibt "Text1Text2". Da sich Monkey X versucht klever zu verhalten, benutzt es diese Variante auch dann, wenn man Texte mit Zahlen verknuepft: "Text 1" + 1 ergibt dann "Text 11".



Damit das alles ein wenig sacken kann, wuerde ich damit das erste Tutorial beenden wollen. Im naechsten fangen wir dann endlich damit an, grafisch zu werden.


bye
Ron


sigimg2.php?id=1

Offline

#2 23.07.2014 13:59

Gast2
TVT-Roadie
Registriert: 07.06.2013
Beiträge: 4.276

Re: Monkey X - Tutorial 1

Bevor Suchende am Verzweifeln sind - der Downloadlink ist auf der ersten Seite des Themas zu finden:

http://www.monkey-x.com/Community/posts.php?topic=8519&page=1



@Ron Danke!!!!


So verstehe selbst ich das.





Zur Installation/Einrichtung mit "mxdevinstall":
Das geht recht einfach. Bei Linux mußte ich allerdings die Option "im Terminal ausführen" wählen, damit es sichtbar startete.

Als Ziel habe ich "Desktop Game" ausgewählt. Richtig?




Ronny schrieb:

Los gehts:
Kopiert folgenden Text und fuegt ihn im Editor ein:

Function Main()
	Print "hi"
End Function

...drueckt F5 oder drueckt auf die 2. Rakete in der Nagigationsleiste.



Ohjeh, jetzt hätte ich das kleine „hi“ fast übersehen.






Ted gibt folgende Ausgabe:


Ted schrieb:

"/media/sdb8/Monkey/MonkeyX77a/bin/transcc_linux" -target=Html5_Game -config=Debug -run "/media/sdb4/Spiele/Schritt1.monkey"
TRANS monkey compiler V1.62
Parsing...
Semanting...
Translating...
Building...

(process:9235): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed
Done.


Fehlt mir irgendeine Bibliothek?




Beim "Ich"-Beispiel


Schritt

 If name = "Ich" 
        print "ich bins"

Erhalte ich die Fehlermeldung:

Ted schrieb:

Semanting...
/Pfad  Schritt1.monkey<20>: Error: Identifier 'print' not found.
Done.



Wegen der .lib meckerte er nicht mehr rum.




@Hund und Katze

Die 1. und 3. Zeile (Hund and Katze) sind doch identisch?
Müßte in der dritten Zeile nicht statt "Katze" "keine Katze" stehen?
Woher weiß der Computer das sonst?

Beitrag geändert von Gast2 (23.07.2014 14:45)

Offline

#3 23.07.2014 16:46

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: Monkey X - Tutorial 1

(process:9235): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed

Ich denke das liegt an deiner Linux-Distro, wird sicher passieren, wenn versucht wird, den Browser zu oeffnen (passiert das denn?).


Als Ziel habe ich "Desktop Game" ausgewählt. Richtig?

Ich benutze das Tool nicht (habe ja fuer BlitzMax schon alles bei mir eingerichtet), ich denke aber, dass du richtig gewaehlt hast.


Semanting...
/Pfad  Schritt1.monkey<20>: Error: Identifier 'print' not found.
Done.

Ich hatte den Code nicht selbst ausprobiert (hatte den um genau diesen Teil erweitert). Wie Du nun leidlich selbst feststellen musstest, handelt Monkey X "case sensitive", heisst es unterscheidet zwischen Gross- und Kleinschreibung (im Gegensatz zu Blitzmax). Ein "print" ist also was anderes als ein "Print". Aus diesem Grund ersetzt der TED-Editor von sich aus beim schreiben ein "print" zu einem "Print" (mit grossem P).



@Katzenbeispiel:
Ja da hast Du voellig Recht, zumindest, dass da ein Fehler drin war.

alter Code (auf den sich Gast2 bezieht):

'Sowohl 1 Hund als auch 1 Katze
If name = "Hund" and name2 = "Katze" Then Print "Grrr"
'Mindestens 1 Hund oder 1 Katze	
If name = "Hund" or name2 = "Katze" Then Print "Och suess"
'Mindestens 1 Hund, aber keine Katze
If name <> "Hund" and name2<>"Katze" Then Print "Katzenfrei"

Der Fehler war, dass ich im dritten Beispiel name <> "Hund" verlangt hatte. Dies bedeutet, da durfte alles rein ausser Hund. Der Wortlaut waere also:
Mindestens 1x kein Hund und mindestens 1x keine Katze.

Dies ist nicht das Gleiche wie Beispiel 1. Zwar nutzen wir in diesem Beispiel nur die Werte "Hund" und "Katze". Aber es koennte ja auch eine "Maus" dabei sein.
Naeheres siehe  Mengentheorie der Mathematik (das mit den Schnittmengen/Kreisen die andere Kreise einschliessen usw.).


neuer Code:

'Sowohl 1 Hund als auch 1 Katze
If name = "Hund" and name2 = "Katze" Then Print "Grrr"
'Mindestens 1 Hund oder 1 Katze	
If name = "Hund" or name2 = "Katze" Then Print "Och suess"
'Mindestens 1 Hund, aber keine Katze
If name = "Hund" and name2<>"Katze" Then Print "Katzenfrei"

Nun stimmt die im Kommentar abgegebene Aussage wieder.

Jetzt fuer dich die Uebung: wie wuerde eine If-Abfrage zu formulieren sein, die ueberprueft ob 1 Katze und 1 Hund vorkommen?
Hinweis: die Aussage impliziert keine Reihenfolge, es ist also egal ob sich hinter Name oder Name2 ein Hund verbirgt.
Hinweis 2: Du benoetigst hierfuer eventuell Klammern. Klammern dienen der Gruppierung von Dingen.

'waere nur wahr, wenn es 1:30, 1:31, 2:30 oder 2:31 waere
'Schritt 1: teil1 = (Klammer 1 wahr?)
'Schritt 2: teil2 = (Klammer 2 wahr?)
'Schritt 3: "teil1 and teil2" wahr?
If (Stunde = 1 or Stunde = 2) and (Minute = 30 or Minute = 31)

--

Müßte in der dritten Zeile nicht statt "Katze" "keine Katze" stehen?
Woher weiß der Computer das sonst?

das "<>" ist ein "ist ungleich". Damit steht dort "keine Katze". Verkompliziert muesste sich das auch so schreiben lassen:

If name = "Hund" and not(name2="Katze") Then Print "Katzenfrei"

Warum? Wie ich eingangs erwaehnt habe, muessen sich diese Bedingungen zu Wahr oder Falsch einstufen lassen. Das Stichwort not sorgt nun fuer eine Verneinung - aus wahr wird falsch und aus falsch wird wahr. Die Abfrage wird also an der Stelle zu einem "Wenn nicht name2 gleich Katze". 

bye
Ron


sigimg2.php?id=1

Offline

#4 23.07.2014 18:22

Gast2
TVT-Roadie
Registriert: 07.06.2013
Beiträge: 4.276

Re: Monkey X - Tutorial 1

Ich hatte die Zeichen

"="

und

"<>"


nicht so ganz ernst genommen.




Übung:

If (name = "Hund" and name2 = "Katze") or (name = "Katze" and name2 = "Hund") Then Print "beide da"

Beitrag geändert von Gast2 (23.07.2014 18:27)

Offline

#5 23.07.2014 18:48

Ronny
Administrator
Ort: Chemnitz
Registriert: 08.11.2001
Beiträge: 11.704
Webseite

Re: Monkey X - Tutorial 1

Uebung bestanden.

alternativ geht natuerlich auch die umgekehrte Bedingung:

If (name = "Hund" or name2 = "Hund") and (name = "Katze" or name2 = "Katze") Then Print "beide ebenfalls da"

Bereit fuer die naechste Uebung?

bye
ron


sigimg2.php?id=1

Offline

#6 23.07.2014 19:12

Gast2
TVT-Roadie
Registriert: 07.06.2013
Beiträge: 4.276

Re: Monkey X - Tutorial 1

yepp. Nur zu.
Bin grad bildungshungrig.
Bei dem Wetter gehe ich nicht so viel vor die Tür;)

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Bist Du ein Mensch oder ein Roboter ?

Verifizierung, dass diese Aktion durch eine reale Person vorgenommen wird und nicht von einem Programm.