5. 標準BASICプログラミング

それでは、F-BASICでプログラムをしましょう。では、てはじめに、簡単なゲームを作ってみましょう。BASICでは、簡単に誰でも、ゲームを作ることができます。昔は、ほとんどのフリーソフトがBASICで作られていたので、長年のパソコンの有識者の方に聞けばいろいろ知っていると思います。
ここでは、WINDOWの操作を全くせず純粋なBASICプログラム(手続き型)のプログラミングをします。

以下のプログラムをこれから説明します。



まず、F-BASICを起動して下さい。
メニューの[ファイル]-[新規作成]でBASICプログラムファイルを 作って下さい。そして、上のサンプル1プログラムをエディターなどでコピーしそこに貼り付けて、下さい。
[翻訳]-[翻訳]で実行です。サンプル1の実行ファイルをダウンロードして、そのまま実行することもできます。実行ファイルができるまでしばらく時間がかかります。そして実行すると、最初に「サンプルゲーム」と表示されますので、何かキーを押して下さい。速さは最初は適当に「10」くらいを押してリターン。難易度は「30」くらいでリターン。 するとゲームが始まります。[8]キーで上、[2]キーで下へ動かし、迫りくるう@マーク集団をよけます。

これから、この簡単なゲームのしくみを説明しましょう。

まず、

'***************
'変数設定
'***************
var shared P(20) as string
まず、「'」をつけると、その行のそれ以降は無視されます。一応覚えておきましょう。

次に、
var shared P(20) as string ですが、これは、難しいのであとで説明しましょう。

*FIRST
これは、ラベルと言って*をつけて適当な単語を書くと、あとで、 goto命令を使って、簡単にここに戻ってくることができます。

'***************
'タイトル表示
'***************
cls
locate 25,10
print "サンプルゲーム (何かキーを押して下さい。)"
まず、clsは画面の文字や絵をすべて消します。
locateで、10行目の25文字目までカーソルを移動し、 print 〜 で、サンプルゲームと表示します。

'キーが押されるまで待つ
do
loop while inkey$=""

これは、よく使う命令です。 do〜loopはその間を繰り返し行います。 loopのあとにwhileをつけると、その条件が成立している間だけ繰り返します。 この場合は、inkey$=""の間。 inkey$とは、今キーボードで押されているキーのことです。 たとえば、inkey$="s"だと、sが押されている間ということになります。 inkey$=""とは、""と中に何もかかれていないので、 キーが押されていない間ということになります。


Y2=10
J=-60
S=0

ここでは、Y2という変数を10に、Jという変数を-60に、Sという変数を0にしています。
通常、すべての変数は最初は0ですので、S=0を書く必要はありません。


randomize time

randomizeとは、乱数を制御する命令です。
ゲームなどを作る際、敵が同じ場所から来るというのでは、全くおもしろみがありません。そこで、乱数を使います。
乱数は、たとえば「A=rnd」と書くとAに乱数が入りますが、パソコンは乱数を乱数表という最初から 決まっている数値を出してくるため出てくる乱数が全く同じになってしまいます。 これでは、乱数ではないのでそこで「randomize time」と入れます。
「randomize」は乱数を表のどこから読みとるか決める命令で、「time」は時間を出します。 時間は常に変わるので、その結果プログラムを実行するたびにいろいろな乱数が発生します。


for A=0 to 20
        P(A)="                                                               "
next A

ここでは、配列変数を説明します。
先ほど、「var shared P(20) as string」というのが出てきましたが、通常これは、 「dim P(20) as string」と書きます。なぜ、「var shared 〜」だったかは、 2-1.で説明します。
さて、「dim P(20) as string」は、配列変数というのを設定しています。
配列変数は、たとえばプログラムで、

A=1 B=1 C=1 D=1 E=1 とするとします。しかしこれでは、かなり面倒です。
しかし配列変数を使うと、 A(1)とA(2)を別の変数として扱うことができます。 これはどういうことかというと、たとえば、上の命令を

do loop while B<6


*NYURYOKU1
locate 30,12
print "               ";
locate 30,12
input "速さ[1速-30遅]";WAITTIME
if WAITTIME<1 or WAITTIME>30 then
        locate 30,11
        print "もう一度入力して下さい";
        goto *NYURYOKU1
endif
locate 30,11
print "               ";

*NYURYOKU2
locate 30,13
print "               ";
locate 30,13
input "難易度[1難-50易]";NANDO
if NANDO<1 or NANDO>50 then
        locate 30,11
        print "もう一度入力して下さい";
        goto *NYURYOKU2
endif
locate 30,11
print "               ";

cls
do
        if left$(P(Y2),1)="@" then
                goto *BOM
        endif

        for A=0 to 20
                if int(rnd(1)*220)>NANDO+150 then
                        B$="@"
                else
                        B$=" "
                endif
                P(A)=right$(P(A),59)+B$
                locate 5,A
                print P(A);
        next A

        K$=inkey$

        if K$="8" then
                if Y2<=    0 then exit
                D=Y2:Y2=Y2-1
        endif

        if K$="2" then
                if Y2=>20 then exit
                D=Y2:Y2=Y2+1
        endif

        if D<>-1 then
                locate 3,D
                print" "
                D=-1
        endif

        locate 3,Y2
        print"●"

        'スコア表示
        J=J+1
        if J>9 then
                locate 60,22
                S=S+1
                print S;"000  点"
                J=0
                if S>30000 then *CLEAR
        endif

        wait WAITTIME

        if K$="q" or inkey$="Q" then
                goto *end
        endif

loop

*BOM
        if Y2<=    0 then
                locate 0,Y2
                print "*******";
                locate 0,Y2+1
                print "*******";
                locate 0,Y2+2
                print "*******";
                goto *end
        endif

        if Y2<=1 then
                locate 0,Y2-1
                print "*******";
                locate 0,Y2
                print "*******";
                locate 0,Y2+1
                print "*******";
                locate 0,Y2+2
                print "*******";
                goto *end
        endif

        locate 0,Y2-2
        print "*******";
        locate 0,Y2-1
        print "*******";
        locate 0,Y2
        print "*******";
        locate 0,Y2+1
        print "*******";
        locate 0,Y2+2
        print "*******";


*END
locate 30,9
print "***************"
locate 30,10
print "***GAME OVER***"
locate 30,11
print "***************"

'キーが押されるまで待つ
do
loop while inkey$=""

'最初に戻る
goto *FIRST

'30000以上になると計算できないのでクリア
*CLEAR
locate 30,9
print "****************"
locate 30,10
print "***CLEAR***"
locate 30,11
print "****************"

'キーが押されるまで待つ
do
loop while inkey$=""

'最初に戻る
goto *FIRST


TOP 戻る
連絡先くっきー