持っているだんごの数を数えるスクリプト

投稿者:Icon2 icon mini miyakin2 投稿日:2011/09/11 21:27

ゲームを作っていて、持っているアイテムを数える方法を考えた。
素人なので間違っているかもしれません。

まず配列を取得するという意味(getItemIdArray())

【アイテム】
・だんご
・だんご
・直訴状

上のように三つのアイテムを持っているとすると、getItemIdArray()で、
7991 7991 8054
のようにアイテムIDの配列を取得します。
配列の何番目かを表わす値をインデックスといって0から始まります。

a=getItemIdArray()
として、aという変数に配列を入れると、

a[0]==7991
a[1]==7991
a[2]==8054

のようにアイテムに番号を振ることができます。
アイテム欄の一番上に表示されるものがa[0]です。

こんなことを踏まえた上で、
持っているだんごの数を調べるのは、以下のようなスクリプトになります。
(9/13修正 3行目のspeak("a")をspeak(a)に修正。)
a=getItemIdArray()  #所持アイテムID配列取得

speak(a) #配列の答えがメッセージウインドウに表示されます
                #この行は練習用だから使うときは削除して下さい

i=0          #a[i]を、最初はa[0]から始めますと言う準備。
              #a[0]とは所持アイテム欄の一番上のアイテムを指します。
              #二番目にあるアイテムはa[1]、三番目はa[2]……これはスクリプトの決まりごとです

x=0         #所持アイテムの個数を答える準備。調べる前は0個という意味。
              #最後に、持っているアイテム数はx個と答えが出る。

while i <50         #whileは繰り返し命令。次の行で、iの数をa[i]のiに入れるので、
                       #a[0]から始まってa[49]まで繰り返すという意味になる。
                       #(50は好きな数に変更可。100にするとa[0]からa[99]まで調べる)

   if a[i]==7991   #もしもa[0](所持アイテムの一番目)にあるアイテムIDが7991であれば…。
                      #a[i]とは最初はa[0]のこと、二周目はa[1](所持アイテムの二番目)に変わる

   x=x+1           #xに1を足す(アイテムID7991を1個見つけたという意味)

   else              #アイテムIDが7991でなければ、
   x=x+0           #xに0を足す(見つけた個数が変わらないという意味)

   end

i=i+1                #iとはa[i]のiなので、この命令で二周目は0+1になりa[1]を調べることになる

end                 #whileの行まで戻ってあと49回繰り返す。
                     #a[49]まで調べたら、その次はi=50になってしまって、
                     #while i <50 を越えるので本当の終わりになる

speak("持っているだんごの数は",x,"個です。")
        #本当の終わりになったらこの行に来る
        #持っているアイテムの数をメッセージウインドウに表示する
        #この行は練習用だから使うときは削除して下さい。


以上でだんごをx個持っていると分かりました。
これをだんご屋のイベントに書くとすると以下のスクリプトも続けて書く。
関数ファイルから文章の選択肢メッセージウインドウを選んで、

case speakWithSelect(5,"1個買う","3個買う","5個買う","10個買う", "いらない",
    "おいしいだんごはいらんかね。\n1個1銭だよ。")

  when 0
  if getMoney()<1  #お金が1銭より少ないと…
  speak("お金が足りないよ。")

  else
   if x>9  #ここでxを使っている。
   speak("だんごは10個までしか持てないよ。")
   else
    giveItem(7991)
    playSound(73823)
    subMoney(1)
    speak("まいどありー。")
    end
  end

  when 1
  if getMoney()<3  #お金が3銭より少ないと…
  speak("お金が足りないよ。")
  else
   if x>7  #ここでxを使っている。
   speak("だんごは10個までしか持てないよ。")
   else
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    playSound(73823)
    subMoney(3)
    speak("まいどありー。")
    end
 end

  when 2
  if getMoney()<5  #お金が5銭より少ないと…
  speak("お金が足りないよ。")
  else
   if x>5  #ここでxを使っている。
   speak("だんごは10個までしか持てないよ。")
   else
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    playSound(73823)
    subMoney(5)
    speak("まいどありー。")
    end
  end

 when 3
  if getMoney()<10  #お金が10銭より少ないと…
  speak("お金が足りないよ。")
  else
   if x>0  #ここでxを使っている。
   speak("だんごは10個までしか持てないよ。")
   else
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    giveItem(7991)
    playSound(73823)
    subMoney(10)
    speak("まいどありー。")
    end
  end

   when 4
   speak("またどうぞ。")

