Welcome, Guest. Please login or register.


Author Topic: Bomber Plus (Read 24587 times)

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1291
  • Country: hu
  • Stray cat from Commodore alley
Re: Bomber Plus
« Reply #120 on: 2016.June.06. 20:08:45 »
A véletlenszám generátor determinisztikus. Azonos kiinduló értékekből mindig ugyan azt a sorozatot fogja legenerálni. Írhattam volna hosszabb kiíratást is, de hogy látsszon az elv ennyi is elég.

A pálya generálása előtt lemented ezt a három számot, és a mentés fájlba beleírod azokkal a további adatokkal együtt, amiket most is mentesz. Visszatöltéskor visszaírod a három számot a helyére, aminek hatására a pályageneráláshoz használt véletlenszámok azonosak lesznek az eredeti lefutáskor kapott számsorral. Létrehozod újra a pályát, elvégzed rajta a mentett módosításokat és vissza bedobod a játékmotorba.

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #121 on: 2016.June.06. 22:42:54 »
A pálya generálása előtt lemented ezt a három számot
Mármint melyik három számot? Azt értem, hogy az adott poke-okra visszatér oda, ahol előtte volt, de a kiinduló értéket hogyan lehet meghatározni? Mert amit mellékeltél snapshotot, ott is mindig ugyanaz fut le, de a számok minden futtatáskor mások. Hogyan érhetem el, hogy ugyanazokat lehessen előhívni? Lehet, nagyon triviális a válasz...
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1291
  • Country: hu
  • Stray cat from Commodore alley
Re: Bomber Plus
« Reply #122 on: 2016.June.07. 07:51:09 »
Mármint melyik három számot? Azt értem, hogy az adott poke-okra visszatér oda, ahol előtte volt, de a kiinduló értéket hogyan lehet meghatározni? Mert amit mellékeltél snapshotot, ott is mindig ugyanaz fut le, de a számok minden futtatáskor mások. Hogyan érhetem el, hogy ugyanazokat lehessen előhívni? Lehet, nagyon triviális a válasz...
Na, akkor vegyük végig szépen sorban. Kezdünk egy RANDOMIZE utasítással, ami valamilyen módon feltölti kiinduló értékkel a véletlenszám generátort. Következőnek kiolvasunk a memóriából három értéket és megjegyezzük őket. Ezután dobatunk a géppel három (lehetne több is, csak minek) véletlenszámot, amiket kiíratunk. Utána a három megjegyzett számot visszaírjuk a memóriába azokra a helyekre ahonnan kiolvastuk őket. Ezután újra dobatunk a géppel három véletlenszámot, amiket kiíratunk.

Azt tapasztaljuk, hogy minden lefutásonként különböző számsorokat kapunk, azonban az első három szám sorrendben megegyezik a második hárommal. Azt látjuk, hogy a lefuttatott utasítások visszaállították a generátort egy korábbi ismert állapotba, és onnan pontosan azonos sorozatot állított elő.

Ha most kipróbálnánk - szerintem csináld is meg - azt, hogy a harmadik kiírás után és a POKE-ok elé beszúrnánk egy RANDOMIZE utasítást és három újabb kiíratást, akkor azt látnánk, hogy kapunk három számot, utána még hármat ami valószínűleg teljesen különbözik az első háromtól, és végül még hármat amik sorrendben azonosak az első hárommal.

Így már világosabb?

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #123 on: 2016.June.07. 13:28:52 »
Szóval a lényege, hogy ha nem lenne RANDOMIZE a program elején, akkor eleve ugyanazok jönnének végig véletlenszámként minden programfutás során.

Következőnek kiolvasunk a memóriából három értéket és megjegyezzük őket.
Szóval csak ezeket a megjegyzett értékeket kell eltárolni későbbre, és megkapjuk ugyanazt a pályát, ha ezeket az értékeket visszatöltjük akár fájlból, és bepoke-oljuk.
Végülis akkor ilyen módon nem kéne a házak színét és magasságát sem elmenteni, hanem csak az egésznek a generálása előtt a három véletlen értéket letárolni/visszaállítani, nem? Sőt, így még a háztetők is megmaradnának olyannak, mint először.

