BASIC - ハイスコア保存方法

ゲームでハイスコアを保存したい!という時ってよくありますよね。
BASICにはファイル入出力の命令がありますが、いまいち理解できなかったり使い勝手が悪かったりします。
ここではファイルを使わずに、メモリ上に直接保存する方法を説明したいと思います。

「ハイスコアを保存したい」というのは「数値をメモリに書き込みたい」ということになります。

まず、メモリって何だ?という人のために。
メモリとは日本語では「記憶」という意味ですが、コンピュータの世界ではどちらかというと「記録」のほうが近いです。コンピュータにはいろいろな物を記録するための「メモリ」というハードウェアが存在しています。このメモリに命令を送ることで自由自在に読み出し・書き込みをすることができます。

このメモリというのにはいくつもの部屋が存在し、並んでいます。それぞれに住所(アドレス)が割り当てられており、そのアドレスを指定すると数値をメモリから読み出したり書き込んだりすることが可能になります。

BASICにはそんな命令が存在します。
それがPEEK命令とPOKE命令です。PEEKが読み出し、POKEが書き込みをする命令です。
メモリを自由に書き換えることができるPOKEという命令は非常に危険です!誤った使い方をすればポケコンに保存されているデータが一瞬でパーになります。ここからは慎重にお願いします!

PEEK命令でたとえばアドレス0番地を見てみましょう。RUN MODEで以下の命令を入力。

PEEK 0

これだけです。ENTERキーを押せば195.という値が表示されているはずです。
これで0番地には195という数値が記録されているんだということがわかります。

じゃあ次に00FF番地に記録されているメモリを読み出してみましょう。

PEEK &H00FF

場合によるかもしれませんが、0.と表示されている場合が多いと思います。
表示された数値がメモリの00FF番地に記録されているわけです。

それではこの00FF番地の値を書き換えてみましょう。

POKE &H00FF,123

絶対に間違いなくお願いします。そうすると、00FF番地の内容が123に書き換わります。
ためしに もう一度00FF番地の内容を読み出して見ましょう。

PEEK &H00FF

123.と表示されましたか?表示されれば成功です。

今回使った00FF番地というのはリザーブエリアというもので、あらかじめ予約されているメモリスペースになっています。しかし、予約されているのにもかかわらず、何かに使われている様子がないおかしなメモリスペースなのです。つまり、自由に使えるというわけです。
この他にもたくさんあって、0040番地から00FF番地の中は使えます。ただし、007F番地はC言語を起動すると値が書き換わります。また、アセンブラを起動させると0080番地から0085番地までが書き換わります。そのため007F番地から0085番地は使わないように注意。
この、リザーブエリア以外のメモリには何が入っているかわかりません。もしPOKE命令で書き間違えれば大変なことになります。ポケコンに保存されていたデータがすべてでたらめなデータに置き換わってしまったり、操作が受けつかないフリーズ状態になってしまいます。こういう場合はリセットを行ってください。キーボード左下の穴を押せばリセットできます。「MEMORY CLEAR O.K.? (Y/N)」という問いかけには、フリーズの場合は「N」、でたらめデータになった場合は「Y」を押してください。

だから、リザーブエリア内だけを使ってハイスコアを保存するように気をつけましょう。
わからない人は00FF番地や00FE番地を使うのが無難です。

実際にこの2つの命令を使ってハイスコアを保存するプログラムを作ってみました。

10 CLEAR
20 H=PEEK &HFF 'ハイスコアを読む
30 PRINT "HIGH=";H
40 INPUT "SCORE=";S
50 IF S>H THEN POKE &HFF,S 'もし、スコアがハイスコアより大きければ保存する
60 END

ハイスコアより大きなスコアを入力するとハイスコアとして保存されて、次の実行では新しいハイスコアが表示されます。
実は、この1つの部屋は1バイトと表現されていて、0から255までの数値しか扱うことができません。上のプログラムでも0から255までしか扱えません。
じゃあ、256以上はどうすればいいのか・・・というと簡単!2バイト使えばいいのです。2バイトだと0から65535までが扱えます。どういうことかというと、256*256=65536です。

下のプログラムは2バイトで0から65535までを保存する方法です。

10 A= PEEK &HFE
20 B= PEEK &HFF
30 H=A*256+B
40 PRINT "HIGH SCORE=";STR H
50 INPUT S
60 IF S>H THEN POKE &HFE,S¥256,S MOD 256

ここでは00FE番地と00FF番地を使っています。
30行目の式で2つの個別の数値を合体させてハイスコアを求めています。
60行目で使われている¥は小数点以下切捨ての割り算で、MODはあまりを求める演算子です。
また、POKE命令は

POKE アドレス,数値,数値.....

と書くと、指定したアドレスから順に書き込みを行います。そのため、

POKE &HFE,0,1

と書けば

POKE &HFE,0
POKE &HFF,1

と同じ動作をします。これよりも動作は速くて短く書けるので便利です。

65536以上の数値を保存したいときは3バイト4バイトと増やしていけばオッケーです。プログラムもこの要領で大丈夫だと思います。

Copyright(C) tosik
E-Mail:
Weblog: Tosikの雑記