投稿

ラベル(ゲーム)が付いた投稿を表示しています

N88-BASICでゲーム (3回目)

イメージ
2022/8/12(金) N88-BASICでゲーム (3回目) N88-BASIC de game (3)   Textのscrollを利用してprintした壁を よけるゲームです   PC-98シリーズとNL-BASIC以下98 PC-88(V2mode)とXL-BASIC以下88 VL-BASIC以下VLとします     FNPK(X, Y) x,y座標のText-VRAMを読みキャラクターコードを 得ることが出来、&H20(空白)以下なら障害物なしと 判断しています   98 Text-VRAMはA0000(h)番地から1行に80文字 (各2バイト)あり、それが25行分あります DEF FNPK(X, Y) = PEEK((X + Y * 80) * 2) DEF SEG = &HA000   88 Text-VRAMはF3C8(h)番地から1行に80文字+ アトリビュート40バイトの120バイトあり、 それが25行分あります DEF FNPK(X, Y) = PEEK(&HF3C8 + X + Y * 120)   VL Text-VRAMは00000(h)番地から1行に80文字 (各1バイト)あり、それが25行分あります DEF FNPK(X, Y) = PEEK(X + Y * 80)     キー入力 98 … IN = &HE0 88 … IN = &HE0 VL … IN = &HE0 or &HE00   INP(IN+&H8)のbit2が0なら→(右)キーが押されており INP(IN+&HA)のbit2が0なら←(左)キーが押されているので IF NOT INP(IN+&H8) AND &H04 THEN →キー処理 IF NOT INP(IN+&HA) AND &H04 THEN ←キー処理 としています   キーマトリクスは付属のマニュアルなどを参照して下さい   v-sync待ち 98 … VS = &HA0 88 … VS = &H40 VL … VS = &HA0 or &H40 WAIT VS, &H20, &H20: WAIT VS, &H20 '--- v-sy

N88-BASICでスライドパズル (3回目)

イメージ
2022/2/26(土) N88-BASICでスライドパズル (3回目)   Sliding puzzle(8)の解答探索 123      123      123 456 →   45  →  456 78       786      78   スペースの場所へ 1~8を動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 aキーで解答探索します。(qキーで途中中断) スペースキーで終了です。   解答探索        (1)    (2)    (3)       xxx    xxx    xxx 盤面    xx2 → xxx  , xx         x1     x 1    xx2 方法    ""     "→"   "↓"   (1)からは(2)と(3)の動かし方があります PUZZNは(1),(2),(3)の盤面を記憶する最大数です MOVENは(2),(3)へ至る方法を記憶する最大値です (2),(3)について(1)と同様に繰り返し、 初めに見つけた答えを表示しています。   深さ探索 (スタックの先入れ後出し)ではなく 幅探索 (ストリームの先入れ先出し)で検索しています ので初めに見つけた答えは最短経路の一つです。   1. (1)を保存 2. (1)を取出し移動可能な盤(2),(3)を保存 3. (2)を取出し移動可能な盤保存…(4)とします 4. (3)を取出し移動可能な盤保存…(5)~とします 5. (4)を取出し.... と保存しようとする盤が答えになるまで繰り返します。 ただし、今までと同じ盤面になったときは保存しない チェックを入れています。 このチェックを入れると、答えを見つけるまでの 時間が節約できる代わりに、メモリーが多く必要です。   以下のメモリーでは、メモリーが不足で途中中断 する場合が多いです 1050 PUZZN = 45000 1060 MOVEN = 15000 を増やせば最後まで検索できると思います。   NL-BASIC

N88-BASICでスライドパズル (2回目)