end


以上です。

コメントする

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

コメント一覧

Icon2 icon mini miyakin2(投稿日:2011/09/11 23:58, 履歴)
おお、詳しい解説をありがとうございます。
下のwhileはすぐに理解できますけど、
その下の関数はじっくり見ないと難しいですね……
慣れるまでコツコツ勉強したいと思います。
wikiの入門編も慣れなくて、やっとキャラを四方に歩かせることができました。
これから弾を撃たせる勉強をするところです。
Cdv30200 aoi icon mini aoihikawa(投稿日:2011/09/11 22:27, 履歴)
シンプルに、良く纏まっていると思います。

なお、後半のスクリプトにも
while文を応用することで、よりスマートにできます。
case speakWithSelect(5,"1個買う","3個買う","5個買う","10個買う", "いらない", 
    "おいしいだんごはいらんかね。\n1個1銭だよ。") 
  
  when 0 
    if getMoney()<1 
      speak("お金が足りないよ。") 
    else 
      if x>9  #ここでxを使っている。 
      speak("だんごは10個までしか持てないよ。") 
      else 
        giveItem(7991) 
        playSound(73823) 
        subMoney(1) 
        speak("まいどありー。") 
      end 
    end 
    
  when 1 
    if getMoney()<3 
      speak("お金が足りないよ。") 
    else 
      if x>7  #ここでxを使っている。 
        speak("だんごは10個までしか持てないよ。") 
      else 
        i = 0
        while i < 3
          giveItem(7991) 
          i = i + 1
        end
        playSound(73823) 
        subMoney(3) 
        speak("まいどありー。") 
      end 
    end 
  
  when 2 
    if getMoney()<5 
      speak("お金が足りないよ。") 
    else 
      if x>5  #ここでxを使っている。 
        speak("だんごは10個までしか持てないよ。") 
      else 
        i = 0
        while i < 5
          giveItem(7991) 
          i = i + 1
        end
        playSound(73823) 
        subMoney(5) 
        speak("まいどありー。") 
      end 
    end 
 
 when 3 
   if getMoney()<10 
     speak("お金が足りないよ。") 
   else 
     if x>0  #ここでxを使っている。 
       speak("だんごは10個までしか持てないよ。") 
     else 
       i = 0
        while i < 10
          giveItem(7991) 
          i = i + 1
        end
       playSound(73823) 
       subMoney(10) 
       speak("まいどありー。") 
     end 
   end 
 
 when 4 
   speak("またどうぞ。") 
 
end


さらに、似たようなスクリプトを繰り返す場合、
「関数」という形で定義してあげると、
より便利になります。
def OdangoGet(x, kosuu)
  if getMoney() < kosuu 
      speak("お金が足りないよ。") 
    else 
      if x > (10 - kosuu)  #ここでxを使っている。 
        speak("だんごは10個までしか持てないよ。") 
      else 
        i = 0
        while i < kosuu
          giveItem(7991) 
          i = i + 1
        end
        playSound(73823) 
        subMoney(kosuu) 
        speak("まいどありー。") 
      end 
    end 
  end
end

case speakWithSelect(5,"1個買う","3個買う","5個買う","10個買う", "いらない", 
    "おいしいだんごはいらんかね。\n1個1銭だよ。") 
  
  when 0 
    OdangoGet(x, 1)
  when 1 
    OdangoGet(x, 3)
  when 2 
    OdangoGet(x, 5)
  when 3 
    OdangoGet(x, 10)
 
  when 4 
    speak("またどうぞ。") 
 
end

なお、「関数とは何か」についてはこちらの記事の、最後付近に記載しておりますので、
参照頂けると幸いです。