INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' 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 "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 |