SBC6809 - Basic game: Battleships. Part-10.

By Administrator at novembra 10, 2023 08:08
Filed Under: SBC8085-NCB85

Keď som napísal hru Battleship pre SBC6502 tak som si povedal - musí to priamo fungovať aj pre SBC6809. Chyba lávky, ako obyčajne ak si myslím že niečo bude hodne jednoduché tak som sa zase mýlil. Ako sa ukázalo - nedala sa hra napísaná pre SBC6502 priamo spustiť aj na SBC6809, niektoré ASCII znaky to z nejakých príčin čiastočne ignoruje a tak som musel urobiť čiastočnú prerábku /konverziu/ tejto hry - vďaka tomu tu "odpadla" úvodná ASCII obrazovka lode. Pri ďalšom som zistil že tiež generovanie RND vyžadovalo v sebe urobiť zmenu. Ďalšia vec - SBC6809 nepozná príkaz SPC(číslo), čiže som ho všade musel nahradiť príkazom TAB(číslo). Riadky v programe som chcel "zahustiť", boli by podstatne dlhšie ako pri SBC6502, pretože toto SBC6809 pri písaní programu dovoľuje, teda obsahy riadkov by boli extrémne dlhé, parádne to môže skrátiť zápis, na druhú stranu je to potom na úkor prehľadnosti, rozhodne sa to zle číta v terminálovom okne, takže som zostal pri pôvodnej dĺžke riadkov. Na druhú stranu - je tu len jedna verzia programu, pretože procesor 6809 beží na 1.8432MHz a teda tu nejaké zmeny clocku príliš nehrozia. Program ráta s SBC6809 a dostupnou 32kB RAM, je to dané umiestnením dvojrozmerného poľa v RAM.

No a čo dodať na záver? - teraz tomu síce chýba efektná úvodná obrazovka ale program funguje.


Jednoduchá úvodná obrazovka.

 

Aj hracie pole vďaka neschopnosti "tlačiť" niektoré znaky na obrazovku je pozmenené

a tedy prišlo k úprave vzhľadu hracej plochy.


Síce viem tam tie znaky dostať aj inakším spôsobom, ale bolo by to zbytočne zložité a tak som sa rozhodol hru nekomplikovať a vyriešil som to tak ako to je teraz. V hracom poli je to iné, tam sa zapisuje pomocou POKE priamo do RAM, tam to ide jednoduchšie a teda tam je problém na 100% vyriešený. Vyznať sa v tom dá - a hrať sa to dá tak isto. Môžem skonštatovať že teraz aj SBC6809 má funkčnú konverziu uvedenej hry.

S_battle_1_8432MHz_SBC6809.txt (5,23 kb)


SBC6809

______________________________________________________

12.11.2023

Pre tých ktorí majú radi dlhé riadky ktoré umožňuje zápis v  SBC6809 ... je tu hra uložená aj v tomto formáte, aspoň som to skúsil, funguje tak isto:

S_battle_1_8432MHz_SBC6809_long_rows.txt (4,95 kb)

(Pritom sa tu ani zďaleka nevyužíva plná dĺžka programového riadku - je to až 250 znakov.)

____________________________________________________________

Listing programu pre SBC6809:

 

 1000 CLEAR:POKE 15,80:? CHR$(12):?:A=31000:B=124:REM 05.11.2023
 1160 ?:?:? TAB(26)"- SBC6809 - Battleships game -"
 1170 ? TAB(22);"by Igi(c)2023 - http://blog.3b2.sk/igi";
 1172 GOSUB 9999
 1200 ? CHR$(12):GOSUB 2500:GOSUB 2700
 1400 ?:? CHR$(12);
 1410 ? TAB(5)"+- 20 battleships in this game,you have to destroy";
 1415 ? " at least 14 ships -+"
 1417 ? TAB(4)"+-------------+--";
 1420 ? "+....X....1111111111222222222233333333334";
 1422 ? "+-----------+"
 1425 ? TAB(18)"+Y +1234567890123456789012345678901234567890+"
 1430 GOSUB 5100
 1700 A=31000:GOSUB 2900:A=31050:GOSUB 2900:A=31100:GOSUB 2900
 1706 A=31150:GOSUB 2900:A=31200:GOSUB 2900:A=31250:GOSUB 2900
 1714 A=31300:GOSUB 2900:A=31350:GOSUB 2900:A=31400:GOSUB 2900
 1720 A=31450:GOSUB 2900:A=31500:GOSUB 2900:A=31550:GOSUB 2900
 1726 A=31600:GOSUB 2900:A=31650:GOSUB 2900
 1800 GOSUB 5100
 1805 ? TAB(18)"+Score:";:IF SC<10 THEN ?" "SC;
 1820 IF SC=>10 THEN ? SC;
 1825 ? TAB(17)"Gun shots: "GS;
 1830 IF GS<10 THEN ? "  +"
 1835 IF GS=>10 AND GS <100 THEN ? " +"
 1840 IF GS=>100 THEN ? "+"
 1845 ? TAB(18)"+------------- X or Y=0 -> End -------------+"
 1850 IF SC=14 THEN 2940
 1880 ? TAB(28)"Your choice X (1-40)";:INPUT X
 1885 IF X=0 THEN 2950
 1890 IF X>40 THEN GOSUB 9988:GOTO 1400
 1900 ? TAB(28)"Your choice Y (1-14)";:INPUT Y
 1905 IF Y=0 THEN 2950
 1910 IF Y>14 THEN GOSUB 9988:GOTO 1400
 2000 T=31700:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2002 T=31702:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2004 T=31704:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2006 T=31706:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2008 T=31708:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2010 T=31710:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2012 T=31712:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2014 T=31714:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2016 T=31716:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2018 T=31718:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2020 T=31720:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2022 T=31722:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2024 T=31724:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2026 T=31726:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2028 T=31728:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2030 T=31730:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2032 T=31732:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2034 T=31734:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2036 T=31736:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000
 2038 T=31738:GOSUB 2800:IF X=X1 AND Y=Y1 THEN 3000  
 2050 GS=GS+1
 2055 IF X<>X1 OR Y<>Y1 THEN 4000
 2250 C=C+1:?C;:FOR F=A+4 TO A+43:POKE F,46:NEXT F:RETURN
 2500 GS=0:SC=0:C=0:?"I am generating a line no.:"
 2552 A=31000:GOSUB 2250
 2555 POKE A,B:POKE A+1,32:POKE A+2,49:POKE A+3,B:POKE A+44,B
 2560 A=31050:GOSUB 2250
 2562 POKE A,B:POKE A+1,32:POKE A+2,50:POKE A+3,B:POKE A+44,B
 2570 A=31100:GOSUB 2250
 2572 POKE A,B:POKE A+1,32:POKE A+2,51:POKE A+3,B:POKE A+44,B
 2580 A=31150:GOSUB 2250
 2582 POKE A,B:POKE A+1,32:POKE A+2,52:POKE A+3,B:POKE A+44,B
 2590 A=31200:GOSUB 2250
 2592 POKE A,B:POKE A+1,32:POKE A+2,53:POKE A+3,B:POKE A+44,B
 2600 A=31250:GOSUB 2250
 2602 POKE A,B:POKE A+1,32:POKE A+2,54:POKE A+3,B:POKE A+44,B
 2610 A=31300:GOSUB 2250
 2612 POKE A,B:POKE A+1,32:POKE A+2,55:POKE A+3,B:POKE A+44,B
 2620 A=31350:GOSUB 2250
 2622 POKE A,B:POKE A+1,32:POKE A+2,56:POKE A+3,B:POKE A+44,B
 2630 A=31400:GOSUB 2250
 2632 POKE A,B:POKE A+1,32:POKE A+2,57:POKE A+3,B:POKE A+44,B
 2640 A=31450:GOSUB 2250
 2642 POKE A,B:POKE A+1,49:POKE A+2,48:POKE A+3,B:POKE A+44,B
 2650 A=31500:GOSUB 2250
 2652 POKE A,B:POKE A+1,49:POKE A+2,49:POKE A+3,B:POKE A+44,B
 2660 A=31550:GOSUB 2250
 2662 POKE A,B:POKE A+1,49:POKE A+2,50:POKE A+3,B:POKE A+44,B
 2670 A=31600:GOSUB 2250
 2672 POKE A,B:POKE A+1,49:POKE A+2,51:POKE A+3,B:POKE A+44,B
 2680 A=31650:GOSUB 2250
 2682 POKE A,B:POKE A+1,49:POKE A+2,52:POKE A+3,B:POKE A+44,B
 2684 ?:RETURN
 2700 Q=31700:?:?"I am generating 20 battleships ..."
 2705 FOR I=1 TO 20
 2710 D=INT(RND(0)*14):D=D+1:POKE Q,D
 2720 E=INT(RND(0)*40):E=E+1:POKE Q+1,E
 2725 Q=Q+2:? I;:FOR R=0 TO 300:NEXT:NEXT:RETURN
 2800 Y1=PEEK(T):X1=PEEK(T+1):RETURN
 2900 ? TAB(18);:FOR F=A TO A+44:? CHR$(PEEK(F));:NEXT F:?
 2905 RETURN
 2940 ?TAB(16)"Congratulations! You destroyed the enemy's fleet."
 2945 GOTO 2955
 2950 ? CHR$(12)
 2955 ?:?TAB(28)"(N)ew game or (Q)uit:";:INPUT A$
 2960 IF A$="N" THEN 1200
 2965 IF A$="Q" THEN END
 2970 GOTO 2950
 3000 ?TAB(35)"Bingo !!!";:GOSUB 9998:SC=SC+1:OP=134:GOSUB 5000
 3080 GS=GS+1:GOTO 1400
 4000 ?TAB(36)"Miss !!!";:GOSUB 9998:OP=120:GOSUB 5000:GOTO 1400
 5000 IF Y=1 THEN POKE (31004+X-1),OP
 5010 IF Y=2 THEN POKE (31054+X-1),OP
 5015 IF Y=3 THEN POKE (31104+X-1),OP
 5025 IF Y=4 THEN POKE (31154+X-1),OP
 5030 IF Y=5 THEN POKE (31204+X-1),OP
 5035 IF Y=6 THEN POKE (31254+X-1),OP
 5040 IF Y=7 THEN POKE (31304+X-1),OP
 5045 IF Y=8 THEN POKE (31354+X-1),OP
 5050 IF Y=9 THEN POKE (31404+X-1),OP
 5055 IF Y=10 THEN POKE (31454+X-1),OP
 5060 IF Y=11 THEN POKE (31504+X-1),OP
 5065 IF Y=12 THEN POKE (31554+X-1),OP
 5070 IF Y=13 THEN POKE (31604+X-1),OP
 5075 IF Y=14 THEN POKE (31654+X-1),OP
 5080 RETURN
 5100 ? TAB(18)"+-------------------------------------------+"
 5102 RETURN
 9988 ?TAB(37)"Error ...";:GOSUB 9998:RETURN
 9998 FOR F=0 TO 2255:NEXT:RETURN
 9999 FOR F=0 TO 7518:NEXT:RETURN

_____________________________________________________________

Upozornenie:


Zobrazenie krížiku platí pre nastavenie fontu v Hypertermináli, kedy je jeho okno zmenšené - písmo Lucida Console, veľkosť písma 8, osobne používam najradšej túto veľkosť Hyperterminálového okna:

 

 

Ak ponecháme základné nastavenie fontu čo je písmo Terminal, veľkosť písma 14:

 

 

tak musíme v programovom riadku číslo 3000 urobiť zmenu, pôvodný text:

 

 3000 ?SPC(35)"Bingo !!!";:GOSUB 9998:SC=SC+1:OP=134:GOSUB 5000

nahradíme:

 3000 ?SPC(35)"Bingo !!!";:GOSUB 9998:SC=SC+1:OP=127:GOSUB 5000

 

Čiže je tu zmena v obsahu použitej premennej OP - po tejto zmene sa zobrazí namiesto krížiku pri zásahu lodička , ak sa zmena neprevedie bude sa zobrazovať iný, vzhľadom nie vhodný  znak. Toto samozrejme platí aj v opačnom garde. Je to dané tým, že uvedené dva fonty používajú mierne odlišnú znakovú sadu.

____________________________________________________________

Vaše hodnotenie, Rate post:

Info o autorovi

Volám sa Igor Gramblička, bydlisko: Bratislava, Slovakia. Môj nick: Igi. Blog je o mojich záujmoch, predtým som pracoval ako IT špecialista na počítačové siete a redakčné systémy pre viaceré denníky - až som pred rokmi nakoniec v jednom z nich zakotvil a kde som to potiahol až do konca mojej profesnej kariéry.

Rok, mesiac, počet článkov: