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)