![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo liebes Forum, in der bisherigen Version konnte das aufzusammelnde Gadget auf der Schlange liegen. Die Prozedur "newgadget" wurde daraufhin entsprechend überarbeitet. Auch die Kommentarzeilen wurden denen der alternativen Version dieses Programmes (für I2C-LCD mit Conrad-Belegung) angeglichen. Hier die Version des Geschicklichkeitsspiels für das 16x2 I2C-LCD nach Arduino-Standard: das |_ Team P.S. Wer knackt unseren High Score... 187 Punkte! :) ' =========================================================================== ' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - Korrigierte Version 1.1 ' In OCBASIC 1.12a_e1 fuer Open-Maxi von Dietmar Harlos am 15. Februar 2021 ' --------------------------------------------------------------------------- ' Adaptiert fuer I2C-LCDs mit Arduino-Anschlussbelegung am 16. Februar 2021 ' von "das |_ Team" (Adaptionen markiert:'+ (hinzu),'- (weg) '~ (geandert) ' Steuerung der Schlange auch ueber die WASD - Tasten moeglich, falls kein ' Ziffernblock vorhanden ist. (s.a.https://de.wikipedia.org/wiki/WASD) ' =========================================================================== ' In diesem Programm wird demonstriert, wie Felder auf der Open-Maxi ' realisiert werden koennen. Ausserdem werden die Befehle des I²C-LCDs ' veranschaulicht. ' Es handelt sich um die fehlerkorrigierte Version. In der bisherigen Version ' konnte das aufzusammelnde Gadget auf der Schlange liegen. Die Prozedur ' "newgadget" wurde ueberarbeitet. ' Verwendet wird das "LCD 204B LED" von Reichelt mit 4*20 Zeichen, das mit ' dem Portexpander PCF8574A auf die gleiche Weise verbunden ist wie bei dem ' I2C-LCD von Conrad Electronic (Bestellnr. 198330). Eine kleine Platine ' mit 16-pol. Wannenstecker fuer das LCD und Sockel fuer den PCF ist schnell ' auf einem Stueck Lochrasterplatine aufgebaut. ' In der Bedienungsanleitung zur Open-Macro und Open-Maxi ist beschrieben, ' wie das LCD mittels Portexpander PCF8574A mit dem I²C-Bus der Open-Maxi ' zu verbinden ist: ' http://om.dharlos.de/doku_omax/index.html ' Dieses Beispielprogramm setzt einen I2C-Portexpander PCF8574A voraus, mit ' dessen Hilfe das LCD angesprochen wird. Bei einem PCF8574 muss das "&h70" ' in ein "&h40" geaendert werden. ' Gesteuert wird das Programm mit den Tasten im Terminalfenster des PCs. ' 8 fuer hoch, 2 fuer runter, 4 fuer links und 6 fuer rechts. Unter neueren ' Windowsversionen sollte als Terminal das Terminal32.exe eingesetzt werden. ' Es liegt dem ZIP-Archiv "Uebertragungstools fuer Windows und DOS" bei. ' Das Programm benoetigt nur 842 Bytes Programmspeicher und 14 Bytes USER-RAM. ' An dieser Stelle moechte ich mich bei Norbert Klein und bei Dirk von "das ' |_ Team" fuer ihre Unterstuetzung bedanken. ' --------------------------------------------------------------------------- ' '+ Adaptiert fuer I2C-LCD's mit Arduinoanschluss-Belegung am 4.Februar 2021 ' '+ von "das |_ Team" (Adaptionen markiert:'+ (hinzu),'- (weg) '~ (geandert) ' '+ Steuerung der Schlange auch ueber die WASD - Tasten moeglich, falls kein ' '+ Ziffernblock vorhanden ist. (s.a.https://de.wikipedia.org/wiki/WASD) ' '+ WICHTIG: Zum erfoglreichen Kompilieren muessen die Dateien "omax.def" & '+ "omax_ilp.iia" und dieser Quelltext im selben Verzeichnis vorhanden sein. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DEFINE MAXLENGTH 32 'maximale Länge der Schlange (Snake) DEFINE snake &h2aa 'Buffer an 1. Adresse hinter dem USER-RAM 'MAXLENGTH*2 Bytes lang DIM bitarray BYTE 'ein Bitarray DIM gotit BIT[1] OF bitarray 'wird HIGH, wenn altes Gadget eingesammelt DIM belegt BIT[2] OF bitarray 'wird HIGH, wenn Gadget auf Schlange liegen würde DIM length BYTE 'Variablen für die Schlange (Snake) DIM head BYTE DIM tail BYTE DIM direction BYTE 'in welche Richtung sich die Schlange bewegt DIM ygadget BYTE 'Koordinaten des einzusammelnden Gadgets DIM xgadget BYTE DIM a,b,x,y BYTE 'temporäre Byte-Variablen DIM punkte WORD 'eine 16-Bit-Wordvariable ' --- System-Erweiterungen einbinden ----------------------------------------'+ INCLUDE "omax_ilp.iia" 'I²C-LCD-Patch einbinden fuer Arduino-Typ LCD ' --- Das Hauptprogramm -----------------------------------------------------'+ #main UIRSwi=ON '\ Patch fuer I²C-LCD mit Arduino Anschluss- '+ i2clcdpatch_init '/ belegung aktivieren. '+ ' --- Hauptprogramm --------------------------------------------------------- PrintSpc=ON 'SPACE vor einem dezimalen PRINT End2Host=ON 'Bei Programmende gleich in den Host-Modus wechseln ' I2C-Adresse vom PCF8574A fuer das I2C-LCD und I2C-Bustakt setzen: POKE i2clcdadr,&h4e 'I2C-Adresse vom LCD mit Arduino-Anschlussbelegung POKE i2cdelay,20 'Geschwindigkeit I2C-Bus: ca. 95 kHz (Defaultwert) ' I2C-LCD ansprechen und initialisieren: PAUSE 2 'Vorgeschriebene Verzoegerung fuer das LCD LcdLight=ON 'Die Hintergrundbeleuchtung koennte invertiert sein LCDINIT 'Setzt LcdErr auf OFF bei ACK vom PCF8574A, IF LcdErr THEN ' sonst auf ON PRINT "NoAck vom I2C-LCD" END END IF LCDCLS 'Loescht den Bildschirm ' Titel: LCDLOCATE 0,0 '1,2 '~ LCDPRINT "Nibbles von D.H." '~ LCDLOCATE 1,0 '2,3 LCDPRINT "Taste druecken" GET a 'beliebige Taste im Terminalprogramm druecken LCDCLS ' Initialisierungen: RANDOMIZE 0 'Zufallsgenerator initialisieren head=0 'Schlange (Snake) initialisieren tail=1 length=2 POKE snake,1 'y-Koordinate POKE snake+1,9 'x-Koordinate POKE snake+2,1 'jeweils 2 Bytes bilden einen Punkt der Schlange POKE snake+3,10 direction=3 FOR a=0 TO length-1 'Auf dem LCD darstellen LCDLOCATE PEEK(snake+2*a),PEEK(snake+2*a+1) LCDPUT ASC("*") NEXT a ygadget=1 'einzusammelndes Gadget initialisieren xgadget=4 LCDLOCATE ygadget,xgadget 'und darstellen LCDPUT ASC("+") bitarray=0 'einige Variablen initialisieren punkte=0 ' Hauptschleife: WHILE TRUE direction=getdirection(direction) 'Tastatur abfragen a=goforward(direction) 'einen Schritt machen ' ?"return"a 'Debugging ' ?"head"head ' ?"tail"tail ' ?"ygadget"ygadget ' ?"xgadget"xgadget ' ?"direction"direction ' ?"length"length ' FOR b=0 TO MAXLENGTH-1 ' ?b;PEEK(snake+2*b);PEEK(snake+2*b+1) ' NEXT b ' ? IF a THEN LCDLOCATE 0,0 '1,2 '~ LCDPRINT "Ende des Spiels " '~ LCDPRINT " Ende des Spiels " LCDLOCATE 1,0 '2,3 'Ende: Erreichte Punktzahl ausgeben '~ LCDPRINT "Punkte:" '~ LCDPRINT " Punkte:" LCDPRINT punkte LCDPUT ASC(" ") GOTO abbruch END IF IF gotit THEN 'evtl. neues Gadget gotit=OFF ADD punkte,length newgadget END IF PAUSE 32-length 'ansteigende Geschwindgkeit der Schlange 'PAUSE 25 '~ WEND #abbruch END 'Zurueck in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Tastatureingaben empfangen und auswerten FUNCTION getdirection(a) IF RXD THEN b=GET IF (b="8" OR b="w") AND a<>2 THEN a=1 ' ( OR b="w") '~+ IF (b="2" OR b="s") AND a<>1 THEN a=2 ' ( OR b="s") '~+ IF (b="4" OR b="a") AND a<>4 THEN a=3 ' ( OR b="a") '~+ IF (b="6" OR b="d") AND a<>3 THEN a=4 ' ( OR b="d") '~+ END IF RETURN a END FUNCTION ' Einen Schritt nach vorne ausfuehren FUNCTION goforward(a) y=PEEK(snake+2*head) x=PEEK(snake+2*head+1) IF a=1 THEN SUB y,1 ELSE IF a=2 THEN ADD y,1 ELSE IF a=3 THEN SUB x,1 ELSE IF a=4 THEN ADD x,1 END IF IF y>1 OR x>15 THEN ' IF y>3 OR x>19 THEN '~ RETURN 255 'ausserhalb des Bildschirms ELSE IF y=ygadget AND x=xgadget THEN ADD length,1 IF length>=MAXLENGTH THEN RETURN 1 'das Gadget, aber Schlange hat maximale Groesse erreicht END IF gotit=ON ELSE FOR a=0 TO length-1 IF y=PEEK(snake+2*((head+a) MOD MAXLENGTH)) AND x=PEEK(snake+2*((head+a) MOD MAXLENGTH)+1) THEN RETURN 2 'auf der Schlange END IF NEXT a LCDLOCATE PEEK(snake+2*tail),PEEK(snake+2*tail+1) LCDPUT ASC(" ") IF tail=0 THEN tail=MAXLENGTH SUB tail,1 END IF IF head=0 THEN head=MAXLENGTH SUB head,1 POKE snake+2*head,y POKE snake+2*head+1,x LCDLOCATE PEEK(snake+2*head),PEEK(snake+2*head+1) LCDPUT ASC("*") RETURN 0 'normales Feld END FUNCTION ' Ein neues Gadget auf das Spielfeld setzen PROCEDURE newgadget REPEAT y=((RAND SHR 1)+16384)/ 16384 '0..1 /8192 '0..3 '~ x=((RAND SHR 1)+16384)/ 2048 '0..15 /1639 '0..19 '~ ' Die Bitvariable "belegt" auf HIGH setzen, wenn irgendein Feld der Schlange gleich y,x ist: belegt=OFF FOR a=0 TO length-1 IF y=PEEK(snake+2*((head+a) MOD MAXLENGTH)) AND x=PEEK(snake+2*((head+a) MOD MAXLENGTH)+1) THEN belegt=ON END IF NEXT a ' if belegt then 'Debugging ' ?"belegt"belegt ' ?y;x ' end if UNTIL belegt=OFF ' Wiederhole die Schleife, bis "belegt=OFF" ist ygadget=y xgadget=x LCDLOCATE ygadget,xgadget 'und darstellen LCDPUT ASC("+") RETURN END PROCEDURE ' --- Programmende ---------------------------------------------------------- > Meine Homepage: http://visit.ghn-sensorik.de/L-Team/Lvm/ |
Antwort schreiben |