4文字で遊ぶ
今回は「文字」について紹介します。
文字について、おさらい
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ボタンを押す時間でジャンプの高さを調節できます。
これにより、繊細な操作が可能です。
もう一つの改良点はプレイヤーキャラの手足が動くようになったことです。
前回のプレイヤーは棒立ちでした。
今回は2つのパターンで動くので迫力があります。
プレイヤーキャラの表示データは文字列の配列に格納しています。
そして、配列の添字(インデックス)を一定時間おきに切り替えると、手足が動いて見えるわけです。
なお、実際のプログラムではCOPY命令とDATA文を使って、プログラムの行数を節約しています。
今回のまとめ
今回紹介した命令と関数は次のとおりです。さらに深く知りたい場合には、ヘルプ機能や公式サイトにある「命令表」で調べてみましょう。
- COLOR
- LOCATE
- CHKCHR
- LEN
- MID$
- CHR$
- ASC
- SCROLL