Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Korrektur: Spiel "Nibbles" für Open-Maxi + Arduino I2C-LCD + WASD Steuerung Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von das |_ Team, Homepage - 16.02.2021 16:44)
 Als Antwort auf Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - mit Arduinoanschluss-Belegung und WASD von das |_ Team - 4.02.2021 23:38
das |_ Team nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-Station V1.1, Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station, C-Control 2
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

Bisherige Antworten:

Re: Korrektur: Spiel "Nibbles" für Open-Maxi + Arduino I2C-LCD + WASD Steuerung (von Dietmar - 17.02.2021 12:23)