回答編集履歴

1

コード内容の追加

2021/02/19 09:02

投稿

退会済みユーザー
test CHANGED
@@ -1,28 +1,24 @@
1
+ 質問の回答にはなってないお遊びコードの修正です。
2
+
3
+
4
+
5
+ 修正前のコードより、落ちる処理と連鎖も作ってみた。
6
+
1
- 適当に書てみた。
7
+ 軽くコメントも入れといた。
2
-
8
+
9
+
10
+
3
- そこら中Containsになてしまった。
11
+ Dictionaryは失敗だた気もする。面倒だった。
4
-
5
- 空のオブジェクトに貼り付けたら一応動く。
12
+
6
-
7
-
8
-
9
- ランダムで3色の球が生成されて、
13
+
10
-
11
- 4つ以上繋がったヤツは消える。
14
+
12
-
13
- それだけ。
14
-
15
-
16
-
17
- 落ちて連鎖の部分は眠くなったのでヤメときます。データを落ちた位置に整列させて再度searchを呼び出すだけ、呼び出した回数が連鎖回数になる、でいいはず。
18
-
19
-
20
-
21
- そもそも、繋がってる判定(下記コードのsearch、searchPositionと同じ様な内容)が出来ているというならその先は特に難しくないのでは、、、?
22
-
23
-
24
-
25
- Listの使い方が分かってないって話ならと簡単ら学習し方がいいと思う
15
+ gif入れてる回答とか分かりやすから入れたかたけどそういえばgif作た事なかた。全くわからん。
16
+
17
+
18
+
19
+ コピペで動作します。
20
+
21
+ 処理が遅いとかコードが汚いとか、変数名がおかしいとか、つっこみどころは山ほどありそうですが、その他いろいろ気にしなければこんな感じで特に難しい事はせずに作れますよって程度に思ってもらえれば。
26
22
 
27
23
 
28
24
 
@@ -34,7 +30,11 @@
34
30
 
35
31
  using UnityEngine;
36
32
 
37
-
33
+ using System.Linq;
34
+
35
+
36
+
37
+ // puyoクラスにしてみた
38
38
 
39
39
  public class Puyo
40
40
 
@@ -46,7 +46,9 @@
46
46
 
47
47
  public bool searched = false;
48
48
 
49
- public int connectedValue;
49
+ public int connectedValue = 0;
50
+
51
+ public int chainId = 0;
50
52
 
51
53
 
52
54
 
@@ -62,18 +64,72 @@
62
64
 
63
65
  }
64
66
 
67
+
68
+
65
69
  public class Scripts : MonoBehaviour
66
70
 
