スクリプト/つくってみよう1

最終投稿者:Nyan mini rurun9 更新:2013/11/29 16:20:17
ハイ、こんにちわー。

今回は簡単なゲームを実際に作ってみましょーか。
その前にコチラを見ておいて下さい。

スクリプト/配列

変数をたくさん用意したいとき、a0,a1,a2,a3,…のように名前に数字を付けてしまいたい場合があります。
そんな時は配列変数にしちゃった方が管理が楽ですよっと。
配列を扱うのは非常にワカり難いかもしれませんが、
何番目の変数かというのを示すインデックス部分に別の変数を入れる事ができ、複雑なスクリプトを組み上げる事が可能になります。
ぶっちゃけ、配列無しでは高度なゲームをつくるのは無理です。是非とも習得しましょー。


ルールはこんな感じのを用意しました。
トランプを使います
1~13をランダムで並べかえて伏せておく…山
手札にも1~13を一枚ずつ持っている
手札から一枚を選んで出し、山からも一枚めくってきて、二つを比べる
数の大きい方に +1 点
13枚終了時の点数を表示
完成するとこんなの ⇒ ◆13H&L
サーティーン ハイ&ロー!!
前半は運の要素が強いものの、後半は残りの札が限られてくるので、勝敗の確率が偏りますね。
コレが面白いかどうかはさておき、つくってみました。
仮にこれがライアーゲームだったりカイジだったりしたら、つまらないとか言ってる場合じゃありませんw
ノベル型でチャプターを分けて書いてあります。
ではさっそくスクリプトを見ていきましょー
#chapter0
#◆◆◆ゲームの色々な設定やユーザー定義関数を作っておくチャプター◆◆◆

setHelpVisible(false) #メニュー項目の非表示
setMenuItemVisible(getMenuHideWindow(), false)
setMenuItemVisible(getMenuSave(), false)
setMenuItemVisible(getMenuLoad(), false)

setSpeakWindowRect(50,50,700,500) #メッセージウインドウの位置&大きさ
setSelectWindowRect(600,80,100,420) #選択肢ウインドウの位置&大きさ

setTextViewMode(false) #文字列が一瞬で全部表示される

setVariable("山札", createArray() ) #山札0~12
setVariable("手札", createArray() ) #手札13枚から毎ターン減っていく


def moji(n) #数字から文字に変換する処理
 case n
 when 0 return "A"
 when 1 return "2"
 when 2 return "3"
 when 3 return "4"
 when 4 return "5"
 when 5 return "6"
 when 6 return "7"
 when 7 return "8"
 when 8 return "9"
 when 9 return "10"
 when 10 return "J"
 when 11 return "Q"
 when 12 return "K"
 end
end #moji()終


def word() #表示する文章をつくる処理
 setVariable("win", 0); setVariable("loose", 0) #点
 w="COMvsPLAYER\n\n"
 i=0
 while i<getVariable("turn")
   w=w+moji( getVariable("山札")[i] )
   if getVariable("山札")[i] < getVariable("出札")[i]
     w=w+" < "+moji( getVariable("出札")[i] )+" ○\n"
     setVariable("win",getVariable("win")+1)
   elsif getVariable("山札")[i] == getVariable("出札")[i]
     w=w+" = "+moji( getVariable("出札")[i] )+"\n"
   else
     w=w+" > "+moji( getVariable("出札")[i] )+" ☓\n"
     setVariable("loose",getVariable("loose")+1)
   end
 i=i+1
 end

 return w
end #word()終
チャプター0ではまず画面の設定と、使う配列変数を用意しています。
それからゲーム中に必要となる処理を、ユーザー定義関数でまとめています。

テストプレイするとわかるように、文字ゲーなので画面表示しているのは文字列だけです。
moji()では、スクリプト中ではカード番号0~12なのをトランプに変換して表示する為のものです。
カード0番がエースつまり1というように、数値とトランプ表示が1ズレている点には注意。

word()では、出された山札vs出した手札、そしてどちらが勝ったのかを一行で書き、これをターン数分改行しながら繰り返しているワケです。
#chapter1
#◆◆◆変数に初期値を入れるチャプター◆◆◆

setVariable("turn", 0) #ターン
setVariable("出札", createArray() ) #出札を初期化しておく(中身が入ってない状態になる)

i=0 #まずは数を0から順に並べる
while i<13
  getVariable("山札")[i]=i
  getVariable("手札")[i]=i
i=i+1
end

i=0 #13枚をシャッフルする
while i<13
  r=rand(13) #山札の i 番目とランダム r 番目を入れ替える
  x=getVariable("山札")[i]
  getVariable("山札")[i]=getVariable("山札")[r]
  getVariable("山札")[r]=x
