{"id":3317,"date":"2011-08-02T14:43:30","date_gmt":"2011-08-02T12:43:30","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=3317"},"modified":"2011-08-03T15:49:01","modified_gmt":"2011-08-03T13:49:01","slug":"wie-ich-auszog-ein-spiel-zu-programmieren-1","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-1.htm","title":{"rendered":"Wie ich auszog, ein Spiel zu programmieren (1)"},"content":{"rendered":"<p>Ich bin kein gro\u00dfer Programmierer, aber das Programmieren macht Spa\u00df und ich brauchte einen Anlass zum \u00dcben. Also wollte ich ein Spiel programmieren, etwa Schach oder <em>Mensch \u00e4rgere dich nicht<\/em>. Aber welches <em>Mensch \u00e4rgere dich nicht<\/em>? Es gibt so viele:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"float:left; margin-right:10px;\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ludo1.jpg\" alt=\"\" title=\"ludo1\" width=\"300\" height=\"225\" class=\"aligncenter\" \/><small>(von Startaq, <a href=\"http:\/\/de.wikipedia.org\/w\/index.php?title=Datei:Mensch%C3%84rgereDichNicht.jpg&#038;filetimestamp=20080212171522\">CC-BY-SA<\/a>)<\/small><\/p>\n<div style=\"clear:both;\"><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"float:left; margin-right:10px;\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ludo2.jpg\" alt=\"\" title=\"ludo2\" width=\"300\" height=\"225\" class=\"aligncenter\" \/><small>(von Micha L. Rieser, <a href=\"http:\/\/en.wikipedia.org\/wiki\/File:Pachisi-real.jpg\">CC-BY-SA<\/a>)<\/small><\/p>\n<div style=\"clear:both;\"><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"float:left; margin-right:10px;\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ludo3.jpg\" alt=\"\" title=\"ludo3\" width=\"300\" height=\"225\" class=\"aligncenter\" \/><small>(von Micha L. Rieser, <a href=\"http:\/\/en.wikipedia.org\/wiki\/File:Ludo-3.jpg\">CC-BY-SA<\/a>)<\/small><\/p>\n<div style=\"clear:both;\"><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"float:left; margin-right:10px;\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ludo4.jpg\" alt=\"\" title=\"ludo4\" width=\"300\" height=\"225\" class=\"aligncenter\" \/><small>(von Micha L. Rieser, <a href=\"http:\/\/en.wikipedia.org\/wiki\/File:Parcheesi.svg\">CC-BY-SA<\/a>)<\/small><\/p>\n<div style=\"clear:both;\"><\/div>\n<p>Das war nat\u00fcrlich eine Fangfrage. Auch wenn diese Spiele verschieden ausschauen, man kann doch immer das gleiche <em>Mensch \u00e4rgere dich nicht<\/em> damit spielen. Und dieses immer gleiche Spiel ist es, das man programmieren will. Wie es aussieht, darum k\u00fcmmern wir uns sp\u00e4ter. Programmiert wird erst einmal das unsichtbare, abstrakte Spiel, das den sichtbaren Formen zugrunde liegt.<\/p>\n<p>(F\u00fcr das Spielvergn\u00fcgen ist die Oberfl\u00e4che allerdings trotzdem wichtig, genau wie es bei Denksportaufgaben einen gro\u00dfen Unterschied macht, ob man sie in eine Krimihandlung packt oder anders verpuzzelt.)<\/p>\n<p>Ich habe dann allerdings doch lieber ein anderes Spiel programmiert. Schach, mehr oder weniger. Das hei\u00dft, ich wollte mich da noch nicht festlegen &#8211; ich wollte ein Art <em>framework<\/em>, ein Programm, dass es mir erlauben w\u00fcrde, alle m\u00f6glichen Spiele zu spielen, die man mit einem Schachbrett und Figuren dazu spielen kann. Schach, Dame, Go, Chinesisches Schach, oder auch erweiterte Versionen mit unterschiedlichem Gel\u00e4nde, wo die einzelnen Spielfelder unterschiedliche Funktionen haben. (<a href=\"http:\/\/www.c64-wiki.de\/index.php\/Archon#Beschreibung\">Archon<\/a>, anybody?)<\/p>\n<p>Das abstrakte Grundger\u00fcst:<\/p>\n<ol>\n<li>Es gibt ein Spielfeld, das aus einzelnen Feldern besteht. (Der Einfachkeit halber sind die Felder orthogonal, also schachbrettartig angelegt. Also erst mal keine hexagonalen Felder.)<\/li>\n<li>Das Spielbrett besteht in der Breite und H\u00f6he aus beliebig vielen Feldern. Man kann also ein 8&#215;8-Spiel machen f\u00fcr Schach, ein 10&#215;10 f\u00fcr internationales Dame-Spiel, ein 6&#215;100 f\u00fcr ein Pferderennspiel.<\/li>\n<li>Die Felder k\u00f6nnen verschiedene Typen haben. Zum Beispiel: schwarz oder wei\u00df, aber auch Dschungel, Gebirge, Fluss.<\/li>\n<li>Es gibt Spielfiguren, die sich auf den Feldern bewegen k\u00f6nnen.<\/li>\n<li>Au\u00dferdem soll jede Spielfigur verschiedene Zust\u00e4nde annehmen k\u00f6nnen &#8211; gesund, ohnm\u00e4chtig, verwundert, tot, wie das etwa bei <a href=\"http:\/\/boardgamegeek.com\/image\/361350\/cry-havoc\">Cry Havoc<\/a> verwendet wurde.<\/li>\n<\/ol>\n<p>(Erst sp\u00e4ter kam heraus, dass ich einige Sache \u00fcbersehen hatte. Das ist aber immer so. Es sollte erstens auch noch W\u00fcrfel geben, und vor allem hatte ich mir keine Gedanken dar\u00fcber gemacht, ob mehr als eine Spielfigur auf einem Feld stehen darf oder nicht. Implizit gab es auch die Regel, dass eine Spielfigur nur auf h\u00f6chstens einem Spielfeld stehen kann &#8211; also nicht etwa auf zwei nebeneinander liegenden, bei besonders gro\u00dfen Figuren.)<\/p>\n<p>Zuerst erstellte ich mir f\u00fcr dieses Spiel ein Klassendiagramm:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_1.png\" alt=\"\" title=\"spiel_mvc_1\" width=\"430\" height=\"305\" class=\"aligncenter size-full wp-image-3324\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_1.png 430w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_1-150x106.png 150w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/p>\n<p>(Die Klassen Feldtyp und Zustand sind dabei erst mal nebens\u00e4chlich. Im Prinzip gebe ich in ihnen an einer Stelle zentral an, welche m\u00f6glichen Werte es f\u00fcr diese beiden Eigenschaften im jeweiligen Spiel gibt.)<\/p>\n<p>Damit hatte ich also das Spielmaterial modelliert. Jede Spielfigur kennt ihre Position auf dem Spielbrett, das Spielbrett verwaltet die Figuren und die Felder. Damit sich an dem Spiel \u00fcberhaupt etwas ver\u00e4ndern kann, braucht es noch Methoden, um die Eigenschaften der Modell-Elemente ver\u00e4ndern zu k\u00f6nnen. (Das Modell soll ja insgesamt verschiedene Zust\u00e4nde annehmen k\u00f6nnen, mal mit vielen Figuren auf dem Brett, mal mit wenig, in Ausgangsposition oder im Endspiel.)<\/p>\n<p>Gew\u00fcnscht hatte ich mir am Anfang:<\/p>\n<ul>\n<li>Eine Spielfigur muss man auf eine bestimmte Position auf dem Spielbrett verschieben oder auch ganz davon entfernen k\u00f6nnen<\/li>\n<li>Man muss den Typ eines Feldes \u00e4ndern k\u00f6nnen (schwarz, wei\u00df, Dschungel, Fluss).<\/li>\n<li>Man muss den Zustand einer Figur \u00e4ndern k\u00f6nnen (gesund, ohnm\u00e4chtig, verwundet).<\/li>\n<li>Man muss die Position einer Figur \u00e4ndern k\u00f6nnen (also auf welchen Koordinaten).<\/li>\n<\/ul>\n<p>Das reicht eigentlich f\u00fcrs Spielmaterial. Mein erster Entwurf f\u00fcr <em>Model<\/em> war fertig:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2.png\" alt=\"\" title=\"spiel_mvc_2\" width=\"510\" height=\"369\" class=\"aligncenter size-full wp-image-3325\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2.png 510w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/spiel_mvc_2-150x108.png 150w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/> <\/p>\n<p>Damit man kann schon Spielfiguren erzeugen, platzieren und bewegen. Viel mehr Spielmaterial braucht man nicht. <\/p>\n<p>Aber nat\u00fcrlich sieht man von alledem noch nichts. Das ist ja immer noch das abstrakte Spiel. Und Regeln fehlen ja auch noch. Gemach.<\/p>\n<p>Da solche Aufgaben wie meine, also die mit dem Spiel, beim Programmieren sehr oft vorkommen, gibt es nat\u00fcrlich schon bew\u00e4hrte Ans\u00e4tze, wie man diese Aufgaben l\u00f6st. Dazu geh\u00f6ren sogenannte <a href=\"http:\/\/de.wikipedia.org\/wiki\/Entwurfsmuster\">Entwurfsmuster (design patterns)<\/a>. Die haben coole Namen wie &#8222;Adapter&#8220;, &#8222;Fabrik&#8220;, &#8222;Fliegengewicht&#8220;, &#8222;Chain of Responsibility&#8220;, &#8222;Besucher&#8220; oder Fliegengewicht&#8220;. Kunstst\u00fcck, viele bekannten stammen aus einem <a href=\"http:\/\/de.wikipedia.org\/wiki\/Entwurfsmuster_%28Buch%29\">Buch<\/a>, deren Autoren als &#8222;Gang of Four&#8220; bezeichnet werden. &#8222;GoF&#8220; ist quasi Fachsprache beim Programmieren.<\/p>\n<p>Und ein solches Entwurfsmuster, das explizit im Lehrplan f\u00fcr die 11. Klasse steht, hei\u00dft Model-View-Controller. Damit geht es dann <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2011\/08\/wie-ich-auszog-ein-spiel-zu-programmieren-2-das-mvc-entwurfsmuster.htm\">im n\u00e4chsten Teil weiter<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich bin kein gro\u00dfer Programmierer, aber das Programmieren macht Spa\u00df und ich brauchte einen Anlass zum \u00dcben. Also wollte ich ein Spiel programmieren, etwa Schach oder Mensch \u00e4rgere dich nicht. Aber welches Mensch \u00e4rgere dich nicht? Es gibt so viele: (von Startaq, CC-BY-SA) (von Micha L. Rieser, CC-BY-SA) (von Micha L. Rieser, CC-BY-SA) (von Micha [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3318,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[25],"tags":[227],"class_list":["post-3317","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik"],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ludo1.jpg","_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3317","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=3317"}],"version-history":[{"count":0,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/3317\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/3318"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=3317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=3317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=3317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}