67
71
  {
68
72
 
73
+ // お遊び
74
+
75
+ int[,] twentythree = new int [,] {
76
+
77
+ { 0,0,0,0,1,3 },
78
+
79
+ { 0,0,0,0,1,1 },
80
+
81
+ { 0,3,0,0,4,1 },
82
+
83
+ { 2,4,4,4,3,3 },
84
+
85
+ { 3,3,1,5,2,3 },
86
+
87
+ { 3,2,2,1,5,1 },
88
+
89
+ { 2,1,1,5,2,2 },
90
+
91
+ { 4,5,4,5,3,2 },
92
+
93
+ { 4,4,3,3,1,1 },
94
+
95
+ { 1,5,1,2,3,1 },
96
+
97
+ { 2,5,5,1,2,5 },
98
+
99
+ { 3,1,1,4,2,2 },
100
+
101
+ { 4,4,4,5,5,5 },
102
+
103
+ { 3,3,1,2,1,4 },
104
+
105
+ { 3,4,3,2,1,4 },
106
+
107
+ { 2,2,4,3,2,1 },
108
+
109
+ { 2,1,4,3,2,1 },
110
+
111
+ { 1,1,4,3,4,4 },
112
+
113
+ };
114
+
115
+
116
+
117
+ // データ管理用、正直この方法は失敗したと思います。面倒だった
118
+
69
119
  Dictionary<Vector2Int, Puyo> data = new Dictionary<Vector2Int, Puyo>();
70
120
 
71
-
121
+ private bool falled = true;
122
+
123
+
124
+
125
+ // 動きを確認出来るようコルーチンにして描画処理を走らせる(コードを減らす為)
72
126
 
73
127
  IEnumerator Start()
74
128
 
75
129
  {
76
130
 
131
+ // puyoの位置決定
132
+
77
133
  for (int y = 0; y < 18; y++)
78
134
 
79
135
  {
@@ -82,7 +138,11 @@
82
138
 
83
139
  {
84
140
 
85
- int color = Random.Range(0, 4);
141
+ // int color = Random.Range(0, 6);
142
+
143
+ int color = twentythree[17 - y, x];
144
+
145
+
86
146
 
87
147
  if (color == 0) continue;
88
148
 
@@ -98,35 +158,147 @@
98
158
 
99
159
  if (color == 3) obj.GetComponent<Renderer>().material.color = Color.yellow;
100
160
 
161
+ if (color == 4) obj.GetComponent<Renderer>().material.color = Color.green;
162
+
163
+ if (color == 5) obj.GetComponent<Renderer>().material.color = Color.cyan;
164
+
101
- }
165
+ }
102
-
166
+
103
- }
167
+ }
104
-
105
-
106
-
168
+
169
+
170
+
171
+
172
+
107
- Search();
173
+ // デバッグ表示用の変数
108
-
109
-
110
-
174
+
111
- foreach (var puyo in data)
175
+ int chainCount = 0;
176
+
112
-
177
+ int totalCount = 0;
178
+
179
+
180
+
181
+ // 連鎖のループ
182
+
183
+ while (falled)
184
+
113
- {
185
+ {
114
-
186
+
115
- if (puyo.Value.connectedValue > 3) Destroy(puyo.Value.gameObject);
187
+ FallStart();
116
188
 
117
189
  yield return new WaitForFixedUpdate();
118
190
 
191
+ SearchStart();
192
+
193
+ int id = data.Max(_ => _.Value.chainId);
194
+
195
+ yield return new WaitForSeconds(1.0f);
196
+
197
+ if (id > 0) chainCount++;
198
+
199
+ int count = 0;
200
+
201
+ // 同時消しを別々に処理してみた、id個の同時消しが存在する
202
+
203
+ for (int i = 1; i <= id; i++)
204
+
205
+ {
206
+
207
+ var eraseData = data.Where(_ => _.Value.chainId == i);
208
+
209
+ foreach (var puyo in eraseData)
210
+
211
+ {
212
+
213
+ Destroy(puyo.Value.gameObject);
214
+
215
+ count++;
216
+
119
- }
217
+ }
218
+
120
-
219
+ foreach (var erasePosition in eraseData.ToList())
220
+
221
+ {
222
+
223
+ data.Remove(erasePosition.Key);
224
+
121
- }
225
+ }
226
+
122
-
227
+ yield return new WaitForSeconds(0.2f);
228
+
123
-
229
+ }
230
+
124
-
231
+ // 処理終了でクラスに持たせてしまった変数の初期化、これは正直無駄すぎる気がする
232
+
125
- void Search()
233
+ foreach (var puyo in data)
126
-
234
+
127
- {
235
+ {
236
+
128
-
237
+ puyo.Value.searched = false;
238
+
239
+ puyo.Value.connectedValue = 0;
240
+
241
+ }
242
+
243
+
244
+
245
+ if (id == 0) continue;
246
+
247
+ Debug.Log($"{chainCount}連鎖目、{id}箇所で同時消し、{count}個のpuyoが消えました");
248
+
249
+ totalCount += count;
250
+
251
+ }
252
+
253
+ Debug.Log($"結果、{chainCount} 連鎖、{totalCount}のpuyoが消えました");
254
+
255
+ }
256
+
257
+
258
+
259
+ // 上下左右を調べる、currentPositionと同じ色なら位置を再設定して再起、connectedValue++して繋がっている個数を設定
260
+
261
+ // 再設定された位置はここで検索済みとなる
262
+
263
+ void SearchPosition(Vector2Int currentPosition, Vector2Int searchPosition, List<Vector2Int> positions)
264
+
265
+ {
266
+
267
+ foreach (var position in new Vector2Int[] { Vector2Int.up, Vector2Int.down, Vector2Int.left, Vector2Int.right })
268
+
269
+ {
270
+
271
+ if (!data.ContainsKey(searchPosition + position)) continue;
272
+
273
+ if (data[currentPosition].color == data[searchPosition + position].color && !data[searchPosition + position].searched)
274
+
275
+ {
276
+
277
+ data[currentPosition].connectedValue++;
278
+
279
+ data[searchPosition + position].searched = true;
280
+
281
+ positions.Add(searchPosition + position);
282
+
283
+ SearchPosition(currentPosition, searchPosition + position, positions);
284
+
285
+ }
286
+
287
+ }
288
+
289
+ }
290
+
291
+
292
+
293
+ // 繋がりを検索する
294
+
295
+ void SearchStart()
296
+
297
+ {
298
+
299
+ int id = 0;
300
+
129
- for (int y = 0;y < 18; y++)
301
+ for (int y = 0; y < 18; y++)
130
302
 
131
303
  {
132
304
 
@@ -134,23 +306,35 @@
134
306
 
135
307
  {
136
308
 
309
+ var key = new Vector2Int(x, y);
310
+
137
- List<Vector2Int> positions = new List<Vector2Int>();
311
+ List<Vector2Int> connectedPositions = new List<Vector2Int>();
138
-
139
- var position = new Vector2Int(x, y);
312
+
140
-
141
- if (!data.ContainsKey(position)) continue;
313
+ if (!data.ContainsKey(key)) continue;
142
-
314
+
143
- if (data[position].searched) continue;
315
+ if (data[key].searched) continue;
144
-
316
+
145
- SearchPosition(position, position, positions);
317
+ SearchPosition(key, key, connectedPositions);
146
-
318
+
147
- data[position].searched = true;
319
+ data[key].searched = true;
320
+
148
-
321
+ if (connectedPositions.Count > 3) id++;
322
+
149
- foreach(var pos in positions)
323
+ foreach (var position in connectedPositions)
150
324
 
151
325
  {
152
326
 
153
- data[pos].connectedValue = data[position].connectedValue;
327
+ data[position].connectedValue = data[key].connectedValue;
328
+
329
+ if (data[key].connectedValue > 3)
330
+
331
+ {
332
+
333
+ data[position].chainId = id;
334
+
335
+ falled = true;
336
+
337
+ }
154
338
 
155
339
  }
156
340
 
@@ -160,31 +344,63 @@
160
344
 
161
345
  }
162
346
 
347
+
348
+
163
-
349
+ // 全ての位置情報を回す
164
-
350
+
165
- void SearchPosition(Vector2Int currentPosition, Vector2Int position, List<Vector2Int> positions)
351
+ void FallStart()
166
-
352
+
167
- {
353
+ {
354
+
168
-
355
+ falled = false;
356
+
169
- foreach (var pos in new Vector2Int[] { Vector2Int.up, Vector2Int.down, Vector2Int.left, Vector2Int.right })
357
+ for (int y = 0; y < 18; y++)
170
-
358
+
171
- {
359
+ {
172
-
360
+
173
- if (!data.ContainsKey(position + pos)) continue;
361
+ for (int x = 0; x < 6; x++)
174
-
175
- if (data[currentPosition].color == data[position + pos].color && !data[position + pos].searched)
362
+
176
-
177
- {
363
+ {
178
-
179
- data[currentPosition].connectedValue++;
364
+
180
-
181
- data[position + pos].searched = true;
365
+ if (data.ContainsKey(new Vector2Int(x, y)))
366
+
182
-
367
+ {
368
+
183
- positions.Add(position + pos);
369
+ Fall(new Vector2Int(x, y));
184
-
185
- SearchPosition(currentPosition, position + pos, positions);
370
+
186
-
187
- }
371
+ }
372
+
373
+ }
374
+
375
+ }
376
+
377
+ }
378
+
379
+
380
+
381
+ // 下方向、最下段、もしくは下にpuyoが無くなるまで回す
382
+
383
+ void Fall(Vector2Int position)
384
+
385
+ {
386
+
387
+ var falledPosition = new Vector2Int(position.x, position.y - 1);
388
+
389
+ if (position.y < 1) return;
390
+
391
+ if (!data.ContainsKey(falledPosition))
392
+
393
+ {
394
+
395
+ data.Add(falledPosition, data[position]);
396
+
397
+ data[falledPosition].gameObject.transform.position = new Vector3(falledPosition.x, falledPosition.y, 0);
398
+
399
+ data.Remove(position);
400
+
401
+ falled = true;
402
+
403
+ Fall(falledPosition);
188
404
 
189
405
  }
190
406
 
@@ -192,6 +408,4 @@
192
408
 
193
409
  }
194
410
 
195
-
196
-
197
411
  ```