{"id":12648,"date":"2019-04-25T06:39:47","date_gmt":"2019-04-25T04:39:47","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=12648"},"modified":"2023-05-04T18:42:42","modified_gmt":"2023-05-04T16:42:42","slug":"raetselkoffer-programmieren","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2019\/04\/raetselkoffer-programmieren.htm","title":{"rendered":"R\u00e4tselkoffer programmieren"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2019\/04\/raetselkoffer-programmieren.htm#comments'>4 Kommentare.<\/a>)<\/small> <\/div>\n<p class=\"wp-block-paragraph\">Ich habe <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2017\/04\/nicht-rundenbasierte-spiele.htm\">hier schon schon einmal<\/a> das Spiel &#8222;Keep Talking and Nobody Explodes&#8220; vorgestellt. Ein Spieler oder eine Spielerin  sitzt dabei am Rechner vor einem virtuellen Bombenkoffer, den es zu entsch\u00e4rfen gilt, und zwar alle drei (oder mehr) Module am Koffer. Eines davon ist das Drahtdurchschneiden, das man aus Filmen kennt: Es gibt eine Reihe von farbigen Dr\u00e4hten, die man in bestimmter Reihenfolge durchschneiden muss. Nur welche Reihenfolge?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die anderen Spieler und Spielerinnen, und nur die, haben alle das hochkomplizierte Bombenentsch\u00e4rf-Handbuch vor sich liegen, sehen aber nicht den Bombenkoffer. Also muss man miteinander reden &#8211; es ist ein Dialogspiel: Wie viele Dr\u00e4hte? Welche Farben haben sie? Welche anderen Merkmale gibt es an dem Modul oder am ganzen Koffer? Davon h\u00e4ngt dann die L\u00f6sung ab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So etwas habe ich in grob vereinfachter Form f\u00fcr meine Informatikklasse programmiert. Allerdings habe ich das ganze &#8222;R\u00e4tselkoffer&#8220; genannt &#8211; das gibt mehr Spielraum f\u00fcr die verschiedenen Module und ist nicht ganz so gewaltt\u00e4tig. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Drahtdurchschneide-Grafikmodul sieht zum Beispiel so aus (eigentlich nur der gelb hinterlegte Bereich):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"648\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2.png\" alt=\"\" class=\"wp-image-12651\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2.png 526w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2-122x150.png 122w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2-244x300.png 244w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2-135x166.png 135w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das sind einfach sieben recht schmale und hohe Kn\u00f6pfe oben und ein paar Ausgabefelder unten. F\u00fcr die Kn\u00f6pfe gibt es Methoden, um eine beliebige Grafik als Hintergrund zu setzen, und vorgefertigt sind Grafiken mit Dr\u00e4hten in verschiedenen Farben, durchgeschnitten oder ganz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine andere Modul-Grafik (ein Sch\u00fclerwunsch) sieht so aus: Drei quadratische Kn\u00f6pfe oben, ein breiter, niedrigerer Knopf darunter. Die Kn\u00f6pfe oben kann man zum Beispiel mit solchen Bildern f\u00fcllen:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"648\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer3.png\" alt=\"\" class=\"wp-image-12652\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer3.png 526w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer3-122x150.png 122w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer3-244x300.png 244w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer3-135x166.png 135w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Was man mit den Kn\u00f6pfen beziehungsweise dem ganzen grafischen Block macht, bleibt den Sch\u00fclern und Sch\u00fclerinnen \u00fcberlassen. Tats\u00e4chlich besteht jedes R\u00e4tselmodul aus zwei Objekten, die in den Klassen <code>ModulGUI<\/code> und <code>Modul<\/code> beziehungsweise Unterklassen davon beschrieben werden: <code>ModulGUI<\/code> ist lediglich die Grafik des aktuellen Elements; die Unterklassen dazu stelle ich zur Verf\u00fcgung. (Denn Grafikprogrammierung in Java ist einfach zu fisselig, wenn man sie noch nie gemacht hat, auch wenn die Elemente ja nur aus verschieden gro\u00dfen Buttons und Ein- und Ausgabefl\u00e4chen  bestehen.) Zu jedem <code>ModulGUI<\/code>-Objekt geh\u00f6rt ein <code>Modul<\/code>-Objekt, das die Spiellogik und Steuerung \u00fcbernimmt. Und eben dieses (beziehungsweise die Unterklassen dazu) wird von den Sch\u00fclern und Sch\u00fclerinnen programmiert: Im Beispiel ist das die Klasse <code>Demo<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"587\" height=\"189\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer4.png\" alt=\"\" class=\"wp-image-12664\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer4.png 587w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer4-150x48.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer4-300x97.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer4-135x43.png 135w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die Demo-Klasse legt erstens ein WireGUI-Objekt an, um diesem Nachrichten zu schicken, wie welcher Knopf aussehen soll. Und zweitens macht sie sich zur Unterklasse von Modul, damit das WireGUI-Objekt seinerseits Nachrichten &#8211; dar\u00fcber, welche Kn\u00f6pfe gedr\u00fcckt werden &#8211; an das Demo-Objekt, also die Steuerung, schicken kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So sieht eine zu programmierende Klasse dann aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Demo extends Modul \n{\n    WireGUI gui;\n\n    public Demo() {\n        gui = new WireGUI();\n        gui.setSteuerung(this);\n        gui.setButtonImage(1, \"drahtRot.png\");\n    }\n\n    @Override\n    public WireGUI getGUI() { \n        return gui; \n    }\n    \n    @Override\n    public void empfangeKnopfdruck(int knopfnr) {\n        if (knopfnr==1) { gui.setButtonImage(1, \"drahtRotCut.png\"); }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So sieht das alles in BlueJ aus:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"535\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-700x535.png\" alt=\"\" class=\"wp-image-12672\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-700x535.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-150x115.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-300x229.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-954x729.png 954w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1-135x103.png 135w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer1.png 1353w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">An der linken Seite sieht man einige m\u00f6gliche Grafik-Unterklassen. An der unteren Seite sind die Steuerung-Unterklassen, also die von den Sch\u00fclern und Sch\u00fclerinnen zu programmierenden. Das obere Drittel ist technischer Kram, ausgebreitet auf verschiedene Klasse zur leichteren Wartung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">K\u00f6nnte man in sie hineinblicken, wirkten sie vielleicht ein wenig umst\u00e4ndlich, und das liegt daran, dass die Grafikbibliothek JavaFX und BlueJ nicht optimal zusammenarbeiten. Wenn ich Objekte in der Objektleiste unten haben und ansprechen k\u00f6nnen m\u00f6chte, muss ich tricksen. (Der JavaFX-Thread l\u00e4sst sich nicht gerne von au\u00dfen unterbrechen, will hei\u00dfen: durch manuelle Methodenaufrufe von BlueJ aus.) Und so gibt es mehre M\u00f6glichkeiten, etwas zu sehen zu kriegen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>in der Main-Klasse die statische Methode <code>launch(String[] args)<\/code> aufrufen, die den JavaFX-Thread startet<\/li>\n\n\n\n<li>ein Main-Objekt anlegen oder eine andere statische Methode darin aufrufen, dann wird die JavaFX-Grafik gekapselt in einem JavaSwing-JFrame und ist damit f\u00fcr Objekte in der Objektbank zug\u00e4nglich (tats\u00e4chlich gibt es noch einen Sch\u00f6nheitsfehler dabei, anderes Thema)<\/li>\n\n\n\n<li>ein Objekt einer Modul-Unterklasse anlegen, das sich eine ModulGUI-erzeugt, das letztlich die JFrame-Methode der Main-Klasse aufruft (Vorteil: man kann die Methode der Klasse manuell aufrufen und testen, wenn sie den JavaFX-Thread beeinflussen, muss man aber Umst\u00e4nde machen)<\/li>\n\n\n\n<li>ein Objekt einer ModulGUI-Unterklasse anlegen, das sich eine Dummy-Steuerung gibt, die letztlich die JFrame-Methode der Main-Klasse aufruft (Vorteil: wie oben) &#8211; Ziel dieser letzten beiden Konstruktionen: Die Sch\u00fcler und Sch\u00fclerinnen sollen einfach wie gewohnt Objekte ihrer Klassen erzeugen k\u00f6nnen, deren Oberklassen sich dann darum k\u00fcmmern, dass Grafik hergestellt wird<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">JavaFX bietet einige grafische Elemente, mit denen man so ein R\u00e4tselmodul aufpeppen kann. Man kann sie auch alle leicht vergr\u00f6\u00dfern, verkleinen, drehen, sich bewegen lassen:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"648\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer5.png\" alt=\"\" class=\"wp-image-12677\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer5.png 526w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer5-122x150.png 122w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer5-244x300.png 244w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer5-135x166.png 135w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das Projekt befindet sich noch in einem Rohstadium. Ich wei\u00df noch nicht, wie ich die einzelnen Module am besten zusammenf\u00fcgen soll. Soll das Spiel aus sein, wenn man ein Modul vergeigt? Oder wird das dann einfach beendet und gesperrt und man kriegt Punktabzug? Soll es einen globalen Timer geben? Vorl\u00e4ufig habe ich ein Modul als Startseite, \u00fcber das man auf andere, zuf\u00e4llig ausgew\u00e4hlte Module gelangt, von denen aus kann man zur\u00fcck, wenn man das will:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"648\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer6.png\" alt=\"\" class=\"wp-image-12693\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer6.png 526w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer6-122x150.png 122w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer6-244x300.png 244w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer6-135x166.png 135w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Einsatz in der Schule: Mir gef\u00e4llt die Idee, dass jedes Programmierteam ein Modul erarbeitet, die danach zu einem Spiel zusammengetragen werden. Viel m\u00fcssen die Sch\u00fcler und Sch\u00fclerinnen eigentlich nicht k\u00f6nnen: Ein Objekt erzeugen und in einem Attribut speichern, Methoden des Objekts aufrufen, eine Unterklasse anlegen, eine Methode implementieren  <code>void empfangeKnopfdruck(int knopfnummer)<\/code> &#8211; und vermutlich bedingte Anweisungen, um das sinnvoll machen zu k\u00f6nnen. Trotzdem war ich zu fr\u00fch dran mit dem Ausprobieren mit meiner Klasse; das erfordert halt doch mehr Abstraktionsverm\u00f6gen und Programmiererfahrung, als man meint. Inzwischen hat die Klasse einfache Zustandsautomaten programmiert und ist mit <code>if<\/code>  und <code>if else<\/code> vertrauter; vielleicht komme ich noch einmal darauf zur\u00fcck. Die JavaFX-Grafikklassen erstelle ich \u00fcbrigens mit dem Java-Editor, sie erfordern dann nur wenig Anpassung, um sie zu ModulGUI-Unterklassen machen zu k\u00f6nnen. Der Auftrag dazu f\u00fcr die Sch\u00fcler und Sch\u00fclerinnen: Erstelle eine Skizze, wie die (quadratische) Grafikoberfl\u00e4che f\u00fcr dein Modul aussehen soll, welche Kn\u00f6pfe oder Felder du darin gerne h\u00e4ttest, und welche Methoden dir das Objekt zur Verf\u00fcgung stellen soll, damit du die Oberfl\u00e4che auf die gew\u00fcnschte Weise ver\u00e4ndern kannst.<br> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Hilfsmethoden, die die Klasse Modul zur Verf\u00fcgung stellt: Abspielen von mp3-Dateien, Erzeugen von T\u00f6nen, Verz\u00f6gertes Ausf\u00fchren einer Methode, Countdown.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; In den Sommerferien komme ich hoffentlich endlich mal dazu, meine ganzen Programmierprojekte f\u00fcr die 10. Jahrgangsstufe ordentlich bei github oder so einzustellen und in einem Mebiskurs zu pr\u00e4sentieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(4 Kommentare.) Ich habe hier schon schon einmal das Spiel &#8222;Keep Talking and Nobody Explodes&#8220; vorgestellt. Ein Spieler oder eine Spielerin sitzt dabei am Rechner vor einem virtuellen Bombenkoffer, den es zu entsch\u00e4rfen gilt, und zwar alle drei (oder mehr) Module am Koffer. Eines davon ist das Drahtdurchschneiden, das man aus Filmen kennt: Es gibt [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":12651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227],"class_list":["post-12648","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/raetselkoffer2.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=12648"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12648\/revisions"}],"predecessor-version":[{"id":55677,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12648\/revisions\/55677"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/12651"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=12648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=12648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=12648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}