連載
» 2012年11月12日 10時00分 公開

「夏草や 負けるな一茶 夢のあと」――ランダム俳句プログラムで奇跡の一句は生まれるか!?プチコンで始めるBASIC新世代育成“虎の穴”(7)(2/3 ページ)

[スマイルブーム マイコン部,MONOist]

一風変わったデータ管理

ハカセ

柿食えば 岩にしみ入る お馬が通る』か……。ふむ、柿ってマジパないのう。

ワンパク

それはもういいんだヨ!


神崎

まあまあ。確かに音声読み上げがあると、また違った面白さがあるよ。俳句のデータを増やしていくほど組み合わせが増えて楽しくなるしね。


インテリ

既存の句でなくても、わざとノイズ的なフレーズを紛れ込ませても結果にバラエティーが出てくるよ。


ワンパク

ウーム……。例えば『デスウィッシュ パンクロッカー ライオット』とかか……?


ハカセ

えらく偏ったボキャブラリーじゃが、実際そのぐらい唐突な語彙(ごい)の方が映えるのは確かじゃな。


ワンパク

フフン! こういうのは得意だゼ! (ポチポチ……)ン?


    Illegal function call (15, TALK)

神崎

あー……。エラーが出ちゃったね。


ワンパク

な、ナゼだ! オレはただ『ストレート・トゥ・ヘル』と打ち込んだだけなのに! これがレーティングってヤツか……。


ハカセ(涙)

ワンパクよ……。いろいろ間違っておるが、ともかくプチコンの「TALK」文では『・』の文字を受け付けないのじゃよ。


インテリ

本格的に作るとしたら、文字列の例外処理は必須ですね。


ワンパク

人ごとみてェに言いやがって……。アレ? 何てこった! もう一度実行したら、今まで打ち込んだフレーズがクリアされちまうじゃねェか!



 小まめな保存が大事なのは、現代のコーディングもBASICも変わりませんね。

 と言っても、プチコンで主にデータ保存を扱う「MEMリソース」は255文字の文字列まで(つまり文字変数を保存する感覚)なので、この手のプログラムには不向きなようです。

 では、どうしたらいいか。ここで、プチコン界隈(かいわい)で有名なテクニックを使います。そう、“文字列を画像データとして処理”してしまいましょう。

画像データとして処理 画像2 本当は画面からは隠して構いませんが、表示するとこうなります

 プチコンの「グラフィック面」で扱えるカラーパレットは256色。そして、文字コードも256種類。つまり、カラーコード“1番”が文字コード「CHR$(1)」というように対応させれば、1ピクセルに1文字のデータを持たせられるということです。

 これなら圧縮などを考えなくても、1画面256×192ピクセルの中に4万9152文字分のデータが入る計算ですね。

ハカセ

と言うわけで、起動時に読み込む「@READ」と、文字入力のたびに呼び出す「@WRITE」のルーチンがこちらになるのじゃよ。


'ヨミコミ
@READ
IF GSPOIT(X,Y)==0 THEN @MAIN
NO=NO+1 'トオシハ゛ンコ゛ウ ツイカ
FOR I=0 TO 2
 @WLOOP
 G=GSPOIT(X,Y)
 IF G==255 THEN GOSUB @GSTEP:GOTO @SKIP
 WORD$(NO,I)=WORD$(NO,I)+CHR$(G)
 GOSUB @GSTEP
 GOTO @WLOOP
 @SKIP
NEXT
GOTO @READ
 
'カキコミ
@WRITE
FOR I=0 TO 2
 FOR J=0 TO LEN(WORD$(NO,I))−1
  GPSET X,Y,ASC(MID$(WORD$(NO,I),J,1))
  GOSUB @GSTEP
 NEXT
 GPSET X,Y,255
 GOSUB @GSTEP
NEXT
RETURN
 
'1ドット イドウ
@GSTEP
X1=X1+1:Y1=Y1+1
X=(X1)%255
Y=FLOOR((Y1)/255)
RETURN
ソースコード2 “追加分”のみ。全部まとめたQRコードを以下に示します

QR3_1QR3_2 全部まとめたQRコード

インテリ

実際には、さっきのようなエラーを誘発するデータをクリアする処理も必要になりますが……。取りあえず概念としてはこういうことですね。


ワンパク

一気に話をススメやがって……。ワカるようなワカんねえようなコードじゃねェか!


神崎

うーん、「GSPOIT()」関数がポイントだね。これは、指定したピクセル座標のカラーコードを取得するベンリな関数だよ。


ハカセ

さよう。「@WRITE」ルーチンも一見ややこしいが、要はセンテンスの文字数を取得して、1文字ずつカラーコードに置き換えてドットを打っておる(GPSET)わけじゃな。デフォルトのカラーコード“0(透明)”が終了フラグ、“255番”がセパレータというわけじゃ。


ワンパク

テメェーら、本当、リズムよくサクサク話を進めるよナ……。


インテリ

プチコンでは、グラフィック面をメモリ代わりに使うことがよくあるんだよね。他にも、X軸とY軸を2次元配列として使うやり方もあるよ。


ワンパク

フーム……。変数「A(12,8)=10」としたら、グラフィック面の「(x12,y8)」に“10番”のカラーを置くってワケか……。イヤ、ワカるんだが、よくこんな方法がメジャーになったナ……。


ハカセ

そうジャケンにしたものでもないぞ。そもそも、NAND型フラッシュメモリにあんまりヒンパンにアクセスさせるのも何じゃからな。開発当時からこの方法はイケる! と考えられておったのじゃよ。



 指定座標のカラーコードを取得する「GSPOIT()」関数は、なかなか類を見ないものであり、かつてのBASICマシンにもありませんでした。

 テキスト座標からキャラクタコードを取得する命令なら、おなじみPC-6000系の「SCREEN()」関数などがそこそこメジャーでしたが、“便利な割にあまり普及してない命令”でもありました。当時のくやしさからかプチコンでは、まっ先に採用されましたが、この延長として、“まあ、何かの役に立つこともあるだろう”と用意されたのが「GSPOIT()」関数だったそうです。「GSPOIT()」関数を使えばグラフィック面で大量の要素を管理できるんじゃない? と気付いたのは実装してからのことというから、何でもやってみるものですね。

 ちなみに、今回使ったグラフィック面の情報は、プログラム同様「SAVE"GRP:ファイル名"」で保存されます。こんなところもセーブデータっぽいですね。

Copyright © ITmedia, Inc. All Rights Reserved.