イメージ
2022/2/26(土) N88-BASICでスライドパズル (2回目)   Sliding puzzle(15) 1234      1234      1234 5678  →  5678 →  5678 9ABC      9AB       9ABC DEF       DEFC      DEF   スペースの場所へ 1~Fを動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 スペースキーで終了です。   解き方の例 (1) 1,234,59D 戻す (2) 6,78,AE 戻す (3) BCF 戻す 1234     1234      1234 5 xx  → 5678  →   5678 9xxx     9A x      9ABC Dxxx     DExx      DEF   上 1行と左1列が揃えば、3×3のパズルと同じです。   NL-BASICとblg~.zip(puzz002.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでスライドパズル (1回目)

イメージ
2022/2/24(木) N88-BASICでスライドパズル (1回目)   Sliding puzzle(8) 123      123      123 456 →  45  →  456 78       786      78   スペースの場所へ 1~8を動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 スペースキーで終了です。   解き方の例 (1) 1 戻す      (2) 2,3 戻す    (3) 4,7 戻す    (4)  xx    1xx      13     123      123    123      123 1xx →  xx  →  x2x → x x  →  74x → 4 x  →  456 xxx    xxx      xxx    xxx       xx    7xx      78   NL-BASICとblg~.zip(puzz001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい      

N88-BASICでゲーム (2回目)

イメージ
2021/8/18(水) N88-BASICでゲーム (2回目) by ULproject 1. 斜方投射で的方向に投なげる (モンキーハンティング) (発射と同時に的を落とすとあたる) 2. 的にあたるように投げる(低い軌道) 3. 的にあたるように投げる(高い軌道)   の3通りを1~3キーで選び的にあてるゲームです   ターゲットは1/2の確率で落ちます よって、1/2の確率で当たるゲーム です 投げ方は3通りですが、当たる確率は1/2です 何かパラドックスが作れそうですね   以下、式の説明です   以後ベクトルを大文字、その他は小文字にします   加速度A = const.(一定)、 速度V、初速度V 0 、 位置P、初期位置P 0   時間t、微小時間dt とすると、   速度の微小増分dV = Adt (速度の増分=加速度×時間は微小時間 なら加速度一定でなくても成り立つ) dV/dt = Aとすると、 Vの時間微分がAと分かる。   両辺tで積分すると ∫dV/dt dt = ∫Adt ∫dV = ∫Adtは、A = const.なので、 V = At + C ここでt=0のときV=V 0 なので、 V 0  = C よって、 V = At + V 0     位置の微小増分dP = Vdt (位置の増分=速度×時間は微小時間 なら速度一定でなくても成り立つ) dP/dt = Vとすると、 Pの時間微分がVと分かる。   両辺tで積分すると ∫dP/dt dt = ∫Vdt ∫dP = ∫Vdt P = ∫ At+V 0  dt   = (1/2)Att + V 0 t + C ここでt=0のときP=P 0 なので、 P 0  = C よって、 P = (1/2)At 2  + V 0 t + P 0   図1. 速度と時間のグラフ   速度と時間のグラフv - at + v 0 の 傾きaが加速度(一定の場合)で、 面積(1/2)at 2  + v 0 tが移動距離になります   三角形の部分が分かりにくいときは 水色の長方形が各時間の間の移動距離 になりますので、三角形の面積と一緒に なります 等加速度運動(加速度一定の運動)の場合 初速と最高速の平均速度で移動したのと 同じ距離移動します   傾きを求めるのが微分で、面が積分です   まとめ A

N88-BASICでゲーム (1回目)

イメージ
2021/8/16(月) N88-BASICでゲーム  (1回目) by ULproject   球同士の衝突と跳返り   大文字ベクトル、小文字スカラー 文字の後の、 'は衝突後、数字は球番号   球同士の反発係数、衝突面に水平 ,垂直u,e 球の中心位置 P,半径r,質量m,速度V 衝突面の球 1方向の法線N = (P 1 -P 2 )/|P 1 -P 2 |   球同士の衝突は、 |P 1 -P 2 | ≦ r 1 +r 2   なので √{(P 1 -P 2 )・(P 1 -P 2 )} ≦ r 1 +r 2   (P 1 -P 2 )・(P 1 -P 2 ) ≦ (r 1 +r 2 )(r 1 +r 2 ) で判断できます。   ここで、ベクトルの計算ですが、 P(i) (i=0,1,2) をPのx,y,z成分と すると、 P = P 1  - P 2 は、 P(i) = P1(i) - P2(i) (i=0,1,2) P・Pは ΣP(i)P(i) (i=0,1,2) となります   BASICでは、 P(0) = P1(0) - P2(0) P(1) = P1(1) - P2(1) P(2) = P1(2) - P2(2) D = P(0)*P(0)+P(1)*P(1)+P(2)*P(2) R = R1 + R2 IF D <= R*R THEN 重なり又は接触 となります。   反発させるときは、球が接触している 間は再び反発しないようにしないと 球が離れなくなります。   次に反発についてですが、衝突面に 水平な成分は、球の回転に関係します が、ここでは球の回転は考えずに 垂直成分と同じように反発係数で 減速させる事にします。   衝突面に垂直な成分 (v 1 は球 1の速度、v 1 'は衝突後) 運動量 p = mv 運動量保存則 p 1 +p 2 =p 1 '+ p 2 'より p 1 +p 2  = m 1 v 1 '+ m 2 v 2 ' 反発係数 e = -(v 1 '- v 2 ')/(v 1  - v 2 )より ev 1  - ev 2  = -v 1 '+ v 2 '     em 2 v 1  - em 2 v 2  = -m 2 v 1