• ベストアンサー

Math.ramdom()を特定回数繰り返す

Math.ramdomについての質問です。 特定回数ランダム処理を行った後に、別のフレームに飛ぶというのは、どのようにやればいいのでしょうか? 分かりづらいと思うので、例を書きます。 ---例---------------------------- 左右のキャラが交互にランダム選択の言葉を掛け合う。それを3回おこなった後に、左右のキャラがフェードアウト。 --------------------------------- こんな感じの動きです。 最初forを使って特定回数処理を行おうかと思ったんですが、forって一気に処理しますよね? ということは、ひとつのランダム処理を行った後に次のランダム処理をする場合には使えないということになりますよね? 分かりづらい説明ですいません。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

”ランダムにセリフが変わるアニメ”を3回繰り返した後、キャラクターがフェードアウトする、という作品ではないでしょうか。 このように考えてはいかがでしょう。 例えば、会話のアニメが 20 フレームでできているとします。 アニメの最初のフレームに、セリフを選択するスクリプトを書きます。 変数を1つ用意しておいて、アニメの最後のフレームでカウントをとり、更に、”このカウントが3回未満ならアニメの最初に戻る”というスクリプトを書きます。 あとは会話アニメの先のフレームにキャラがフェードアウトするアニメを作っておけば、会話を3回繰り返し、フェードアウトする作品になります。 会話アニメの最初には会話のパターンを選ぶスクリプトが書かれています。会話アニメの最初に戻った時にはパターンを選ぶスクリプトが実行されるので、会話の内容は毎回ランダムに選択されます。 前回 No.1520309 の質問でも書きました通り、変数で数字や演算を扱う場合は変数の初期化が大切です。 今回は変数でカウントを取りますから、カウント用の変数に最初に0を入れておかないと回数が正しくカウントされず、フレーム間をまたいだループが正常に動かなくなります。 セリフの選択は、配列変数で予めパターンを作っておいて、その番号(インデックス)を選択する方法が簡単です。 変数の初期化や配列変数の準備などは最初の1回だけ実行すれば充分ですから、初期化するスクリプト専用のフレームを作ると便利です。 まとめますと、次のような構成になります。 仮に、会話アニメは 20 フレームで作るとします。  フレーム1  :初期設定  フレーム2~21:会話アニメ  フレーム22~ :キャラのフェードアウト スクリプトはフレーム1・2・ 21 に書きます。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  ●フレーム1  //会話の回数を保持  cnt = 0;  //会話のパターンを管理  pattern = 0;  //セリフを設定  word_a = new Array( "○○○" , "□□□" , "△△△" );  word_b = new Array( "●●●" , "■■■" , "▲▲▲" );  ●フレーム2  //会話のパターンを選ぶ  pattern = Math.floor( Math.random() * ( 2 - 0 + 1 ) ) + 0;  //セリフを取り出す  a = word_a[ pattern ];  b = word_b[ pattern ];  ●フレーム21  //会話した回数を更新  cnt++;  //会話の回数が3回未満であれば、セリフの選択・会話アニメに戻る  //それ以外は先に進む  if( cnt < 3 )  {   gotoAndPlay( 2 );  } フレーム1では、必要な変数の初期設定をまとめて行います。 仮にキャラAとBがいるとして、Aのセリフは word_a 、Bのセリフは word_b という配列変数に入れてあります。 会話だと、例えばAが○○○と言った時にBが▲▲▲といったトンチンカンな言葉を返しては変でしょうから、word_a と word_b はそれぞれ対応するようにセリフを入れています。 セリフが長くて配列変数に入れにくい時は、word_a1 = "・・・"; というように固定の名前+通し番号で変数名を付けておくと、配列変数と同じようなことができます。 Aの言葉に対してBが適当なことを言っても構わないのなら、2つの配列に対応させてセリフを用意しなくても構いませんし、セリフの種類も同じ数にする必要もありません。 また、乱数はAとBのセリフをそれぞれ決めるために2種類選ぶことになるかと思います。 このあたりは、作品に合わせて適宜変更してください。 フレーム2では、乱数を使ってセリフを選択します。 任意の範囲内で乱数を作る方法については、#1の方が挙げていらっしゃるページをご参考になさってください。 乱数で何を選ぶかというと、配列のインデックス番号をランダムに選びます。 上記のスクリプトでは、セリフが3パターン、つまり、配列変数の中に変数は3つ作られています。インデックスでいうと0番から2番までの変数があります。 この中の1つを選ぶには0~2の間で乱数を作り、できた乱数で配列変数を参照すればいいことになります。 スクリプトの中では計算式が分かるように書きましたが、  pattern = Math.floor( Math.random() * 3 ); としても同じことです。 できた乱数をもとにセリフを格納した配列変数を参照して、セリフを決めます。 上記のスクリプトではとりあえず、キャラAのセリフを a 、キャラBのセリフを b という変数に入れています。ダイナミックテキストで変数の内容を表示するなどして、利用してください。 フレーム 21 のスクリプトが、会話アニメを繰り返すための肝となる部分です。 for 文は  for( i = 0 ; i < 3 ; i++ ) 単に3回繰り返すだけなら、何もこんなややこしい書き方をしなくてもいいような気がしますが、これにはちゃんと理由があります。 for 文の動作原理は、2番目のパラメータとして与えられた条件が成立している間だけループを継続するというものです。 上記の for は”3回繰り返す”ではなく、正式には、” i が3未満の間( i < 3 が成立している間)ループを継続する”という意味になります。 i の値を0からスタートし、1回の処理が終了するごとに i のカウントを1つ増やして、与えられた条件を判断します。 ループを繰り返すと i の値は1ずつ増えます。やがて i は3以上になり、i < 3 の条件が不成立になります。この時点でループが打ち切られます。 つまり、i < 3 が成り立つのは i が0・1・2の時だけなので、結果的に処理が3回繰り返されるというだけです。 for 文は1つのフレーム内で繰り返し処理を行うものです。20 フレームからできたアニメを3回繰り返すためには利用できません。 そこで、for 文と同じ仕組みを変数とフレームアクションを使って再現し、複数のフレームにわたるループを作ります。 ループカウンタとして cnt という変数を用意し、会話アニメを繰り返した数を記録します。初期値は0です。 会話アニメが終わるたびにカウントを1増やし、これが3未満である間、アニメを繰り返すようにします。 cnt は0から始まり、カウントは1ずつ増えますから、cnt の値が3未満の間とは、cnt に0・1・2が入っている3回限りということになります。 いくつかのフレームをまたいではいますが、考え方は for のループと全く同じです。 カウントを取って繰り返す方法や、配列変数にデータを用意してランダムに選択するといった手法はいろいろな局面に応用できます。 今回はセリフを配列変数に入れてランダムに選択しましたが、アニメを何パターンか作っておき、各アニメの開始フレームを配列変数で管理すると、再生するアニメそのものをランダムに選ぶこともできます。 以前、似たような作例を紹介したことがありますので、よろしければご参照ください。 #2で、紹介しております。  ・Flashで線がうねって波みたいに?!   http://okweb.jp/kotaeru.php3?q=816038 タイムライン上に用意しておいたアニメ(上記の例では3パターン)をランダムに選択し、再生する・・・というのを無制限に繰り返す方法です。 アニメを選択するたびにカウントを取り、3未満であれば次のアニメを選択、それ以外なら先に進むようにスクリプトを書くと、アニメを繰り返す回数を指定できます。 ちなみに、上記の例で tbl_ref に乱数を入れるのではなく、tbl_ref++; として単純に加算していくと、ある決まった順序(配列変数に書かれた順序通り)でアニメを再生できます。

