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 "Mini-Schiffeversenken" Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 17.01.2022 18:54)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station


' ===========================================================================
' Demoprogramm: Spiel "Mini-Schiffeversenken"
' In OCBASIC 1.12a_e1 f├╝r Open-Maxi von Dietmar Harlos am 29. Dezember 2021
' ===========================================================================

' In diesem Programm wird demonstriert, wie Felder/Puffer auf der Open-Maxi
' realisiert werden k├Ânnen. Es wird auch gezeigt, wie auf einzelne BITs des
' BYTE-Arrays elegant zugegriffen werden kann.

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

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"              'Definitionen f├╝r die Open-Maxi

DEFINE feld &h2aa               'Buffer an 1. Adresse hinter dem USER-RAM
                                '10*10=100 Bytes lang

DIM bitarray   BYTE               'Bitarray, in das Feld-BYTEs kopiert werden
DIM belegt     BIT[1] OF bitarray 'ist HIGH, wenn auf Feld Schiff vorhanden
DIM versenkt   BIT[2] OF bitarray 'ist HIGH, wenn Teil des Schiffes versenkt
DIM untersucht BIT[3] OF bitarray 'ist HIGH, wenn Feld bereits untersucht

DIM bitarray2  BYTE                'noch ein Bitarray
DIM frei       BIT[1] OF bitarray2 'ist HIGH, wenn Feld frei
DIM debug      BIT[2] OF bitarray2 'ist HIGH, wenn Debugging aktiv

DIM a,b BYTE                    'tempor├Ąre Byte-Variablen
DIM groesse BYTE                'Gr├Â├če des Schiffs
DIM direction BYTE              'Lage horizontal oder vertikal im Feld
DIM xso,yso BYTE                'Zwischenspeicher f├╝r Koordinaten des Schiffes
DIM buchstabe,zahl BYTE         'Eingaben vom Anwender
DIM anzbelegt BYTE              'Anzahl belegter Felder

DIM x,y WORD                    'tempor├Ąre Word-Variablen
DIM dx,dy WORD                  'Schrittweite beim Verstecken des Schiffes
DIM xs,ys WORD                  'Koordinaten des Schiffes beim Verstecken

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

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

' Titel:

PRINT
PRINT "Mini-Schiffeversenken"
PRINT "====================="

' Initialisierungen:

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

debug=ON 'OFF       'Schiffe anzeigen

'schiffverstecken 7
'schiffverstecken 6
schiffverstecken 5
schiffverstecken 4
schiffverstecken 3

' Hauptschleife des Programms:

WHILE TRUE
  ?
  anzeigen
  ?
  zaehlen
  IF anzbelegt=0 THEN
    ?:?"Gl├╝ckwunsch! Du hast alle versteckten Schiffe versenkt!"
    GOTO abbruch
  END IF

  ?:?"Welches Feld soll untersucht werden?"
  REPEAT
    ?:?"Bitte Buchstabe A bis J eingeben: ";
    GET buchstabe
    IF buchstabe=ASC(" ") THEN END
    IF buchstabe>=ASC("a") AND buchstabe<=ASC("z") THEN
      buchstabe=buchstabe-32
    END IF
  UNTIL buchstabe>=ASC("A") AND buchstabe<=ASC("J")

  REPEAT
    ?:?"Bitte Zahl 0 bis 9 eingeben: ";
    GET zahl
    IF zahl=ASC(" ") THEN END
  UNTIL zahl>=ASC("0") AND zahl<=ASC("9")
  ?:?

  x=buchstabe-ASC("A")
  y=zahl-ASC("0")
  bitarray=PEEK(feld+y*10+x)    'BYTE des Feldes ins USER-RAM kopieren

  IF untersucht THEN        'jetzt k├Ânnen die BITs abgefragt & gesetzt werden
    ?"Dieses Feld hast Du schon einmal untersucht!"
  ELSE IF belegt THEN
    ?"Treffer! Du hast einen Teil eines Schiffes getroffen."
    versenkt=TRUE
    untersucht=TRUE
    belegt=FALSE
  ELSE
    ?"Das war kein Treffer."
    untersucht=TRUE
  END IF

  POKE feld+y*10+x,bitarray    'BYTE wieder in das Feld kopieren
WEND

#abbruch

?:?"Programmende."
END                 'Zur├╝ck in den Hostmodus. Neustart mit RETURN-Taste.

' --- Subroutinen und Funktionen --------------------------------------------

' Ein Schiff einer bestimmten Gr├Â├če im Feld mittels Brute Force placieren

PROCEDURE schiffverstecken(groesse)
  REPEAT
    xs=((RAND SHR 1)+16384)/3277  '0..9
    ys=((RAND SHR 1)+16384)/3277  '0..9
    xso=xs : yso=ys             'Koordinaten zwischenspeichern

    dx=0 : dy=0
    direction=((RAND SHR 1)+16384)/16384  '0..1
    IF direction=0 THEN
      dx=((RAND SHR 1)+16384)/16384  '0..1
      dx=dx*2-1                      '-1 oder 1
    ELSE
      dy=((RAND SHR 1)+16384)/16384  '0..1
      dy=dy*2-1                      '-1 oder 1
    END IF

    frei=TRUE
    FOR a=1 TO groesse
      IF feldfrei(xs,ys)=FALSE THEN
        frei=FALSE
      END IF
      ADD xs,dx
      ADD ys,dy
    NEXT a
  UNTIL frei=TRUE

  xs=xso : ys=yso               'und Schiff ins Feld einf├╝gen
  FOR a=1 TO groesse
    bitarray=PEEK(feld+ys*10+xs)
    belegt=TRUE
    POKE feld+ys*10+xs,bitarray
    ADD xs,dx
    ADD ys,dy
  NEXT a

  RETURN
END PROCEDURE

' Feststellen, ob ein Feld frei ist f├╝r das Schiff

FUNCTION feldfrei(x,y)
  IF x<0 OR x>9 OR y<0 OR y>9 THEN
    RETURN 0
  END IF
  bitarray=PEEK(feld+y*10+x)
  IF belegt THEN
    RETURN 0
  END IF
  RETURN TRUE
END FUNCTION

' Anzeige des Spielfeldes

PROCEDURE anzeigen
  ?"  a b c d e f g h i j"
  FOR b=0 TO 9
    PUT ASC("0")+b
    FOR a=0 TO 9
      PUT ASC(" ")
      bitarray=PEEK(feld+b*10+a)
      IF versenkt THEN
        ?"*";
      ELSE IF untersucht THEN
        ?"O";
      ELSE IF debug AND belegt THEN
        ?"+";
      ELSE
        ?"-";
      END IF
    NEXT a
    PUT ASC(" ")
    PUT ASC("0")+b
    ?
  NEXT b
  ?"  a b c d e f g h i j"

  RETURN
END PROCEDURE

' Anzahl Felder z├Ąhlen, die noch mit Schiffen belegt sind

PROCEDURE zaehlen
  anzbelegt=0
  FOR b=0 TO 9
    FOR a=0 TO 9
      bitarray=PEEK(feld+b*10+a)
      IF belegt THEN
        ADD anzbelegt,1
      END IF
    NEXT a
  NEXT b
  ?"Es sind noch";anzbelegt" Felder mit Schiffen belegt."
  RETURN
END PROCEDURE

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


Passender Link: Infosite zu den OM-Mikrocontrollern

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

 Antwort schreiben

Bisherige Antworten:

Re: Demoprogramm: Spiel "Mini-Schiffeversenken" (von Christian - 20.01.2022 20:53)