04-02 配列の操作 06/18 07/09

こんにちわ。kotaron7です。
最近ペルソナ5にハマってるんですよ。みなさんペルソナご存じですか?
兎にも角にも曲とUIがかっこいいんですよ。せっかくゲームを作るなら、内容も然り、ユーザーインターフェースにも気を使って最初どれだけ見づらくても人を引き込む作品にしたいですよね。
いやいや、安心してください勉強もしてます😪😪

~( TロT)σ では本編に参りましょう

練習問題4-2-2

アイテムがなくなるまでアイテムつかっちゃおう

function setup() {
  let items = ["やくそう", "たいまつ", "せいすい"];
  print("所持アイテム: " + items);
  // ここにコードを書いてください
  for(i = 0; i <= items.length + 1; i++)
  {
    let usedItem = items.pop();
    print("勇者は「" + usedItem + "」を使った!");
    if (items.length == 0)
      {
        print("すべてのアイテムを使い切りました");
      }
    else{
      print("所持アイテム: " + items);
    }
  }
}

ここのfor文、while文にしたほうがいいのかなあ。
悩みどころだなあ。

function setup() {
  let items = ["やくそう", "たいまつ", "せいすい", "キメラのつばさ", "かぎ"];
  print("最初: " + items);
  

  // ここにコードを書いてください
  items.splice(2,1,"まんげつそう");
  items.splice(0,0,"やくそう(大)");
  items.splice(items.length -1,1);
  print(items);
}

spliceが非常に便利だった。今までのpopの代用にもなるし。
items.length-1の表現以外だとpopをつかうのか?

練習問題4-2-7

function setup() {
  let rank1 = ["ピンスティック","ひのきのぼう"];
  let rank2 = ["きょうじゃのこん","せいどうのツメ","くさかりがま","シーブスナイフ"];
  let rank3 = ["バトルアックス","はがねのツメ","はがねのムチ","はがねのやり"];
  let rank4 = ["オルテガのオノ","パパスの剣","シルバークロー","あくまのムチ"];
  let rank5 = ["メタルキングの剣","ラーミアのムチ","ゾンビキラー","はやぶさの剣"];

  let tickets = 30;    // 手持ちチケット
  let n = 0;           // 累計回数

  while (tickets > 0) {
    tickets--;
    n++;

    let r = random();
    let gatya = random();
    let item = "";
    if (r < 0.03) 
    {
      item = rank5[int(gatya*rank5.length) % rank5.length];
      print(n + "回目:"+item+"★5(★★★★★)");
    } 
    else if (r < 0.03 + 0.07) 
    {
      item = rank4[int(gatya*rank4.length) % rank4.length];
      print(n + "回目:"+item+" ★4(★★★★)");
    } 
    else if (r < 0.03 + 0.07 + 0.15) 
    {
      item = rank3[int(gatya*rank3.length) % rank3.length];
      print(n + "回目:"+item+" ★3(★★★)");
    } 
    else if (r < 0.03 + 0.07 + 0.15 + 0.30)
    {
      item = rank2[int(gatya*rank2.length) % rank2.length];
      print(n + "回目:"+item+" ★2(★★)");
    } 
    else 
    {
      item = rank1[int(gatya*rank1.length) % rank1.length];
      print(n + "回目:"+item+" ★1(★)");
    }
  }

  print("合計" + n + "回引きました");
}

itemの何を取るかをあまりを用いて選ぼうとしたが、2つ詰まってしまうところがあった。

1.ランダム関数
ランダムに選んだものを割ることで求めようとしたが、最初に設定されていたガチャをするための”r”を使ってやってしまったので、星5が出るときは必ず0.03より小さい値となり、必ずリストの一番目が選ばれるようになっていた。

2.割る数

あるランダムの数字に10をかけて整数化していたが、これにより得られる数は0~9の10通りで、5で割った場合は切りよくすべて公平に割り当てられるが、4で割った場合などは9を割るときにあまりが1となり、8までのあまりを合わせると一つ多い結果になっていた。

割る数をリストの長さの倍数倍にしておくことで、絶対にその整数で割り切れる数がランダムの最後の数になるため偏りなく確率でアイテムを表示することができた!!

練習問題4-2-8(チャレンジ問題)

10連ガチャの結果を記憶して、レアリティ順に並べ替えてみます!

function setup() {
  let rank1 = ["ピンスティック","ひのきのぼう"];
  let rank2 = ["きょうじゃのこん","せいどうのツメ","くさかりがま","シーブスナイフ"];
  let rank3 = ["バトルアックス","はがねのツメ","はがねのムチ","はがねのやり"];
  let rank4 = ["オルテガのオノ","パパスの剣","シルバークロー","あくまのムチ"];
  let rank5 = ["メタルキングの剣","ラーミアのムチ","ゾンビキラー","はやぶさの剣"];

  let result1 = [];
  let result2 = [];
  let result3 = [];
  let result4 = [];
  let result5 = [];


  let tickets = 10;    // 手持ちチケット
  let n = 0;           // 累計回数

  while (tickets > 0) {
    tickets--;
    n++;

    let r = random();
    let gatya = random();
    let item = "";
    if (r < 0.03) 
    {
      item = rank5[int(gatya*rank5.length) % rank5.length];
      result1.push(item);
    } 
    else if (r < 0.03 + 0.07) 
    {
      item = rank4[int(gatya*rank4.length) % rank4.length];
      result2.push(item);
    } 
    else if (r < 0.03 + 0.07 + 0.15) 
    {
      item = rank3[int(gatya*rank3.length) % rank3.length];
      result3.push(item);
    } 
    else if (r < 0.03 + 0.07 + 0.15 + 0.30)
    {
      item = rank2[int(gatya*rank2.length) % rank2.length];
      result4.push(item);
    } 
    else 
    {
      item = rank1[int(gatya*rank1.length) % rank1.length];
      result5.push(item);
    }
  }
  result1.sort();
  result2.sort();
  result3.sort();
  result4.sort();
  result5.sort();
  print("★★★★★は"+result1.length +"個!"+"内訳はコチラ →"+ result1);
  print("★★★★は"+result2.length +"個!"+"内訳はコチラ →"+ result2);
  print("★★★は"+result3.length +"個!"+"内訳はコチラ →"+ result3);
  print("★★は"+result4.length +"個!"+"内訳はコチラ →"+ result4);
  print("★は"+result5.length +"個!"+"内訳はコチラ →"+ result5);
  let result = result5.concat(result4,result3,result2,result1);
  result.reverse();
  print(result);
  print("合計" + n + "回引きました");
}

リストを一つ一つ分けるとめちゃくちゃ見やすい。

むしろ、このやり方以外がわからん..。。sortを使うやり方にするのなら、各リストの中のアイテムごとに点数と優先順位をつけてやる必要があってそれのほうがめんどくさそう。

concatでリストをくっつけて新しいリストにすることができちゃいます。
sortで並び替えるやり方ですが、一行ずつ書かないと行けないので結構無駄がありました。
リストの名前を変更するだけなのでうまくやればまとめられるのでは??

さて、今日はこのへんで失礼します!

コメントする