{"id":1237,"date":"2023-12-27T13:37:13","date_gmt":"2023-12-27T13:37:13","guid":{"rendered":"https:\/\/research.swissdigitization.ch\/?p=1237"},"modified":"2024-04-22T07:36:55","modified_gmt":"2024-04-22T07:36:55","slug":"basic-eine-erfolgreiche-radiation-hin-zum-aussterben-und-ein-action-game-experiment","status":"publish","type":"post","link":"https:\/\/research.swissdigitization.ch\/?p=1237","title":{"rendered":"BASIC &#8211; eine (\u00fcber)erfolgreiche adaptive Radiation (Anpassung in \u00d6kosysteme) und ein Action-Game-Experiment"},"content":{"rendered":"\n<p>BASIC (<a href=\"https:\/\/www.dartmouth.edu\/basicfifty\/basic.html\">mehr dazu hier &gt;<\/a>) erfunden in den 60er Jahre (noch weitgehend im CommandLine Input\/Output Frame) hat eine lange Geschichte der Radiation hinter sich.  BASIC fehlte strategisch so etwas wie inkludierbare Frameworks, die dann auf jedem System wieder anders implementiert werden mussten. Es war ja auch unter anderem als Programmiersprache f\u00fcrs Lernen konzipiert worden.<\/p>\n\n\n\n<p>Es entstanden deswegen eine Menge verschiedene Dialekte, in denen eigentlich nur noch die Grundbefehle gemeinsam sind, aber selbst die Nutzung dieser 26-Grundbefehle ist oft unterschiedlich (Dim-Defintionen etwa). Man kann sich sogar fragen, ob selbst Assembler-Programme ohne Zeilennummern &#8218;moderner&#8216; waren. Vor allem die 80er Jahre mit ihren Basic-HomeComputer-Interfaces waren pr\u00e4gend. Und so l\u00e4uft fast kein Basic-Programm auf verschiedenen Plattformen.  Noch einschneidender war selbstverst\u00e4ndlich das Aufkommen von Zeilenlosen-Basics wie etwa GFA-Basic ab den 16\/32Bit-Homecomputern, das eine Kompatibilit\u00e4t fast unm\u00f6glich machte.<\/p>\n\n\n\n<p>Will man heute ein BASIC Programm schreiben, das auf so vielen Plattformen wie m\u00f6glich l\u00e4uft, muss man sich start beschr\u00e4nken auf die minimalen Befehle. Das schwierigste ist nat\u00fcrlich die Ausgabe, da BASIC in seiner urspr\u00fcnglichen Form eigentlich auf LinePrinter ausgelegt ist (60er Jahre) bzw. Bildschirme als Lineprinter funktionierten. Grafikbefehle Fehlanzeige. Der Rechner war hier wirklich als &#8222;Rechner&#8220; gedacht. <\/p>\n\n\n\n<p>Noch schwieriger ist es, etwas im Action-Bereich zu machen. Also da, wo es um Keypressing geht und das optionale Nutzen von Input. Hier wird es sehr schwierig, da das Dartmouth-Basic, soweit ich das sehe, \u00fcber kein eigenes Kommando  verf\u00fcgt und so jede Implementation dann selbst etwas &#8222;gewurstelt&#8220; hat, um das zu erm\u00f6glichen. Ein weiteres Problem ist selbstverst\u00e4ndlich die M\u00f6glichkeit irgendwie die Geschwindigkeit zu messen, bei heute im Vergleich zu damals unendlich schnellen Systemen.<\/p>\n\n\n\n<p>Die letzten zwei Anforderungen muss man also auf jeder Installation &#8211; soweit ich das sehe &#8211; selbst implementieren. <\/p>\n\n\n\n<p><strong>Action-Angehauchtes &#8222;Be Jeweled&#8220; oder 3+ gewinnt<\/strong><\/p>\n\n\n\n<p>Anbei wurde versucht ein einfaches BASIC-Spiel zu implementieren, dass ActionAspekte hat und dennoch auf allen Plattformen ohne grosse Anpassungen laufen wird (Zeilenbasiert). <\/p>\n\n\n\n<p>Herausgekommen ist am Ende ein vereinfachtes &#8222;Be jeweled&#8220; mit Lineprint als Ausgabe. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1010\" height=\"528\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/12\/Bildschirmfoto-2023-12-27-um-13.58.35.png\" alt=\"\" class=\"wp-image-1242\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/12\/Bildschirmfoto-2023-12-27-um-13.58.35.png 1010w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/12\/Bildschirmfoto-2023-12-27-um-13.58.35-300x157.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/12\/Bildschirmfoto-2023-12-27-um-13.58.35-768x401.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/12\/Bildschirmfoto-2023-12-27-um-13.58.35-624x326.png 624w\" sizes=\"auto, (max-width: 1010px) 100vw, 1010px\" \/><\/figure>\n\n\n\n<p>Das Spiel schreitet voran und f\u00fcgt per PRINT neue &#8222;Edelsteine&#8220; hinzu. Dabei wartet das Spiel eine Sekunde, bis der n\u00e4chste Stein angeh\u00e4ngt wird. In dieser Zeit kann der Spielende seinen Stein anf\u00fcgen. Im vorliegenden Fall ist es ein &#8222;.&#8220;. Danach wird die Linie beeendet und abgerechnet.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Game Design Specials<\/strong><\/p>\n\n\n\n<p>Interessant ist an dieser Art Spiele zu entwerfen, dass man niemals zur\u00fcck kann, sondern nur vorw\u00e4rts (nach unten). Das heisst alle sich ver\u00e4ndernden Daten m\u00fcssen angef\u00fcgt werden. Die Innovation beim vorliegenden Fall liegt in der Nutzung auch dieser schon &#8222;genutzten&#8220; Steine f\u00fcr das aktuelle Spielgeschehen.<\/p>\n\n\n\n<p>Dies trifft ebenso auf den Score zu, dieser wird erst in der n\u00e4chsten Line upgedatet. Und so kann selbstverst\u00e4ndlich auch immer nur ein Stein pro Linie eingesetzt werden. Die Einschr\u00e4nkungen sind krass und so muss die Spielmechanik angepasst werden, um etwas Spiebares zu kreieren. Das Spiel schreibt also &#8211; wie bei LPrintern \u00fcblich &#8211; seine eigene Geschichte. Der Screen ist dabei nicht ausschliesslich der aktuelle Zustand des Spiels, der immer wieder \u00fcberschrieben wird.<\/p>\n\n\n\n<p>Visuell sind solche Spiele schwierig wie alle Zeichensatzspiele: Denn wir erkennen sehr gut Zeichen Buchstaben und diese sind schwer abl\u00f6sbar von ihrem Zeichencharakterkontext. Und ja: Es gibt Spezialzeichen. Nur bei welchen Systemen ist das je gleich? Wer unterst\u00fctzt dann reines ASCII etc.<\/p>\n\n\n\n<p><strong>Source-Code<\/strong><\/p>\n\n\n\n<p>Der folgende Source-Code ist noch nicht optimiert (auf andere System). zeigt aber schon in welche Richtung, die Varianten gehen k\u00f6nnten. <\/p>\n\n\n\n<p><strong>GW-Basic<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10 \n60 rem settings\n80 invspeed = 60\n100 gosub 5000\n110 print \"ONE BUTTON JEWELERY\"\n111 print \"usage: &lt;a&gt; set stone &lt;s&gt; one forward\"\n120 print \" \"\n500 score = 0\n510 lines = 0\n520 x = 0\n530 act$ = \"#\"\n540 dim gfield(10,1000)\n1000 rem next line\n1001 gosub 6000\n1002 act$ = ch$\n1005 x = 0\n1006 mode$ = \"interactive\"\n1007 result$ = \"\"\n1008 if score&lt;100 then print \" \";\n1009 if score &lt;10 then print \" \";\n1010 print score;\" | \";lines;\" | \";act$;\" | \";\n1100 gosub 6000\n1110 rem\n1119 keypressed = 0\n1120 if lines&lt;2 then mode$ = \"forward\"\n1190 if mode$&lt;&gt;\"interactive\" then goto 1410\n1200 for h = 0 to invspeed \n1300 rem check\n1305 rem\n1310 a$=inkey$\n1320 if a$=\"a\" then ch$ = act$\n1330 if a$=\"a\" then mode$ = \"endline\"\n1332 if a$=\"a\" then result$ = \" &lt; \"\n1333 if a$=\"a\" then keypressed = 1\n1340 if a$=\"a\" then goto 1410\n1350 if a$=\"s\" then goto 1410\n1360 if a$&lt;&gt;\"u\" then goto 1400\n1370 print \"debug\"\n1381 for n=0 to lines\n1382 for nn = 0 to 10\n1383 print gfield(nn);\" - \";\n1384 next nn\n1385 print \" \"\n1386 next n\n1400 next h\n1410 print ch$;\n1411 let fieldval = 0\n1412 gosub 7000\n1420 gfield(x,lines)= fieldval\n1425 if keypressed = 0 then goto 2000\n1430 rem check all - vertical - horizontal etc\n1431 tempscore = 0\n1432 for q=0 to 3\n1433 vx = 0\n1434 vy = -1\n1435 gosub 7000\n1438 if q=3 then vy = 0\n1439 if q=3 then vx = -1\n1440 count = 0\n1441 if q=1 then vx = -1\n1442 if q=2 then vx = 1\n1443 startx = x\n1444 starty = lines\n1445 startx = startx + vx\n1446 starty = starty + vy\n1447 count = count + 1\n1460 if startx&lt;0 then goto 1500\n1461 if starty&lt;0 then goto 1500\n1462 if startx&gt;10 then goto 1500\n1470 if gfield(startx,starty)=fieldval then goto 1445\n1500 rem how many counted?\n1510 rem result$ = result$ + \"counted \";count\n1511 direction$ = \" | \"\n1512 if q=1 then direction$ = \" \\ \"\n1513 if q=2 then direction$ = \" \/ \"\n1514 if q=3 then direction$ = \" - \"\n1520 if count&gt;2 then tempscore = tempscore + count*10\n1521 if count&gt;2 then result$ = result$ + \" \" + count + \"*\"+direction$\n1600 next q\n2000 x = x + 1\n2010 rem\n2020 rem\n2400 if x&lt;10 then goto 1100\n2405 score = score + tempscore\n2407 if tempscore&gt;0 then result$ = result$ + \" + \"+tempscore\n2410 if result$&lt;&gt;\"\" then print result$;\n2500 print \" \"\n2510 lines = lines + 1\n2600 rem\n3900 goto 1000\n4000 end\n5000 rem cls\n5010 for t=0 to 40\n5020 print \" \"\n5030 next t\n5040 return\n6000 rem get next char\n6010 c = rnd(4)\n6020 ch$ = \"#\"\n6030 if c=1 then ch$ = \"O\"\n6040 if c=2 then ch$ = \"X\"\n6050 if c=3 then ch$ = \".\"\n6060 return\n7000 rem get field value from ch$\n7005 fieldval = 0\n7010 if ch$=\"X\" then fieldval = 1\n7020 if ch$=\"O\" then fieldval = 2\n7030 if ch$=\".\" then fieldval = 3\n7040 return<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>BASIC (mehr dazu hier &gt;) erfunden in den 60er Jahre (noch weitgehend im CommandLine Input\/Output Frame) hat eine lange Geschichte der Radiation hinter sich. BASIC fehlte strategisch so etwas wie inkludierbare Frameworks, die dann auf jedem System wieder anders implementiert werden mussten. Es war ja auch unter anderem als Programmiersprache f\u00fcrs Lernen konzipiert worden. Es [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,1],"tags":[],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-basic","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/1237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1237"}],"version-history":[{"count":11,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/1237\/revisions"}],"predecessor-version":[{"id":1251,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/1237\/revisions\/1251"}],"wp:attachment":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}