coder
質問者

お礼

DPEさんのご指導のお陰で無事再生させることができました。 それにしてもDPEさんはすごいですね、ほんとに。 尊敬です。

coder
質問者

補足

はい、DPEさんのおっしゃる通りのアニメーションです。 なんかものすごい説明不足で申し訳ないです。 しかも前回に続き、今回もこんなに詳しく説明していただき、ありがとうございました。 何となく分かったので、取りあえずこれから挑戦してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#35109
noname#35109
回答No.1

いったい何についてのご質問なのかがよくわかりませんよ。 題名は,random関数に関しての質問で,本文はforの質問になっています。 乱数で,その後を変えたい場合は, 乱数が整数の方が,処理しやすいと思います。 これには,Math.random() だけでは不十分で, Math.floor(Math.random()*10) などで,整数化しておく必要があります。 http://www.macromedia.com/jp/support/flash/ts/documents/fl0173.html を参照のこと。 次ですが, >> forを使って特定回数処理を行おうかと思ったんですが、 >> forって一気に処理しますよね? forは一気に処理しますが,forを使っても使わなくても一気に処理します。 たとえば,3回繰り返し。 a = 乱数; もし a が1だったら,Aは「こんにちは」と言う  もしくは a が2だったら,Aは「さようですか」と言う   もしくは a が3だったら,Aは「いやはやなさけない…」と言う    それ以外,Aは「バイバイ」と言う b = 乱数; もし b が1だったら,Bは「こんばんは」と言う  もしくは b が2だったら,Bは「それはびっくり」と言う   もしくは b が3だったら,Bは「どうしよう…」と言う    それ以外,Bは「バイバイ」と言う a = 乱数; もし a が1だったら,Aは「こんにちは」と言う  もしくは a が2だったら,Aは「さようですか」と言う   もしくは a が3だったら,Aは「いやはやなさけない…」と言う    それ以外,Aは「バイバイ」と言う b = 乱数; もし b が1だったら,Bは「こんばんは」と言う  もしくは b が2だったら,Bは「それはびっくり」と言う   もしくは b が3だったら,Bは「どうしよう…」と言う    それ以外,Bは「バイバイ」と言う a = 乱数; もし a が1だったら,Aは「こんにちは」と言う  もしくは a が2だったら,Aは「さようですか」と言う   もしくは a が3だったら,Aは「いやはやなさけない…」と言う    それ以外,Aは「バイバイ」と言う b = 乱数; もし b が1だったら,Bは「こんばんは」と言う  もしくは b が2だったら,Bは「それはびっくり」と言う   もしくは b が3だったら,Bは「どうしよう…」と言う    それ以外,Bは「バイバイ」と言う forを使っていませんが,コレくらいのスクリプトだったら, 0.00001秒? くらいで済んでしまいます。 人間が何かしゃべったところを見る間もなく,会話は終わります。 だから, 問題はforを使うとか使わないではないと思います。 いったいどういうタイミングで会話がさせたいのか, 時間制御か,ボタンクリックか。 それともアニメーションと同期か。 その辺のところをちゃんと考えて,アニメーションをさせないと,できないと思います。 それと,予感ですが… 具体的にどういうときにどういうことがしたいのか考えられたとしても ---例---------------------------- 左右のキャラが交互にランダム選択の言葉を掛け合う。 それを3回おこなった後に、左右のキャラがフェードアウト。 --------------------------------- の部分を説明できる自信は全くありません。 それで良ければ,補足してください。 他の方が答えてくださるかもしれませんし, わかることでしたら,時間はかかるかもしれませんが,答えるつもりはあります。 まったく自信はなしですが。

