
創造の歴史
「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バイトのスネークの技術的詳細
- コメントなしの58行のコード
- プログラムの完全な再配置可能性(再コンパイルなしの任意のアドレスへの配置)
- スタックは使用されていません
- メインセットのレジスタのみが使用されます:a、b、c、d、e、h、l、およびrがランダムジェネレータとして使用されます
- ROMプロシージャを使用しない場合
- 画面と境界線の正直な初期化
- クラシックキーコントロール:6,7,8,9(シンクレアジョイスティック)
- ウサギを配置する擬似ランダムな方法での各初期化
コードは3ブロックで構成されます
- 変数と画面の初期化
- 方向を押して変更するためのポーリングキー
- ゲームイベント処理
レジスタは、主に次のように名前付き変数として使用されます。
- レジスタA-中間結果として使用され、個々のビットを持つマニピュレータ
- レジスタペアbc-この移動方向は、ゲームプロセス全体で4つの値のみを取ります。#ffe0、#0020、#0001、#ffff
- レジスタペアdeは、現在の配列処理インデックス(属性)です。
- レジスタペアhlは、属性アドレス空間でのヘビの頭の現在の座標です。
初期化ブロックでは、ウサギの分布の論理演算を減らすために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。
- 0 000黒
- 1 001ブルー
- 2010赤
- 3,011パープル
- 4,100グリーン
- 5 101ブルー
- 6 110イエロー
- 7111ホワイト
したがって、「Rabbits」は値255(点滅、明るい、白い背景、白い色)でエンコードされ、空のスペースは値0(黒い背景、黒い色)でエンコードされます。
他の実装とは異なり、「スネーク」のストレージに別のアレイは割り当てられず、「オンスクリーン」メモリにすぐに配置されます。 ヘビの長さと「食べられたウサギ」の数は、頭の色の形で保存されます。大きい値は「明るく」見えるため、単純な計算が行われ、配列全体が実行され、ウサギの数が頭の基本色に追加されます。 スネークの全身の動きは、配列全体を処理することによって発生します。各値は1ずつ減少して黒になります。
ゲームイベントの処理は、IFのいくつかの論理的な分岐です。頭を配列の次のインデックスに移動するときに、ウサギと空のスペースがない場合、前の値がチェックされます。 別の「IF」、配列をチェックした後にヘビの頭が最大の色を持っている場合、すべてのウサギが食べられます。
機能を損なうことなく95バイトから93バイトに最適化することができたため、 UPDはソースを更新しました。
UPD2セクションアルゴリズムを追加しました。