Egyébként miért 3 peek/poke van? Ha csak egy lenne, akkor nem ugyanoda állna be az egész véletlenszám generálás?
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1291
  • Country: hu
  • Stray cat from Commodore alley
Re: Bomber Plus
« Reply #124 on: 2016.June.07. 15:03:40 »
Szóval a lényege, hogy ha nem lenne RANDOMIZE a program elején, akkor eleve ugyanazok jönnének végig véletlenszámként minden programfutás során.

Szóval csak ezeket a megjegyzett értékeket kell eltárolni későbbre, és megkapjuk ugyanazt a pályát, ha ezeket az értékeket visszatöltjük akár fájlból, és bepoke-oljuk.
Végülis akkor ilyen módon nem kéne a házak színét és magasságát sem elmenteni, hanem csak az egésznek a generálása előtt a három véletlen értéket letárolni/visszaállítani, nem? Sőt, így még a háztetők is megmaradnának olyannak, mint először.

Egyébként miért 3 peek/poke van? Ha csak egy lenne, akkor nem ugyanoda állna be az egész véletlenszám generálás?
Valószínűleg igen, de ezt Zozo, István vagy Bruce tudná biztosra mondani.

Igen, így van.
Nem ismerem a kódodat, de valószínűleg ez is igaz.

Ezt sem tudom, szintén a fenti urak az illetékesek.

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #125 on: 2016.June.07. 21:46:20 »
Ha jól sejtem, ilyen randomos mentés után újra ki kell adni a randomize-t. Hiszen ha a régebbi, "mesterségesen előállított" randomos állapotból folytatjuk tovább a játékot, akkor az ugyanolyan lesz, akárhányszor csak visszatöltjük az adott részt.

Ez a véletlenszám generálás tényleg csak annyi, hogy az előző számból (bonyolult műveletekkel) valahogy előállítja a következő számot? Az nem számít bele, hogy közben mennyi idő telik el? Vagy ha bármi egyéb műveletet végez közben a gép (pl. fut egy megszakítás a háttérben, vagy leütünk néhány billentyűt), az sem befolyásolja az értékeket?
« Last Edit: 2016.June.07. 21:49:28 by szipucsu »
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Bomber Plus
« Reply #126 on: 2016.June.07. 22:29:51 »
http://ep128.hu/Ep_Konyv/Tippek.htm

"Az egy és két byte hosszon tárolt két elővéletlen számból állítja elő az RND értékét. Az RND 65 535 különféle értéket vehet fel, de periodikus ismétlődés csak 524 287 érték után következik be. Az RND kiszámítása (X+32768)/65536 - összefüggéssel történik. A képletbe X értékét a 246-247H memóriarekesz tartalma szolgáltatja. A memóriarekesz tartalma az előző tartalomtól és a 211H címen tárolt értéktől függ. A fenti állítások ellenőrzésére a 4. program szolgál."

Code: [Select]
1 PROGRAM "RND.bas"
100 ! RND kiismerese
110 LET A=RND:LET E=1
120 PRINT "most (211H)=";PEEK(529)
130 PRINT :PRINT
140 LET B=PEEK(582):LET C=PEEK(583)
150 IF C>128 THEN
160   LET C=256-C:LET E=-1
170 END IF
180 PRINT "RND (ahogy a gep adja):";A
190 PRINT "es ahogy kifigyelheto: ";(32768+E*256*C+B)/65536
200 ! ez az 1. szegmens CAA9H rutinjanak Basic szintu modelje
210 PRINT :PRINT
220 PRINT "legkozelebb (211H)=";B
230 GOTO 110
*** Speicherplatz zu klein

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #127 on: 2016.June.07. 23:55:42 »
A képletbe X értékét a 246-247H memóriarekesz tartalma szolgáltatja.
A 246-247H memóriarekesz tartalma mitől függ? Ha valamiért más kerül oda a program következő futtatásakor, akkor más REND jöhet ki, és akkor nem alkalmazható a poke-os módszer?
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #128 on: 2020.December.13. 16:59:47 »
Biztos mindenkinek feltűnt már, hogy a demokazettás Bomberben nem túl szép, hogy ha ledobunk egy bombát, egy pillanatra eltűnik a repülő első karaktere.  Ez akkor a legzavaróbb, ha pont közvetlen a repülő alatt van a ház, amit lebombáztunk, mert a ház omlása közben végig hiányzik a repülő orra, hiszen a bomba mozgatása még nem jutott el a következő fázisba. Azt hiszem, már korábban is ki akartam ezt javítani, de valahogy nem tűnt annyira egyszerűnek, mint elsőre gondolnánk. Azt mondaná az ember, eggyel lejjebb kell kezdeni a bomba kirajzolását és kész, de nem ilyen egyszerű. A bomba kirajzolása valóban is a repülő alatt kezdődik, de a bomba letörlése a már szükségtelen helyről esés közben, az mindig az eggyel felette lévő karakterre vonatkozik.