coder
質問者

補足

ものすごい説明不足で申し訳ございません。 そうですよね、イベントが起こるタイミングとかそういうものを全く説明してませんね。 【ムービー説明】 1.イベントは左右にキャラクターがいるフレームが再生されたら、発生します。 2.会話は左の人が何かしゃべって、それに対して右の人が何かをしゃべる。この時に話す会話の内容はいくつかあるパターンの中からrandom選択です。 3.ひとつの会話のパターンのアニメーションが終わったら続いて、別のパターンの会話のアニメーションを始める。これを3回繰り返した後に、会話を終了し先のフレームに進む。 こんな感じのムービーです。 ランダム選択のやり方や、さらに配列を組んで同じものが選択されないやり方は分かるんです。 ただ、ランダム選択した会話のアニメーションを「3回だけ繰り返す」というやり方が分からなかったんです。 そこで、最初にfor分を使って3回繰り返すのを考えたのですが、forは1Frでの繰り返し処理で、特定の長さを持つアニメーションの繰り返し処理は出来ないですよね? そういった疑問の質問をさせていただきました。 ものすごく説明不足なのに、こんなにどういう情報が必要なのかというのを教えてくださってありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Math.randomは0にはならない? 0になる

    ・意味が分からないコードがあるので教えてください ■コード for (var i = 0; i < 10; ++i) {  switch ((Math.random() * 4) | 0) {  case 0: hoge(); break;  case 1: …… ■質問 ・これはどういう処理をするコードでしょうか? ・「Math.random … 0 以上1未満」ということは0にはならないのでしょうか? なぜ「 | 0」? ・breakした場合、switchは抜けるけど、for文は継続?

  • integerクラスとMathクラス

    適当な整数numをキーボードから入力し、その回数だけ0から360までの整数をランダムに発生させ、その整数を角度(弧度法)とみなしたとき、その正接(tan)が最大のとなる整数を表示するプログラム を以下の手順で下記に作成した結果、角度が同じ値になります。これはどうしてですか?また、手順通りのプログラムにするにはどのようなプログラムて適切ですか?     手順      (1)最大値となる角度を代入する整数型の変数maxを初期値-90で定義する。      (2)乱数を発生させる回数を入力する。      (3)0から360までの整数を、乱数を使って1つ発生させ、整数型の変数degに保存。この値を表       示する。      (4)角度degをラジアンに変換し、実数型の変数radに代入し、表示する。変換は             rad = deg * Math.PI/180.0 (Math.PIは円周率を表す)       で行なうことができる。ただし、実際のプログラムでは上式をそのまま書くのではなく、変数       の型に注意して記述すること。      (5)radを用いて正接(tan)を計算する。      (6)maxから計算されるtanの値と比較し、(4)の結果の方が大きければmaxをdegに書き換え       る。      (7)(2)から(5)を入力した回数になるまで繰り返す      (8)maxを表示する。import java.io.*; class Kakudo3 { public static void main(String args[]) throws IOException { int max = -90; System.out.println("整数を入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num = Integer.parseInt(str1); int deg =(int)(Math.random()*360); for(int i=0; i<num; i++){ System.out.print(deg+","); } double rad = deg*Math.PI/180.0; Math.tan(rad); } }

    • ベストアンサー
    • Java
  • 再訪時のランダムな背景について

    FLASH初心者です。 いま,FLASH MX 2004 でホームページを作っています。 再訪時に背景をランダムに表示したくてうまくできないので困っています。どなたかご教授ください。 具体的には,レイヤーの一番下段の「背景」のフレームに img = Math.floor(Math.random()*6+1); this.loadMovie(img+".jpg"); と書くと、ランダムに外部JPG画像が変わるのですが、 「背景」のレイヤーの上段にある文字やボタンが表示されません。 画像もゆっくりフェードインするようにアルファ値で変化させたいのですが,それも受け付けてくれません。 どのようにすればいいのでしょうか。

    • ベストアンサー
    • Flash
  • 特定のものにだけスクリプトを有効にする

    今晩は。JavaScript初心者です。 今、雪を降らせるスクリプトを作っています。 外部のjsファイルに記述したスクリプトを、特定のidを付けたdivにだけ有効にしたいです。 -----html------------------------------ <html> <head> <script type="text/javascript" src="js/snow.js"></script> </head> <body> <div id="snow"> </div> </body> </html> -----JavaScript(snow.js)------------------------------ sx = new Array(); sy = new Array(); sp = new Array(); num = 50; scrnx = 100; scrny = 500; function snowWrite() { styl = "<img src='snow.gif' style='position:relative;width:6px;height:6px;z-index:3;top:"; for (i=0; i<num; i++) { sx[i] = Math.floor(Math.random()*100); sy[i] = Math.floor(Math.random()*500); sp[i] = Math.floor(Math.random()*5) + 1; document.write(styl+sy[i]+"px;left:"+sx[i]+"px;' name='snow"+i+"'>"); } } function moveSnow() { for (i=0; i<num; i++) { sy[i] += sp[i]; if (sy[i] > scrny) sy[i] = -10; document.images["snow"+i].style.top = sy[i]; } } snowWrite(); 「document.getElementById」あたりかなと思ったのですが、それだとして(まったく見当違いかもしれませんが)、どこにどう記述してよいのかわかりません。 ご存知の方がいらっしゃいましたら、ご教授いただきたいです。 よろしくお願い致します。

  • Flash 重複しないムービー再生とその後の処理について

    標題の件、似たようなケースは多く、質問もいろいろ寄せられているの ですが、どうしても自分のケースに応用できなくて質問させていただき ました。 バージョンは「Flash MX 2004」で、やりたいことは以下の内容です。 ------------------------------------------- (1)9つのムービークリップを重複しないようにランダムに再生。  (なので正確にはシャッフルになるのでしょうか。。) (2)全てのムービーを再生後、次のフレームへ移動します。 ------------------------------------------- 以上です。 現在、1フレーム目に“Math.random();”を使ってランダムな数を取得 し、2~10フレームまで任意のフレームへ移動するよう設定していま す。2~10フレームまでは各ムービーを1フレームずつ配置している 状態で、それぞれstop();を設定しています。 各ムービークリップの最後のフレームには“_root.gotoAndStop(1);”を 設定して再びランダムな数を取得するようにしていますが、これだと重複 してしまうし、なおかつループし続けます。 「重複せずに全ムービーを再生後、11フレームへ移行する」という処理 がどうしてもわからず、ここから先が行き詰まってしまいました。 Math.random();のメソッド自体が適切でないのかも知れませんが、それら もふまえて、ご伝授いただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS2 ランダムに出現する煙

    初めて質問させてもらいます。 FLASHのActionScriptで画面下から画面上へ昇っていく煙をランダムに出現させるASを作成したのですが、動き的には満足しているのですが開始時に画面に一気に煙がですぎになります。 煙のない状態から始めるには何を付け加えればいいのかわかりません。 どなたかご教授願えるかたお願いいたします。 環境 FLASH cs3.AS2にて製作 ソース ・タイムライン ----------------------------------------------- for (var i = 0; i<10; i++) { snow.duplicateMovieClip("snow"+i, i); } ----------------------------------------------- ・mc ----------------------------------------------- onClipEvent (load) { sw = Stage.width; sh = Stage.height; th = this._height; this._x = Math.random()*sw; this._y = Math.random()*sh; speed = Math.random()*4+1; flick = Math.random()*4+1; rotate = Math.random()*1; } onClipEvent (enterFrame) { this._y -= speed; this._x -= flick; this._rotation +=rotate; if (this._y<-869.8) { this._y = 1400; } if (this._x>sw+th || this._x<-th) { this._x = Math.random()*sw; this._y = -th; } } ----------------------------------------------- よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • ぐるぐるーぷ。

    作りたい内容ですが、 (1)乱数を出して、表示。 (2)ループで前回と違う乱数を表示。 (3)あとは任意の回数表示させて終了。 【フレーム1】 a = 0;//前回のrandam_aを代入する!これで前の数字を出さないようにする。 aa = 0;//aループの条件スイッチ do{ randam_a = Math.floor(Math.random()*9) + 1;//ランダムの整数 if(randam_a == a){ aa = 1;//ここで【doループ】抜けれるようにフラグ } while (aa == 1); aa = 0;//また【フレーム1】に戻っても【doループ】できるように。 規定回数を表示を満たしてないなら gotoAndPlay(2); 規定回数の表示を満たしたなら gotoAndPlay(3); 【フレーム2】 hyouji = randam_a;//ダイナミックテキストに表示。 gotoAndPlay(1); 【フレーム3】 なにもなし。 おおまかに作りましたが 無限ループで抜けれない>< 悪いところは条件文って そこしかないので判るのですが、 どういう表現で、この流れが作れるか お助けくださいませ。

    • ベストアンサー
    • Flash
  • ムービークリップを特定の組み合わせでランダム再生

    Adobe Flash Pro CS6 でAction Script 3を使っています。 今現在複数あるループムービーを特定の組み合わせでランダム再生する方法を考えています。 使用するムービークリップの数は全部で5つです。 mcA,mcB,mcC,mcD,mcEと5つあります。クリップの再生時間はmcDのみが20フレームでほかはすべて10フレームです。これらのムービークリップをある程度のランダム性を持たせて特定の順番で再生したいのです。特定の順番は以下のとおりです。 mcA - mcB mcA - mcB - mcB mcC - mcD - mcE mcC - mcD - mcD - mcE mcC - mcD - mcD - mcD - mcE この四通りの再生方法でムービークリップをランダムで再生し続けたいのです。 それぞれのクリップはループになっているのでmcBからmcA or mcC、mcEからmcA or mcCに繋がってもシームレスに再生し続けられる感じになっています。 どういった方法を用いるのが最善でしょうか? 今現在一つのレイヤーに (mcA - mcB)( mcA - mcB - mcB )(mcC - mcD - mcE)(mcC - mcD - mcD - mcE)(mcC - mcD - mcD - mcD - mcE) と言った感じにすべてのムービークリップを再生する順番に配置して、それぞれの区切りでフレームラベルを用意して、配列にフレームラベルをすべて入れて、その配列とMath.randomを組み合わせてフレームラベルをランダムで選び、再生位置を飛ばして再生し続けていますが、これだとレイヤーの管理がしにくいのでいまいちしっくりきません。

    • ベストアンサー
    • Flash
  • ソート(?)がうまくいかない。

    こんにちは、今おみくじスクリプトを作成しているのですが、うまくいかない点があります。 大吉や吉といったランクごとに、健康運や恋愛運といった6つの部分が◎○△×のどれかにランダムでなるというスクリプトをつくりました、うまく実行はされるのですが、処理が重く、IEで「実行をとめますか?」とエラーが出ています。 何か、おかしな点があれば、教えていただけませんか? for(cnt=0;cnt<w.ura;cnt++) { j = Math.floor(Math.random()*i); if(utc[j]==0) utc[j] = "◎"; else{ cnt -=1; } } for(cnt=0;cnt<w.urb;cnt++) { j = Math.floor(Math.random()*i); if(utc[j]==0) utc[j] = "○"; else{ cnt -=1; } } for(cnt=0;cnt<w.urc;cnt++) { j = Math.floor(Math.random()*i); if(utc[j]==0) utc[j] = "△"; else{ cnt -=1; } } for(cnt=0;cnt<w.urd;cnt++) { j = Math.floor(Math.random()*i); if(utc[j]==0) utc[j] = "×"; else{ cnt -=1; } } w.ura等は、ランクごとの◎などの数が格納されたストラクトです。 やっていることは、◎の数まわして、空の配列であれば、◎をいれるといったことです。 よろしくご教授ください。