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 

 Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 3.02.2021 0:20)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD
' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 31. Januar 2021
' ===========================================================================

' In diesem Programm wird demonstriert, wie Felder auf der Open-Maxi
' realisiert werden können. Außerdem werden die Befehle des I²C-LCDs
' veranschaulicht.

' 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 für das LCD und Sockel für den PCF ist schnell
' auf einem Stück 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 muß das "&h70"
' in ein "&h40" geändert werden.

' Gesteuert wird das Programm mit den Tasten im Terminalfenster des PCs.
' 8 für hoch, 2 für runter, 4 für links und 6 für rechts. Unter neueren
' Windowsversionen sollte als Terminal das Terminal32.exe eingesetzt werden.
' Es liegt dem ZIP-Archiv "Übertragungstools für Windows und DOS" bei.

' Das Programm benötigt nur 840 Bytes Programmspeicher und 14 Bytes USER-RAM.

' An dieser Stelle möchte ich mich bei Norbert Klein und bei Dirk von "das
' |_ Team" für ihre Unterstützung bedanken.

' --- 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 gotgadget BIT[1] OF bitarray 'wird HIGH, wenn altes Gadget eingesammelt
DIM leer      BIT[2] OF bitarray 'wird HIGH, wenn Feld für Gadget frei

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

' --- Hauptprogramm ---------------------------------------------------------

PrintSpc=ON         'SPACE vor einem dezimalen PRINT
End2Host=ON         'Bei Programmende gleich in den Host-Modus wechseln

' I²C-Adresse vom PCF8574A für das I²C-LCD und I²C-Bustakt setzen:

POKE i2clcdadr,&h70 'Für PCF8574A mit Adreßpins A2:A1:A0 gleich 0:0:0
POKE i2cdelay,20    'Defaultwert nach Programmstart

' I²C-LCD ansprechen und initialisieren:

PAUSE 2             'Vorgeschriebene Verzögerung für das LCD
LcdLight=ON         'Die Hintergrundbeleuchtung könnte 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              'Löscht den Bildschirm

' Titel:

LCDLOCATE 1,2
LCDPRINT "Nibbles von D.H."
LCDLOCATE 2,3
LCDPRINT "Taste druecken"
GET a               'beliebige Taste im Terminalprogramm drücken
LCDCLS

' Initialisierungen:

RANDOMIZE 0         'Zufallsgenerator initialisieren (z.B. RANDOMIZE TIMER)

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("+")

' Hauptschleife:

WHILE TRUE

  direction=getdirection(direction)   'Tastatur abfragen

  a=goforward(direction)              'einen Schritt machen
'   ?"return"a
'   ?"head"head
'   ?"tail"tail
'   FOR b=0 TO MAXLENGTH-1
'     ?b;PEEK(snake+2*b);PEEK(snake+2*b+1)
'   NEXT b
'   ?
  IF a THEN
    LCDLOCATE 1,2
    LCDPRINT " Ende des Spiels "
    LCDLOCATE 2,3       'Ende: Erreichte Punktzahl ausgeben
    LCDPRINT " Punkte:"
    LCDPRINT punkte
    LCDPUT ASC(" ")
    GOTO abbruch
  END IF

  IF gotgadget THEN                   'evtl. neues Gadget
    gotgadget=OFF
    ADD punkte,length
    newgadget
  END IF

  PAUSE 25  'oder "32-length" für Beschleunigung während des Spiels

WEND
#abbruch

END                 'Zurück 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" AND a<>2 THEN a=1
    IF b="2" AND a<>1 THEN a=2
    IF b="4" AND a<>4 THEN a=3
    IF b="6" AND a<>3 THEN a=4
  END IF

  RETURN a

END FUNCTION

' Einen Schritt nach vorne ausführen

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>3 OR x>19 THEN
    RETURN 255            'außerhalb 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 Größe 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)/8192 '0..3
    x=((RAND SHR 1)+16384)/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: Offizielle Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten:

Korrigierte Version (von Dietmar - 15.02.2021 16:03)
Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - mit Arduinoanschluss-Belegung und WASD (von das |_ Team - 4.02.2021 23:38)
    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)
Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD (von Joachim - 3.02.2021 23:06)
    Re: Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD (von Dietmar - 3.02.2021 23:18)