スクリプトを作れるようになろう-02

投稿者:Material 7186 1 mini ikosami 投稿日:2012/03/21 20:46

どうも。ikosamiです。

前回を見ていない人は、↓を先に見てください。
http://blog.rmake.jp/ikosami/1662


③チャプターで別々に分けて、何度も使えるようにする

すべてのスクリプトをひとつのチャプターに書くと、
新しい機能を追加したい時に、色々と面倒です。

ですので今回は、チャプターで、別々に分けて作ってみましょう。



まず関数です。
これを一番上のチャプターに設定します。

def Array(a)
  a = splitString(a, ",")
  i = 0
  while i < getArrayLength(a)
    a[i] = toNumber(a[i])
    i = i + 1
  end
return a
end


これはコピーすればいいので、説明は省きます。
自分で関数を作るのは、ある程度理解してからにしましょう。

では、次に設定です。
これは前回と少し変える必要があります

s = createArray()
s[0] = Array("1,1,1,1,1")
s[1] = Array("1,0,1,1,0,1")
s[2] = Array("1,0,0,0,0,2,1")
s[3] = Array("1,0,1,1,0,1")
s[4] = Array("1,1,1,1,1")
x = 1;y = 1

setVariable("s", s)
setVariable("x", x)
setVariable("y", y)


x = 1
などの、楽な変数の設定は、チャプターが変わると初期化されます。
なので、
setVariable("x", x)
と、あとで普通の変数に入れる必要があります。

sの方は、たくさん書かないといけないので、
こういう方法にする理由はわかると思いますが、
setVariable("x", 1)
を、わざわざ

x = 1
setVariable("x", x)

としているのは、解説④で
xとyの数が増えるからです。


では、最後にメインスクリプトの設定です。
チャプターを変えているので、
s = getVariable("s")
などを追加して、設定を読み込む必要があります。

s = getVariable("s")
x = getVariable("x")
y = getVariable("y")

loop = true
  while loop
  case speakWithSelect(4,"↑","→","←","↓", 
      "どちらに進みますか?")
    when 0
      xi =  0;yi = -1
    when 1
      xi =  1;yi =  0
    when 2
      xi = -1;yi =  0
    when 3
      xi =  0;yi =  1
  end

  if s[y+yi][x+xi] == 0
    speak("進みました。")
    x = x + xi;y = y + yi
  elsif s[y+yi][x+xi] == 2
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    goEnding()
  else
    s[y+yi][x+xi] == 1
    speak("その方向には壁があり、進めません。")
  end
end



これでチャプター分けは完璧です。
とは言っても、普通は最初からこの状態に作るのですが・・・






④たくさんのステージを作ってみる。


せっかくチャプターごとに分けたのですから、
ステージをたくさん作ってみましょう。

クリアすると次のステージに進むという形式を作るには、
初期設定が必要になります。

とは言っても、難しい物ではありません。

setVariable("ST", 1)


これが初期設定のすべてです。STはStage(ステージ)のSTなので、別にSTである必要はありません。
要するに「今、どのステージか」を表す変数です。

チャプターの位置はここです。




そしてステージのチャプターをこのようにします。

s = createArray()