i=i+1
end
チャプター1では、変数に初期値を与えてゲームの準備をしています。
ゲーム終了後に「再プレイする」場合に、"chapter1"に戻ってきます。

次からが動作のメインとなる部分になります。
#chapter2
#◆◆◆ゲームのメイン部分となるチャプター◆◆◆

#手札の枚数分だけ処理をする為に、数をmaxに入れておく
max=getArrayLength( getVariable("手札") )

i=0 #手札を moji() で文字に変換した 配列s を選択肢配列とする
s=createArray()
while i<max
  pushArray( s, moji( getVariable("手札")[i] ) )
i=i+1
end

#画面に前回までの結果と、選択肢を表示。何番目を選んだのかを k に入れる
k=speakWithSelectArray( s, word() )

#選んだ札の番号 k を、出札に加える
pushArray( getVariable("出札"), getVariable("手札")[k] )


#ここから使用した 手札[k] を抜き取る処理
ss=createArray() #臨時配列を用意
i=0
while i<max
  if i!=k #今回選んだ k 番目以外を 臨時配列ss に加えていく
    pushArray( ss, getVariable("手札")[i] )
  end
i=i+1
end

#臨時配列ss を手札に写す
setVariable("手札", createArray() ) #とりあえず初期化
i=0
while i<max-1 #一枚抜いたから1だけ少ない
  pushArray( getVariable("手札"), ss[i] )
i=i+1
end

#以上で選択肢配列 s から、使用したものが抜き取られたのでターン終了。次へ
setVariable("turn", getVariable("turn")+1 )


if 12<getVariable("turn") #もし13枚の手札を全て使ったら勝敗判定へ
  changeChapter("chapter3")
else #まだ手札が残っているなら、繰り返す
  changeChapter("chapter2")
end
画面上に結果を表示して選択肢を出しているのが、たったの一行ですw
これこそが配列変数を使ってスッキリした良い点と言えるでしょう。
手札を配列で管理しているので、moji()で変換して選択肢として表示しています。

手持ちの札(選択肢)が一度使うとなくなるので、
使ってない残りだけの配列をつくって、それを手札に戻しています。

今回はターン数をturnという変数で管理していますが、これは残り手札枚数から逆算する事もできる筈ですよね。
#chapter3
#◆◆◆勝敗を数えて結果を表示するチャプター◆◆◆

w=word()+"\n"+getVariable("loose")+" vs "+getVariable("win")

#同点以上ならクリアできるようにしています
if getVariable("loose") <= getVariable("win")
  case speakWithSelect(2,"Again","Clear", w+" Win" )
  when 0 changeChapter("chapter1")
  when 1 goEnding()
  end
else
  case speakWithSelect(2,"Again","End", w+" Loose" )
  when 0 changeChapter("chapter1")
  when 1 goBadEnding()
  end
end
終了時に結果を表示して完成です。


どうでしたか?
自分でつくっておいてアレですが、文字ゲーで選択肢を減らしていくよりも、
画像を並べてマウスでクリックしていく方が絶対に判り易いんじゃないか?とか思いましたorz

ともかく、これが理解できれば配列は扱えるようにはなるかと。
そうしたら、スクリプト/コツ/売ったり買ったりできるお店処理 なんかを読んでみてはいかがでしょうか?
知らない関数はリファレンスで調べて、
ユーザー定義関数で何を処理しているのか、を把握するのが大切です。
今となってはRPGのお店機能が標準システムに加わったので、敢えて自分でお店を作る必要性までは無くなってしまいましたが、RPGでのアイテムの管理には配列を扱える事が必須となっています。
是非とも挑戦してみましょ-。

ともかく、お疲れ様でしたー。
次回は、スプライトを使ったアクションゲームに挑戦します!

 スクリプトの組み方の基礎知識など

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Nyan mini rurun9(投稿日:2010/08/14 17:24, 履歴)
えーと
誰からもツッコミが入らなかったけど無駄な部分を省いておきました。
Nyan mini rurun9(投稿日:2010/08/01 17:01, 履歴)
そーですね、初回から配列は誰もついて来れない感じになり、やっちまった感が(汗)

配列の途中をひとつを引っこ抜く、という作業がややこしいだけなんですが。
…今気付いた。コレ ss もローカル変数配列でいいんだ…
      mini shirosaboten(投稿日:2010/08/01 15:32, 履歴)
はぁ~、配列って難しいですねぇ…もうしばらくこのブログ記事とにらめっこしてみます