質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

4324閲覧

Unityで実行しますとフリーズしてしまいます

sitappa1981

総合スコア66

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/03/28 20:10

すみませんが質問させてください。
現在私は横10×縦8のカードを生成して、カーソルを合わせたカードと隣接している同じ色のカードを選択する、いわゆるさめがめ系の開発を試みています。
しかし下の方に書いてあるdo~while文を追加したところ、カーソルをカードに合わせた途端にUnityがフリーズしてしまいまして、動かなくなってしまう現象が発生しました。
do~while文の内部で無限ループにでも入っているのではないかと考えられるのですがどうしても原因や解決策が見出せません。
do~while文の中で行いたい内容は、カーソルを合わせたカードの上下左右に同じ色のカードが存在した場合、更にそこから上下左右にチェックして同じ色のカードが無いかを探しに行く事です。
もしよろしければどなたかご教授願えませんでしょうか?
よろしくお願いします。

実装したい内容
http://www.afsgames.com/samegame.htm
(現在は隣接している同じ色のカードが無くても色が変わってしまいますが、そこは後ほど修正します)

使用環境:Unity5.5.1、Visual Studio 2015

Unity

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class MainScripts : MonoBehaviour { 8 9 public GameObject[] BoxPrefab = new GameObject[6]; //生成するBox 10 public GameObject obj; //カーソルを合わせたオブジェクト 11 12 public bool cursor = false; //カーソルを合わせてチェックを行う判定 13 public bool check = false; //隣接しているカードがあるかどうかの判定 14 public bool changecolor = false; //隣接しているパネルが存在し、色を変えるかどうかの判定 15 16 public int[,] boxTBL = new int[10,8]; //横10*縦8のカードを生成する配列 17 public int[,] checkTBL = new int[10, 8]; //横10*縦8の同じカードが並んでいるかのチェックを入れる配列 18 public int idx; //カーソルを合わせたカードのx座標を代入 19 public int idy; //カーソルを合わせたカードのy座標を代入 20 public int color; //色番号を格納する 21 22 public string objname = ""; //オブジェクト名を格納する場所 23 24 /* 25 //横10*縦8のBoxを生成する配列 26 public int[,] boxTBL = new int[,] { 27 {0,0,0,0,0,0,0,0,0,0}, 28 {0,0,0,0,0,0,0,0,0,0}, 29 {0,0,0,0,0,0,0,0,0,0}, 30 {0,0,0,0,0,0,0,0,0,0}, 31 {0,0,0,0,0,0,0,0,0,0}, 32 {0,0,0,0,0,0,0,0,0,0}, 33 {0,0,0,0,0,0,0,0,0,0}, 34 {0,0,0,0,0,0,0,0,0,0} 35 }; 36 */ 37 38 39 // Use this for initialization 40 void Start () { 41 //起動時にはカーソルは合わせていないので偽とする 42 cursor = false; 43 //起動時には隣接しているカードの判定は偽とする 44 check = false; 45 //隣接しているカードの判定は偽とする 46 changecolor = false; 47 //カードをx軸0、y軸0から順番に生成する 48 //生成されるカードのy座標はマイナスなので注意…0→-1→-2...etc 49 for (int idy = 0; idy < 8; idy++) { 50 for (int idx = 0; idx < 10; idx++) { 51 //1番から5番のカードをランダムで選択する 52 boxTBL[idx, idy] = Random.Range(1, 6); 53 //idy.idx座標の場所を選択する 54 int R = boxTBL[idx, idy]; 55 //座標の値が0で無ければ 56 if (boxTBL[idx, idy] != 0) { 57 //idx.idyの座標に(y軸はマイナス) 58 Vector2 pos = new Vector2(idx, -idy); 59 //オブジェクトをインスタンス生成する 60 GameObject buller = Instantiate(BoxPrefab[R - 1], pos, Quaternion.identity); 61 //インスタンス生成されたオブジェクトに座標を入れた名前に変更する 62 buller.name = "Card_x" + idx + "_y" +idy; 63 } 64 } 65 } 66 } 67 68 // Update is called once per frame 69 void Update () { 70 //GameDateからカーソルが入っているかを常にチェック 71 cursor = GameData.Cursor; 72 //カードにカーソルが合わさった時 73 if (cursor) { 74 //オブジェクトのx座標を取得 75 idx = (int)GameData.Pointx; 76 //オブジェクトのy座標を取得 77 idy = (int)(Mathf.Abs(GameData.Pointy)); 78 //座標を取得したのでGameDateの判定を偽にする 79 GameData.Cursor = false; 80 //オブジェクト名を登録する 81 objname = "Card_x" + idx + "_y" + idy; 82 //登録したオブジェクト名のオブジェクトを探す 83 GameObject obj = GameObject.Find(objname); 84 //見つかったオブジェクトの色を黒にする 85 obj.GetComponent<Renderer>().material.color = Color.black; 86 //座標の場所にフラグを立てる 87 checkTBL[idx, idy] = 1; 88 //隣接しているカードが同じかどうかのチェック 89 CardCheck(); 90 //座標チェックフラグを偽にする 91 cursor = false; 92 } 93 } 94 95 //隣接している同じ色のカードをまとめてチェックする項目 96 void CardCheck() { 97 //選択したカードの色を格納する 98 color = boxTBL[idx, idy]; 99 //x座標が1以上の場合 100 if (idx > 0) { 101 //左隣のカードの色が同じ場合 102 if (boxTBL[idx, idy] == boxTBL[idx - 1, idy]) { 103 //左隣が同じフラグを立てる 104 checkTBL[idx - 1, idy] = 1; 105 //隣接しているカードが存在するフラグを立てる 106 changecolor = true; 107 } 108 } 109 //x座標が8以下の場合 110 if (idx < 9) { 111 //右隣のカードの色が同じ場合 112 if (boxTBL[idx, idy] == boxTBL[idx + 1, idy]) { 113 //右隣が同じフラグを立てる 114 checkTBL[idx + 1, idy] = 1; 115 //隣接しているカードが存在するフラグを立てる 116 changecolor = true; 117 } 118 } 119 120 //y座標が1以上の場合 121 if (idy > 0) { 122 //上隣のカードの色が同じ場合 123 if (boxTBL[idx, idy] == boxTBL[idx , idy-1]) { 124 //上隣が同じフラグを立てる 125 checkTBL[idx, idy-1] = 1; 126 //隣接しているカードが存在するフラグを立てる 127 changecolor = true; 128 } 129 } 130 //y座標が6以下の場合 131 if (idy < 7) { 132 //下隣のカードの色が同じ場合 133 if (boxTBL[idx, idy] == boxTBL[idx, idy + 1]) { 134 //下隣が同じフラグを立てる 135 checkTBL[idx, idy + 1] = 1; 136 //隣接しているカードが存在するフラグを立てる 137 changecolor = true; 138 } 139 } 140 //更に隣接しているカードがあるかのチェック 141 do { 142 check = false; 143 for (int idy = 0; idy < 8; idy++) { 144 for (int idx = 0; idx < 10; idx++) { 145 if (checkTBL[idx, idy] == 1) { 146 //x座標が1以上の場合 147 if (idx > 0) { 148 //左隣のカードの色が同じ場合 149 if (boxTBL[idx, idy] == boxTBL[idx - 1, idy]) { 150 //左隣が同じフラグを立てる 151 checkTBL[idx - 1, idy] = 1; 152 check = true; 153 } 154 } 155 //x座標が8以下の場合 156 if (idx < 9) { 157 //右隣のカードの色が同じ場合 158 if (boxTBL[idx, idy] == boxTBL[idx + 1, idy]) { 159 //右隣が同じフラグを立てる 160 checkTBL[idx + 1, idy] = 1; 161 check = true; 162 } 163 } 164 //y座標が1以上の場合 165 if (idy > 0) { 166 //上隣のカードの色が同じ場合 167 if (boxTBL[idx, idy] == boxTBL[idx, idy - 1]) { 168 //上隣が同じフラグを立てる 169 checkTBL[idx, idy - 1] = 1; 170 check = true; 171 } 172 } 173 //y座標が6以下の場合 174 if (idy < 7) { 175 //下隣のカードの色が同じ場合 176 if (boxTBL[idx, idy] == boxTBL[idx, idy + 1]) { 177 //下隣が同じフラグを立てる 178 checkTBL[idx, idy + 1] = 1; 179 check = true; 180 } 181 } 182 } 183 } 184 } 185 } while (check); 186 187 188 for (int idy = 0; idy < 8; idy++) { 189 for (int idx = 0; idx < 10; idx++) { 190 if (checkTBL[idx, idy] <= 1) { 191 192 //オブジェクト名を登録する 193 objname = "Card_x" + idx + "_y" + idy; 194 //登録したオブジェクト名のオブジェクトを探す 195 GameObject obj = GameObject.Find(objname); 196 //見つかったオブジェクトの色を黒にする 197 obj.GetComponent<Renderer>().material.color = Color.black; 198 199 } 200 } 201 } 202 } 203} 204 205

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば、boxTBL[1,1]=1,boxTBL[1,2]=1だったとします。
カーソルの当たった座標が[1,1]だったとすると、
doループに入る時前にはcheckTBL[1,1]、checkTBL[1,2]は1になっています。

1回目のdo
1.forでcheckTBL[1,1]が1なので、[1,1]をの隣が同じかどうか調べます。
2.[1,2]が同じなので、checkTBL[1,2]に1を入れ、checkをtrueにします。
3.[1,2]での調査でも同じようなことが行われます。

2回目のdo
1.forでcheckTBL[1,1]が1なので、[1,1]をの隣が同じかどうか調べます。
2.[1,2]が同じなので、checkTBL[1,2]に1を入れ、checkをtrueにします。
3.[1,2]での調査でも同じようなことが行われます。

と同じことを延々と繰り返すことりなります。
ですので、隣がすでに調査済みであれば、スキップすべきです。

投稿2017/03/28 23:32

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sitappa1981

2017/03/29 04:25

ありがとうございます!!物凄く解りやすかったです!! 指定した配列に1が入っていた場合はスキップするように設定すると無事ループから抜け出せました!! どうしても解らず本当に頭を抱えていたところでしたので凄く助かりました。 また何かありましたら是非ともよろしくお願いします!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問