if getVariable("ST") == 1
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,2,1")
  s[2] = Array("1,0,0,0,1")
  s[3] = Array("1,0,1,1,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 2
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,1")
  s[2] = Array("1,0,0,0,0,2,1")
  s[3] = Array("1,0,1,1,0,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 3
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,0,1")
  s[2] = Array("1,0,0,0,0,0,1")
  s[3] = Array("1,0,1,1,0,0,1")
  s[4] = Array("1,0,0,0,1,0,1")
  s[5] = Array("1,1,1,1,1,2,1")
  x = 3;y = 4
elsif getVariable("ST") == 4
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,0,1,0,0,1")
  s[2] = Array("1,1,0,0,0,1,1")
  s[3] = Array("1,2,1,1,0,0,1")
  s[4] = Array("1,0,0,0,0,0,1")
  s[5] = Array("1,0,1,0,1,0,1")
  s[5] = Array("1,1,1,1,1,1,1")
  x = 1;y = 1
else
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()
end
speak("ステージ",getVariable("ST"))
setVariable("s", s)
setVariable("x", x)
setVariable("y", y)



と、こんな感じになります。

条件判定の、
if getVariable("ST") == 1

elsif getVariable("ST") == 2

elsif getVariable("ST") == 3

elsif getVariable("ST") == 4

else

end

の意味はわかりますよね?

わからない方は、aoihikawaさんの解説を先に読んでください。
http://page.rmake.jp/wikis/105


その条件判定の中に
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,1")
  s[2] = Array("1,0,0,0,0,2,1")
  s[3] = Array("1,0,1,1,0,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1

などのステージ設定を入れただけです。



では、次にメインスクリプトを、
クリアすると次のステージに進むという形式に
対応させます。

これも、とても単純で、

ゴールした時の
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    goEnding()


    speak("ゴールです。")
    speak("次のステージへ進みます。")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("設定")

と、こうするだけです。

setVariable("ST", getVariable("ST")+1)
は、設定のチャプターに行ったと時に
次のステージを読み込むためのものです。

changeChapter("設定")は

「changeChapter」をカタカナ読みすると、
「チェンジチャプター」
チャプター変更(移動)です。



これで、今回の講座は終わりです。

では、成果を確認してみましょう。

「」内がチャプター名です。


「関数」
内容:Wikiから全部コピー

def Array(a)
  a = splitString(a, ",")
  i = 0
  while i < getArrayLength(a)
    a[i] = toNumber(a[i])
    i = i + 1
  end
return a
end


「初期設定」
内容:変数をひとつ設定するだけの存在
setVariable("ST", 1)



「設定」
内容:ステージ設定。これ以上ステージがない場合はクリア

s = createArray()


if getVariable("ST") == 1
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,2,1")
  s[2] = Array("1,0,0,0,1")
  s[3] = Array("1,0,1,1,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 2
  s[0] = Array("1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,1")
  s[2] = Array("1,0,0,0,0,2,1")
  s[3] = Array("1,0,1,1,0,1")
  s[4] = Array("1,1,1,1,1")
  x = 1;y = 1
elsif getVariable("ST") == 3
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,1,1,0,0,1")
  s[2] = Array("1,0,0,0,0,0,1")
  s[3] = Array("1,0,1,1,0,0,1")
  s[4] = Array("1,0,0,0,1,0,1")
  s[5] = Array("1,1,1,1,1,2,1")
  x = 3;y = 4
elsif getVariable("ST") == 4
  s[0] = Array("1,1,1,1,1,1,1")
  s[1] = Array("1,0,0,1,0,0,1")
  s[2] = Array("1,1,0,0,0,1,1")
  s[3] = Array("1,2,1,1,0,0,1")
  s[4] = Array("1,0,0,0,0,0,1")
  s[5] = Array("1,0,1,0,1,0,1")
  s[5] = Array("1,1,1,1,1,1,1")
  x = 1;y = 1
else
  speak("すべてのステージをクリアしました!\nおめでとうございます!")
  goEnding()
end

speak("ステージ",getVariable("ST"))
setVariable("s", s)
setVariable("x", x)
setVariable("y", y)




「メイン」
内容:メインスクリプト
s = getVariable("s")
x = getVariable("x")
y = getVariable("y")

loop = true
while loop
  case speakWithSelect(4,"↑","→","←","↓", 
      "どちらに進みますか?")
    when 0
      xi =  0;yi = -1
    when 1
      xi =  1;yi =  0
    when 2
      xi = -1;yi =  0
    when 3
      xi =  0;yi =  1
  end

  if s[y+yi][x+xi] == 0
    speak("進みました。")
    x = x + xi;y = y + yi
  elsif s[y+yi][x+xi] == 2
    speak("ゴールです。")
    speak("次のステージへ進みます。")
    setVariable("ST", getVariable("ST")+1)
    changeChapter("設定")
  else
    s[y+yi][x+xi] == 1
    speak("その方向には壁があり、進めません。")
  end
end



暗闇迷路 - 【迷路ゲーム】

わからない部分が、少しでもあったらどんどんコメントしてください。


ちなみに、次回は、地図が登場します。

コメントする

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

コメント一覧

Kako cnphiicefg6eavij mini machio(投稿日:2012/03/23 17:24, 履歴)
再度ですが、
ホントに・・・「あんたスゲーよ・・・・」です。
この講座をそのまま一度入力してみるだけでも、何となーく手が覚えてくれて、入力前より怯えなくなりますね。

昔々の「マイコン」という雑誌の偉い読者プログラマーの方達を思い出します。。(年齢がバレます^^;)
Material 7186 1 mini ikosami(投稿日:2012/03/23 18:22, 履歴)
再度ですが、
ありがとうございます(^^)

マイコンって、発行が終わった時僕は1歳ですね(^^;)



今、第3回の地図作成を書き終えたところですが、
これは、ちょっと難易度が一気に上昇しすぎた気がします・・・
「今回はわかりにくかったです」とか書かれそうですが、
この返信をした時点で、すでに書き込み終えているので、
ぜひ見てみてください。
Images 3    mini sekirin(投稿日:2012/03/22 18:26, 履歴)
今回もわかりやすかったです。
公開はしませんが、別窓でカンペしながら同じものを作ってみています。
画像を入れられるのが楽しみです。

「メイン」のチャプターを主に計算させていく、ということだと思うのですが
「関数」「初期設定」「設定」のチャプターを前提に「メイン」のチャプターが進んでいく、
という解釈で大丈夫でしょうか?
チャプターは一つずつしか進めないと思っていたので、
全部まとめて一つのシーンだという見方を初めて知りました。
Material 7186 1 mini ikosami(投稿日:2012/03/22 21:58, 履歴)
>>今回もわかりやすかったです。
>>公開はしませんが、別窓でカンペしながら同じものを作ってみています。
>>画像を入れられるのが楽しみです。
ありがとうございます(^^)


>>「メイン」のチャプターを主に計算させていく、ということだと思うのですが
>>「関数」「初期設定」「設定」のチャプターを前提に「メイン」のチャプターが進んでいく、
>>という解釈で大丈夫でしょうか?

はい。大丈夫です。
「メイン」に入る前の設定を基にして、メインスクリプトを作動させる感じです。

一つにまとめることも可能ですが、
編集の時に、ややこしいので(^^;)


>>チャプターは一つずつしか進めないと思っていたので、
>>全部まとめて一つのシーンだという見方を初めて知りました。
チャプターを行ったり来たりすることで、
少しのスクリプトで、長いゲームを作ることができます。
これを知っているだけで、作れるゲームの幅が一気に膨大しますよ(^^)

<補足>
ちなみに、チャプターを使えないようなRmake外でのプログラミングでは、
def みたいなやつで囲んで、それでチャプター移動みたいなことをします。
Images 3    mini sekirin(投稿日:2012/03/23 13:31, 履歴)
わかりました。ありがとうございます^^