Code: [Select]
  370       IF JOY(0)>15 AND BOMBY=0 OR JOY(1)>15 AND BOMBY=0 THEN
  380         LET BOMBX=J+1:LET BOMBY=I
  390         SOUND PITCH 60,LEFT 63-J*1.7,RIGHT J*1.7,ENVELOPE 1,SOURCE 2,DURATION 500
  400       END IF
  410       IF BOMBY>0 THEN CALL BOMB

A BOMB eljárás először letörli a bombát onnan, ahol van, utána 1-gyel megnöveli a függőleges koordinátáját és kirajzolja az újabb helyre a bombát:

Code: [Select]
  800 DEF BOMB
  810   PRINT AT BOMBY,BOMBX:" ";
  820   LET BOMBY=BOMBY+1
  ...
  990 END DEF

A 810-es sor a ludas. Ha töröljük, nem tűnik el a repülő eleje, viszont a bomba csíkot húz maga után. Megoldás, csak akkor tegyen szóközt, ha a legelső fázison már túl van a bomba. Ez egy IF-fel könnyen megoldható. Viszont az IF lassít a program futásán, és a bomba esése közben minden fázisban megnézné, igaz-e a feltétel, még lassabb lenne a játék.
Más lehetőség viszont nem nagyon van, mert amikor a repülő a legalsó sorban van és mégis dobni próbálunk bombát, akkor a szóközt a földbe rakná bele.
Lehet, a program elvét kéne kicsit átírni. Sosem értettem, hogy a demokazettán miért így van megoldva, ami nem elegáns, biztos meg lehetne oldani máshogy is.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #129 on: 2020.December.13. 19:51:57 »
Na, közben lett egy frenetikus ötletem a probléma megoldására. Bevezetjük a NOBOMB$ változót. Ha éppen most indult el a bomba, akkor az értéke egy üres string, ha pedig már túl van az első fázison, akkor az értéke szóköz lesz. És a NOBOMB$ változót írja ki oda, ahol a bombát letörli.

Code: [Select]
 370       IF JOY(0)>15 AND BOMBY=0 OR JOY(1)>15 AND BOMBY=0 THEN
  380         LET BOMBX=J+1:LET BOMBY=I:LET NOBOMB=""
  390         SOUND PITCH 60,LEFT 63-J*1.7,RIGHT J*1.7,ENVELOPE 1,SOURCE 2,DURATION 500
  400       END IF
  410       IF BOMBY>0 THEN CALL BOMB

Code: [Select]
 800 DEF BOMB
  810   PRINT AT BOMBY,BOMBX:NOBOMB$;
  820   LET BOMBY=BOMBY+1:LET NOBOMB$=" "
  ...
  990 END DEF

Nem sokára ki is próbálom.
De lehet, hogy létezik még ennél is elegánsabb módszer.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Bomber Plus
« Reply #130 on: 2020.December.15. 19:45:52 »
DEF OFF

set TVC változat on
[ Guests cannot view attachments ]
rem Az EP128emu megnyitja a snapshotot.
set TVC változat off

END OFF
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos