BASIC(GOSUB)


映画『300』(2007)
スパルタ軍300人と、ペルシャ軍10万人の戦いです。ペルシャはゾウとか連れてきますが、スパルタの300人は槍と盾で応戦します。とにかくスパルタンが強いです。体罰のスパルタ学習は嫌ですが、とにかく頭を追い込んでフル回転させて、というスパルタ学習は自分に向いてると思います。

今回も、BASICやります。今回はGOSUB命令を使って、ダンジョンにモンスターを出現させます。

書式) GOSUB 行番号またはラベル名

行番号は修正する度に変わるので、ラベル名にします。monsterというラベルにしました。

monster:
  monster_exists = INT(RND * 10)

  if monster_exists = 1 then
    locate 9,1
    print "モンスターが現れた"
  end if

  return

移動してると時々モンスターが現れるようになりました。

モンスターが現れたという表示だけではつまらないので、ヒットポイントを作って、モンスターからダメージを受けるように修正します。
ヒットポイントの変数名はhpにしました。

hp = 100

サブルーチンの方はヒットポイントを10引く処理を追加します。

monster:
  monster_exists = INT(RND * 10)

  if monster_exists = 1 then
    locate 9,1
    print "モンスターが現れた"
    hp = hp - 10
  end if

  return

あと、ヒットポイントが表示されていないと、ダメージを受けていることが分からないので、もう一つサブルーチンを追加します。

status_disp:
  locate 2,20
  print "HP:    " & hp
  return

全ソースです。

takk@ubu16:~/basictest$ cat test.bas | nl -ba -i10 -v10
    10  '$lang: "qb"
    20
    30  hp = 100
    40
    50  dim map$(30)
    60  '                    1         2         3
    70  '           12345678901234567890123456789012345
    80  map$(1)  = "###################################"
    90  map$(2)  = "###################################"
   100  map$(3)  = "###################################"
   110  map$(4)  = "#######S#   #    ##    ############"
   120  map$(5)  = "####### ### #### ## ## #    #######"
   130  map$(6)  = "####### #      #    ## #G## #######"
   140  map$(7)  = "####### # #### ### ### #### #######"
   150  map$(8)  = "#######      #     #        #######"
   160  map$(9)  = "###################################"
   170  map$(10) = "###################################"
   180  map$(11) = "###################################"
   190
   200  x = 8
   210  y = 4
   220
   230  while 1
   240    cls
   250
   260    color 2,1 'green on blue
   270    for yy = y-3 to y+3
   280      print mid$(map$(yy),x-7,15)
   290    next
   300
   310    color  5 'red
   320    locate 4,8
   330    print "*"
   340
   350    color 7,0 'white on black
   360
   370    gosub monster
   380    gosub status_disp
   390
   400    do
   410      let k$ = INKEY$
   420    loop until k$ <> ""
   430
   440    select case k$
   450    case "j"
   460      ck = y + 1
   470      if mid$(map$(ck),x,1) <> "#" and ck <= 8 then y = ck
   480    case "k"
   490      ck = y - 1
   500      if mid$(map$(ck),x,1) <> "#" and ck >= 4 then y = ck
   510    case "h"
   520      ck = x - 1
   530      if mid$(map$(y),ck,1) <> "#" and ck >= 8 then x = ck
   540    case "l"
   550      ck = x + 1
   560      if mid$(map$(y),ck,1) <> "#" and ck <= 28 then x = ck
   570    end select
   580
   590  wend
   600
   610  status_disp:
   620    locate 2,20
   630    print "HP:    " & hp
   640    return
   650
   660  monster:
   670    monster_exists = INT(RND * 10)
   680
   690    if monster_exists = 1 then
   700      locate 9,1
   710      print "モンスターが現れた"
   720      hp = hp - 10
   730    end if
   740
   750    return
   760
takk@ubu16:~/basictest$

モンスターに遭遇すると、ヒットポイントが減ります。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA