サンドボックスの記事を読んだ人向け:「ゲームを小さくすることは可能ですか?」というセクションを追加しました。
1バイトの履歴を読んだ後、自分の話を思い出しました。
学校にいてプログラミングを始めたばかりの頃、アセンブラーと最適化に非常に惹かれていました。 つまり-ティックとバイトの計算による骨の折れる最適化。 夏休みの間に、私のいとこと私は世界最小のゲームを書くというアイデアを得ました。
翌日には、サイズが80バイトの最初のプロトタイプの準備が整いました。 (当時はバージョン管理についても知らなかったので、思い出を信じることは残っています)。 この瞬間から、バイトのための私の闘争が始まりました。 サイズがすぐに65(またはそれ以上)に縮小され、すべてのバイトが非常に大きな困難を伴って与えられたことを覚えています。 夏の終わりまでに、結果は58バイトになりました。
プロットと管理
2つのトレーラーを備えたトラックで高速道路に沿って急ぎます。 左側には分割帯があり、右側には草に覆われた道端があります。 道路には人と木があります(たぶん穴)。 あなたの仕事:人を倒したり木にぶつかったりしない(穴に落ちない)
管理:左右矢印-ターン。 Esc-一時停止。
スクリーンショット
ソースコード
begin: <br>
; ds <br>
push 0b800H <br>
pop ds <br>
; 40×25 <br>
int 10H <br>
; bx = 700H - , <br>
mov bh, 7H <br>
<br>
main_loop: <br>
; <br>
xchg cx, ax ; mov ah, 0 <br>
int 1AH <br>
mov [bx], dl <br>
delay: <br>
int 1AH <br>
cmp [bx], dl <br>
je delay <br>
<br>
; si - <br>
xchg ax, si <br>
add al, dl <br>
xchg ax, si <br>
<br>
xchg ax, cx ; mov cx, 0 <br>
<br>
; <br>
in al, 60H <br>
cmp al, 77 <br>
jnz keytest1 <br>
; <br>
inc bx <br>
inc bx <br>
keytest1: <br>
; <br>
ja keytest2 <br>
dec bx <br>
dec bx <br>
keytest2: <br>
; <br>
mov ah, 0CH <br>
int 21H <br>
; 1 <br>
mov ax, 0701H <br>
mov dx, 1827H <br>
int 10H <br>
<br>
; <br>
mov [si], ax <br>
; <br>
mov [di+51], dx <br>
; <br>
cmp [bx], dh <br>
ja main_loop <br>
<br>
ret <br>
ソースとバイナリのアーカイブ (Tasmはコンパイルに使用されました)
コメント
XPでは、プログラムは動作しますが、タイマーはスムーズに動作せず、キーボードの状態は最初はリセットされません。 DosBoxでは、問題なく機能します。
ソースでは、2つの命令(プッシュ0b800Hおよびmov [di + 51]、dx)がマシンコード(db 68H、00H、0b8Hおよびdb 89H、55H、51H)で記述されています。これは、Tasmがモードでそれらを受け入れなかったためです。デフォルトでコンパイル。 私の意見では、彼はx386命令を含めるよう要求しましたが、私は間違っているかもしれません。
ゲームを小さくすることは可能ですか?
おそらくそうです。 画面(8バイト)と待ち時間(10バイト)をスクロールすると、多くのスペースを占有します。 移動方向を変更する(障害物が上に移動する)場合、スクロールは改行文字のクイック出力(
mov al, 0Ch; int 29h
)に置き換えることができます。 0040:006Chのダブルワードのステータスをチェックすることにより、遅延を置き換えることができます。 深夜0時からタイマーカウンターのカウンターが必要です(深夜0時からタイマーが作動します)。
UPD:ありがとう! Assemblerブログに移動しました
UPD2: Imp5は、私はまったく正しくないと言っています。 Shifticidaは32バイトの2人用ゲームです。 トピックの正しい名前:「世界最小のレーシングゲーム」