93バイトのヘビゲーム

画像






創造の歴史



「Snake」(Python、Boa constrictor)は一般的に呼ばれているため、1970年代半ばの最初のデジタル(コンピューター)ゲームの1つです。



当時、ゲームは別のスロットマシンでリリースされました。たとえば、スペースインベーダー、パックマン、アルカノイドなどのゲームが知られています。 通常、当時のアーケードマシンでは、1つのゲームのみがプリインストールされており、マシン自体がこのゲーム用に様式化されていました。



「Snake」には単純なゲームプレイがあり、プレイヤーは蛇を描く動線を制御します。 プレイヤーは、蛇の動きの方向を90度「回転」させることができます。 ゲームの目標は、ウサギを描いたポイントでヘビを「走らせる」ことです。 「ウサギ」を食べるたびにヘビの長さが長くなります。 困難は、ヘビが自分自身を横切ることができないことです。



創業以来、「蛇」はさまざまなデバイスで多くの化身を生き延びてきました。 たとえば、一部のデバイスでは、技術的な制限により、線ではなく蛇が文字列として表示される場合があります。 他の最新のコンピューターでは、ヘビは90度だけでなく、任意の角度で回転できます。



つまり、このような単純なゲームとそのアイデアは、ほぼすべての可能なコンピューティングテクノロジーに移されました。 プログラム可能なマイクロ計算機、冷蔵庫やその他の家電製品を制御するマイクロコントローラーを含みます。



「スネーク」のアイデアは今日でも人気があります-最近の「ブーム」はマルチプレイヤーオンラインゲーム「slither.io」の形で生まれ変わりました。



プログラミングが好きな人として、私は多くのプログラミング文献に出会いました。そこでは、トレーニングプログラムの1つがゲーム「Snake」でした。 また、定期刊行物には競争力のある記事があり、人々は「スネーク」のバージョンを提供し、コンピューターの特定の技術的制限に対応しようとしました。



また、私はこのゲームを異なる言語とプラットフォームで書く練習もしました。 ある日、ZX-Spectrumで電子雑誌を読んでいたときに、著者がSnakeのプログラミングから256バイト以内の記事を見つけました。 記事の最後で、著者は、ZX-Spectrumプラットフォームで256バイトより短いゲームを書くことができるとは考えにくいと述べました。 しかし、しばらくして、別の著者からの121バイトのバージョンが登場しました。 確かに、コードのサイズを小さくすると、ゲームプレイが低下しました。



しばらくして、1人の初心者プログラマーと話をして、少なくともある種の完成したプロジェクトを書くように勧めました。 それから私達は「蛇」について話していました。 これは競争的な性質のものである可能性があることを思い出し、最小コードサイズに重点を置いてゲームの実装を書くことを彼に伝えることで、対談者の関心を温めることにしました。 タスクを複雑にするために、同じ「ZX-Spectrum」プラットフォームと「Z80」プロセッサアセンブラを使用することにしました。



数時間でゲームの最初のバージョンを作成し、150バイト強の「重さ」にしました。 それから私は電子ジャーナルの記事を思い出し、121バイトの記録を破ることに決めました。 それで、私の次のバージョンはすでに100バイトの重さでした。 書き込みにはすでに6時間かかりました。 その後、私は長い間このゲームに戻りませんでした。



その後、フォルダーをプロジェクトとソースコードで解析すると、「Snake」のソースコードに出会い、コードをさらに2バイト減らすことができることに気付きました。 最適化プロセスには1日かかり、コードは5バイトだけ削減されました。 それでも、ゲームコードは93バイトの記録を「重く」し始めました。



技術的な詳細



93バイトのスネークの技術的詳細





コードは3ブロックで構成されます





レジスタは、主に次のように名前付き変数として使用されます。





初期化ブロックでは、ウサギの分布の論理演算を減らすためにdeとhlが交換されます



ゲームは、プログラムの開始から終了(完全な初期化)までの2つのグローバルサイクルと、ウサギの配置後のゲームサイクルを使用します。



ゲームコード



begin ld de,#598f;snake xy ld hl,#5aff ld b,l ld c,l ;--- rabbit1 ld (hl),b ld a,r cp l jr z,rabbit2 inc (hl) rabbit2 dec hl bit 3,h jr nz,rabbit1 ex hl,de ;--- l1 xor a out (#fe),a clr ld (de),a dec de bit 6,d jr nz,clr ;--- ; xor a in a,(#fe) rra rra jr c,$+5 ld bc,#ffe0 rra jr c,$+5 ld bc,#0020 rra jr c,$+5 ld bc,#0001 rra jr c,$+4 ld b,e;ld bc,#ffff ld c,e ;--- ld (hl),33 ld d,#5a move1 ld a,(de) dec a cp 254 jr nc,move2 ld (de),a move2 jr nz,move3 dec (hl) move3 dec de bit 3,d jr nz,move1 ;--- ld a,(hl) and %00100000 add hl,bc or (hl) inc a cp 7 jr nc,begin ld a,h inc a and %00000011 jr z,begin jr l1
      
      







アルゴリズム



この場合の画面上の画像は、メモリ内で1次元の32 * 24配列として利用できます。 各セルは1バイトのメモリを占有します。 これらのセルの値を変更することにより、画面上の各「正方形」の色を設定できます。 フォーマットはビット%FBPPPIIIです。F-Flashは1秒間に1回「点滅」します(インクを紙に交換します)、B-Bright輝度を上げます、PPP用紙0〜7、III-INK 0〜7。





したがって、「Rabbits」は値255(点滅、明るい、白い背景、白い色)でエンコードされ、空のスペースは値0(黒い背景、黒い色)でエンコードされます。



他の実装とは異なり、「スネーク」のストレージに別のアレイは割り当てられず、「オンスクリーン」メモリにすぐに配置されます。 ヘビの長さと「食べられたウサギ」の数は、頭の色の形で保存されます。大きい値は「明るく」見えるため、単純な計算が行われ、配列全体が実行され、ウサギの数が頭の基本色に追加されます。 スネークの全身の動きは、配列全体を処理することによって発生します。各値は1ずつ減少して黒になります。



ゲームイベントの処理は、IFのいくつかの論理的な分岐です。頭を配列の次のインデックスに移動するときに、ウサギと空のスペースがない場合、前の値がチェックされます。 別の「IF」、配列をチェックした後にヘビの頭が最大の色を持っている場合、すべてのウサギが食べられます。



機能を損なうことなく95バイトから93バイトに最適化することができたため、 UPDはソースを更新しました。

UPD2セクションアルゴリズムを追加しました。



All Articles