Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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 

 Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - mit Arduinoanschluss-Belegung und WASD Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von das |_ Team, Homepage - 4.02.2021 23:38)
 Als Antwort auf Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD von Dietmar - 3.02.2021 0:20
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 Dietmar,

ein spannendes Geschicklichkeitsspiel!

Leider haben wir nur ein 16x2 LC-Display mit Arduino-kompatibler
Anschlussbelegung. Doch zum Glück gibt es ja den Treiber-Patch fuer Arduino-
I2C-LCD Module im Downloadbereich.  

Nach Einfuegen von drei kurzen Programmzeilen, welche den Treiber aktivieren läuft
das Programm ohne Probleme auch am Arduino LCD. Ansonsten haben wir lediglich die
X,Y-Grenzen im Quelltext von ursprünglich 40x2 auf 16x2 Zeichen geändert und man
kann auch mit den Tasten WASD steuern, falls kein Ziffernblock vorhanden ist.

Ein schönes Kurzweil. Vielen Dank für dieses Programm!

das |_ Team



' ===========================================================================
' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD
' In OCBASIC 1.12a_e1 fuer Open-Maxi von Dietmar Harlos am 31. Januar 2021
' ===========================================================================

' In diesem Programm wird demonstriert, wie Felder auf den Mikrocontrollern
' der OM-Familie realisiert werden koennen. Ausserdem werden die Befehle des
' I2C-LCD veranschaulicht.

' 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 840 Bytes im Programmspeicher und 14 Bytes RAM.

' An dieser Stelle moechte ich mich bei Norbert Klein und bei Dirk von "das
' |_ Team" fuer ihre Unterststuetzung 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 "ommax.def" &
 '+ "omax_ilp.iia" und dieser Quelltext im selben Verzeichnis vorhanden sein.
 '+ Das Programm benoetigt 970 Bytes im Programmspeicher und 14 Bytes im RAM.
' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"              'Definitionen fuer die Open-Maxi


' --- 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.                           '+

DEFINE MAXLENGTH 64         'maximale Laenge der Schlange (Snake)             '~

DEFINE snake &h2aa              'Buffer an 1. Adresse hinter dem USER-RAM
                                'MAXLENGTH*2 Bytes lang

DIM bitarray BYTE               'ein Bitarray
DIM gotgadget BIT[1] OF bitarray 'wird HIGH, wenn altes Gadget eingesammelt
DIM leer      BIT[2] OF bitarray 'wird HIGH, wenn Feld fuer Gadget frei

DIM length BYTE                 'Variablen fuer 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                'temporaere Byte-Variablen

DIM punkte WORD                 'eine 16-Bit-Wordvariable

' --- 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 '&h70 'Fuer PCF8574A mit Adresspins A2:A1:A0 gleich 0:0:0
POKE i2cdelay,20    'Defaultwert nach Programmstart

' 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         'Hier Zufallsgenerator initialisieren

head=0              'Schlange (Snake) initialisieren
tail=1
length=2
POKE snake,1
POKE snake+1,9
POKE snake+2,1
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("+")

' Hauptschleife

WHILE TRUE

  direction=getdirection(direction)   'Tastatur abfragen

  a=goforward(direction)              'einen Schritt machen
'   ?"return"a
'   ?"head"head
'   ?"tail"tail
'   ?
  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 gotgadget THEN
    gotgadget=OFF
    ADD punkte,length
    newgadget
  END IF

  PAUSE 32-length 'progressive Geschwindigkeit 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
    gotgadget=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

  leer=OFF
  WHILE leer=OFF
    y=((RAND SHR 1)+16384)/ 16384 '0..1              /8192 '0..3              '~
    x=((RAND SHR 1)+16384)/  2184'0..15             /1639 '0..19              '~

    FOR a=0 TO length-1
      IF y<>PEEK(snake+2*((head+a) MOD MAXLENGTH)) OR x<>PEEK(snake+2*((head+a) MOD MAXLENGTH)+1) THEN
        leer=ON
      END IF
    NEXT a
  WEND

  ygadget=y
  xgadget=x

  LCDLOCATE ygadget,xgadget   'und darstellen
  LCDPUT ASC("+")

  RETURN

END PROCEDURE

' --- Programmende ----------------------------------------------------------


Passender Link: Verwandt: Arduino-LCD an Open-Micro mit OCBASIC ansteuern, von Joe Fenk.

Meine Homepage: http://visit.ghn-sensorik.de

 Antwort schreiben

Bisherige Antworten:

Korrektur: Spiel "Nibbles" für Open-Maxi + Arduino I2C-LCD + WASD Steuerung (von das |_ Team - 16.02.2021 16:44)
    Re: Korrektur: Spiel "Nibbles" für Open-Maxi + Arduino I2C-LCD + WASD Steuerung (von Dietmar - 17.02.2021 12:23)
Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - mit Arduinoanschluss-Belegung und WASD (von Dietmar - 5.02.2021 0:27)