SmileBASIC

SmileBASIC講座


今回は「文字」について紹介します。

文字について、おさらい

SmileBASICでは様々な文字を扱うことができます。対応している文字は数字、英字、記号、ひらがな、カタカナ、漢字、ロシア文字、ギリシャ文字です。

《文字の計算》

プログラムにおける書式について、少しおさらいをしてみましょう。

PRINT 1+1
2
OK
PRINT "1"+"1"
11
OK
|

たとえば、ダイレクトモードで「PRINT 1+1」と入力すると、答えとして「2」が表示されます。「1」を数値として扱い、計算を行っています。

続いて、「PRINT ”1”+”1”」と入力すると、今度は「11」と表示されました。ここでは「1」を文字として扱っています。文字として扱いたい場合には文字の両端に「”(ダブルクォーテーション)」を記述します。演算子の「+」によって、文字の足し算を行っています。

PRINT "A"*30
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
OK
|

ちなみに演算子の「*(アスタリスク)」を使うと、文字の掛け算を行うこともできます。

《文字列の計算》

文字列を変数に代入するには、変数名の末尾に「$(ダラー)」を記述します。
これを文字列型の変数といいます。

A$="SMILE BASIC"
OK
PRINT A$
SMILE BASIC
OK
|

こちらはA$という変数に「SMILE BASIC」という文字列を代入するという例です。

A="SMILE BASIC"
type mismatch
OK

文字列の変数名に「$」を付け忘れると、このように「Type mismatch」というエラーが表示されてしまいます。

文字を処理する関数

SmileBASICには文字を扱う関数がたくさん存在します。その中から代表的なものを紹介します。

(1)文字を数字に変換する

VAL関数と使うと、数字の文字列を数値に変換することができます。

A=VAL("123")
OK
PRINT A
123
OK

ダイレクトモードでVAL関数を使用した例です。「123」という文字列を数値の123に変換しています。

(2)数字を文字に変換する

VAL関数の逆の働きとして、STR$関数を使うと数値を文字列に変換することもできます。

A$=STR(123)
OK
PRINT A$
123
OK
|

ダイレクトモードでSTR$関数を使用した例です。123という数値を文字列の"123"に変換しています。

(3)文字列の長さを調べる

LEN関数を使うと、文字列の長さ(文字数)を求めることができます。

PRINT LEN("SMILE BASIC")
11
OK
|

ダイレクトモードでLEN関数を使用した例です。「SMILE BASIC」という文字列の長さを表示します。実行した結果は11です。

(4)文字列を部分的に抜き出す

MID$関数を使うと、文字列の特定の部分を抜き出すことができます。関数の書式はつぎの通りです。

MID$(文字列, 開始位置, 文字数)
関数の戻り値として文字列を返します。

PRINT MID$("SMILE BASIC",3,5)
LE BA
OK
|

ダイレクトモードでMID$を使用した例がこちらです。「SMILE BASIC」という文字列の開始位置3から5文字ぶんを抜き出して表示します。実行すると「LE BA」と表示されます。

この処理を図にすると、こうなります。
引数の「開始位置」というのは左から1文字目を「0」として数えます。
そのため、「開始位置3」は「左から4文字目」という意味になります。
結果として、4文字目~8文字目が抜き出され、「LE BA」と表示されたわけです。

画面構成

SmileBASICでは文字を表示する画面のことを「コンソール」画面と呼びます。
INPUT命令やPRINT命令など、文字を表示する場合は全てコンソール画面を使っています。
コンソール画面以外にもスプライト、BG画面、グラフィック画面、背景色という画面が存在します。
これらの画面は重ね合わせて表示しています。一番奥の背景色は初期設定では黒色です。
スプライト、BG、グラフィックは今回は使用しませんので、ひとまず考えなくて構いません。

プチコン3号の上画面のコンソール画面は50×30文字を表示することができます。
プチコンBIGのコンソール画面も初期設定時は同じサイズです。

指定した場所に文字を表示する

LOCATE命令を使うと、指定した場所に文字を表示することができます。
LOCATE命令の主な書式は次の通りです。

LOCATE 座標X,座標Y
LOCATE 座標X,座標Y,座標Z

LOCATE命令を使ったプログラムの例です。
座標(10,5)の場所に「SMILE BASIC」という文字列を表示します。

プログラムの実行結果がこちらです。指定した座標に文字列を表示することができました。

文字の色を変える

COLOR命令を使う表示する文字の色を変更することができます。
COLOR命令の書式は次の通りです。命令の書式は2種類あります。

COLOR 描画色
COLOR 描画色,背景色

COLOR命令を使ったプログラムの例です。0〜15番の色で「SMILE BASIC」という文字列を表示します。

プログラムの実行結果がこちらです。
0〜15番の色を使い、文字列を表示しました。全部で16色のはずですが、14色しか表示されていません。
0〜1番は「透明」と「黒色」なので、背景と同化してしまっています。
この見えない文字は背景色を指定すると、見ることができます。
なお、COLOR命令の色の番号は次のように設定されています。

番号 定数
0 なし 透明
1 #TBLACK
2 #TMAROON マロン(暗い赤)
3 #TRED
4 #TGREEN 緑(暗い緑)
5 #TLIME ライム(緑)
6 #TOLIVE オリーブ(暗い黄)
7 #TYELLOW
8 #TNAVY ネイビー(暗い青)
9 #TBLUE
10 #TPURPLE 紫(暗いマゼンタ)
11 #TMAGENTA マゼンタ
12 #TTEAL ティール(暗いシアン)
13 #TCYAN シアン
14 #TGRAY グレー
15 #TWHITE

色の番号には定数が割り当てられています。
たとえば、「COLOR 3」を「COLOR #TRED」と記述することができます。
これで、プログラムが分かりやすくなります。

文字のコード

SmileBASICでは文字の情報を「番号」として記憶しています。
この番号のことを「文字コード」と呼びます。
文字コードの規格にはいくつかの種類がありますが、SmileBASICではUnicodeの「UTF-16」を採用しています。
そして、CHR$関数とASC関数を使えば、文字コードと文字を互いに変換することができます。
関数の書式は次の通りです。

《文字コードから文字に変換する》
CHR$(文字コード)
関数の戻り値は文字です。

《文字から文字コードに変換する》
ASC(文字)
関数の戻り値は文字コードです。文字コードはUTF-16に対応しています。

ダイレクトモードでCHR$関数とASC関数を使用した例です。
ASC関数を使い、図のような三角記号を文字コードに変換します。
結果、「58012」と表示されました。
次にCHR$関数を使って、文字コードの58012を文字に変換します。
結果、同じ三角記号が表示されます。
このように「CHR$(~」と記述すれば、キーボードを使って記号が入力しやすくなるかもしれません。

文字と文字コードの関係を確認するプログラムです。
CHR$関数を使って、ひたすら文字を表示します。

プログラムを実行すると、文字コードと文字が表示されました。
文字コードは16進数で表しています。
たとえば、文字コードは「&H41(10進数では65)」は文字の「A」ですが、この表でそれを確認することができます。
あと、文字コードの「&H20(10進数では32)」には文字がありません。
これは文字がないのではなく、「スペース」という文字が表示されています。
他にも次のような特殊な文字コードがあります。

&H0:文字がない状態
&HA:改行(表示すると改行します)
&HD:改行(記号としての改行)

続いて、プログラムの2行目を修正します。
表示する文字コードの範囲を変更してみました。

プログラムを実行すると、&HE100〜&HE400番の文字が表示されました。
&HE200~&HE2EF番に初代プチコンやプチコンmkIIで使っていた記号が登録されていることが確認できます。

さらに文字コードについて知りたいという場合には、こちらのページがおすすめです。
http://smilebasic.com/supplements/unicode/

文字を読み取る

CHKCHR関数を使うと、コンソール画面内にある特定の座標の文字を読み取ることができます。
関数の書式は次の通りです。

CHKCHR(座標X,座標Y)
関数の戻り値は文字コードです。文字コードはUTF-16に対応しています。

CHKCHR関数を使ったプログラムの例です。

プログラムを実行した結果がこちらです。
丸の記号が上から落ちてきます。
丸の記号が何かに衝突すると止まって、次の丸が落ちてきます。
それを繰り返して、記号が少しずつ積み上がっていきます。
記号同士の衝突の判定にはCHKCHR関数を使っています。
「ACLS」を実行して画面をクリアすると、コンソール画面の文字は消滅して、文字コード「0番」で埋め尽くされています。
丸の記号を動かすさいにはスペースを表示して記号を消しています。
スペースの文字コードは「32番」です。 そのため、画面には「0番」と「32番」の文字コードが混在してしまいます。
そこで、このプログラムでは比較の範囲を広げて、CHKCHR関数の戻り値が32以下なら衝突していない状態、32より大きいなら衝突したと判断しています。

ゲーム

今まで紹介したテクニックを組み合わせて、文字で遊ぶゲームを作ってみました。

こちらがプログラムです。無理やりですが内容を1画面に収めています。
プログラム内の主な変数は次の通りです。

X:プレイヤーキャラの座標X。
Y:プレイヤーキャラの座標Y。
G:プレイヤーキャラの落下・上昇速度(-1~+1)。値がマイナスの場合はジャンプ中。プラスの場合は落下中。0の場合は地面を走っている状態。
V:地面の状態(0~4)。値が0の場合は地面は平ら。値が1~4の場合は穴空けの途中。

プログラムの実行画面がこちらです。
名付けて「穴をよけるゲーム」です。
プレイヤーキャラが地面を猛烈に走っています。
背景の地面は右から左にスクロールします。たまに地面には穴が空いています。
きちんと説明していませんでしたが、コンソール画面をスクロールさせるには「SCROLL」という命令を使っています。

<[>Aボタンを押すと、プレイヤーキャラはジャンプします。
これで穴を飛び越えることができます。

プレイヤーキャラが穴に落ちるとゲームオーバーです。
このゲーム、前回の「岩をよけるゲーム」と同じように見えるかもしれませんが、いくつかの点が改良されています。
まず、プレイヤーキャラの操作性が向上しました。
前回は一定の高さでしか飛ぶことができませんでした。
今回はAボタンを押す時間でジャンプの高さを調節できます。
これにより、繊細な操作が可能です。

もう一つの改良点はプレイヤーキャラの手足が動くようになったことです。
前回のプレイヤーは棒立ちでした。
今回は2つのパターンで動くので迫力があります。

プレイヤーキャラの表示データは文字列の配列に格納しています。
そして、配列の添字(インデックス)を一定時間おきに切り替えると、手足が動いて見えるわけです。
なお、実際のプログラムではCOPY命令とDATA文を使って、プログラムの行数を節約しています。

今回のまとめ

今回紹介した命令と関数は次のとおりです。さらに深く知りたい場合には、ヘルプ機能や公式サイトにある「命令表」で調べてみましょう。

  • COLOR
  • LOCATE
  • PRINT
  • CHKCHR
  • LEN
  • MID$
  • CHR$
  • ASC
  • SCROLL
ページトップへ