🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

836閲覧

Unity(C#)のListに関して

manafie08

総合スコア4

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/02/15 11:28

編集2021/02/16 09:46

Unityでぷよぷよを作ろうとしています!
以下のCheck()関数で連鎖を実装しようとしています。
同じ色が何個つながっているかの判定は成功していますが、Addがうまくつかえていません。
samecolorsetには、つながっている個数分の値が入っていて欲しいのですが、最初の1つの要素だけ代入された形になってしまっています。

samecolorset.Add(i)としているのが同じぷよが検出された際にsamecolorsetというListに要素を追加する、という処理になります!

考えられる原因を教えていただきたいです、、!

C#

1 2 public void Check(int i) { 3 this.samecolorset.Add(i); 4 this.samecolorpuyo.Add(puyos[i]); 5 6 if (this.checks[i] == 1) return; //元からchecks[i]=1ならi番ぷよは調査済なので確認しない 7 8 this.checks[i] = 1; //これからi番ぷよを調査するので0→1に直しておく 9 for (int j = 0; j < this.puyos.Length; j++) { 10 if (this.puyox[i] == this.puyox[j] && this.puyoy[i] == this.puyoy[j] + 1.0f && 11 this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] == 0) { // <span class="crayon-c">下(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> 12 Check(j); 13 } 14 if (this.puyox[i] == this.puyox[j] && this.puyoy[i] == this.puyoy[j] - 1.0f && 15 this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] == 0) { // <span class="crayon-c">上(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> 16 Check(j); 17 } 18 if (this.puyox[i] == this.puyox[j] + 1.0f && this.puyoy[i] == this.puyoy[j] && 19 this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] == 0) { // <span class="crayon-c">左(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> 20 Check(j); 21 } 22 if (this.puyox[i] == this.puyox[j] - 1.0f && this.puyoy[i] == this.puyoy[j] && 23 this.puyos[i].transform.name == this.puyos[j].transform.name && this.checks[j] == 0) { // <span class="crayon-c">右(j番ぷよ:未調査)と自分自身(i番ぷよ)が同色</span> 24 Check(j); 25 } 26 } 27 return; 28 } 29} 30

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

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

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

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

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

gentaro

2021/02/15 12:41

> 考えられる原因を教えていただきたいです、、! デバッグでステップ実行すりゃわかるだろうに。
cleaner

2021/02/15 16:35

どううまくいってないのかが質問からは分からないと思います。 Addした結果どううまくいってないのでしょうか?
y_waiwai

2021/02/15 23:07

うまくつかえてないとは、どういうふうになるんでしょうか。 そこらへんを説明しましょう
Zuishin

2021/02/16 09:53

> 考えられる原因を教えていただきたいです、、! 多すぎて。
BeatStar

2021/02/16 10:29

デバッグぐらいはやりましょうよ…… デバッグやテストをやらないっていうのはあり得ないです。 Coccoaに不具合が出たのは、納期が短すぎて、かつ横着してテストもせずにやったことが原因のようです。
guest

回答1

0

ベストアンサー

質問の回答にはなってないお遊びコードの修正です。

修正前のコードより、落ちる処理と連鎖も作ってみた。
軽くコメントも入れといた。

Dictionaryは失敗だった気もする。面倒だった。

gif入れてる回答とか分かりやすいから入れたかったけど、そういえばgif作った事なかった。全くわからん。

コピペで動作します。
処理が遅いとかコードが汚いとか、変数名がおかしいとか、つっこみどころは山ほどありそうですが、その他いろいろ気にしなければこんな感じで特に難しい事はせずに作れますよって程度に思ってもらえれば。

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; // puyoクラスにしてみた public class Puyo { public GameObject gameObject; public int color; public bool searched = false; public int connectedValue = 0; public int chainId = 0; public Puyo(int color, GameObject gameObject) { this.color = color; this.gameObject = gameObject; } } public class Scripts : MonoBehaviour { // お遊び int[,] twentythree = new int [,] { { 0,0,0,0,1,3 }, { 0,0,0,0,1,1 }, { 0,3,0,0,4,1 }, { 2,4,4,4,3,3 }, { 3,3,1,5,2,3 }, { 3,2,2,1,5,1 }, { 2,1,1,5,2,2 }, { 4,5,4,5,3,2 }, { 4,4,3,3,1,1 }, { 1,5,1,2,3,1 }, { 2,5,5,1,2,5 }, { 3,1,1,4,2,2 }, { 4,4,4,5,5,5 }, { 3,3,1,2,1,4 }, { 3,4,3,2,1,4 }, { 2,2,4,3,2,1 }, { 2,1,4,3,2,1 }, { 1,1,4,3,4,4 }, }; // データ管理用、正直この方法は失敗したと思います。面倒だった Dictionary<Vector2Int, Puyo> data = new Dictionary<Vector2Int, Puyo>(); private bool falled = true; // 動きを確認出来るようコルーチンにして描画処理を走らせる(コードを減らす為) IEnumerator Start() { // puyoの位置決定 for (int y = 0; y < 18; y++) { for (int x = 0; x < 6; x++) { // int color = Random.Range(0, 6); int color = twentythree[17 - y, x]; if (color == 0) continue; var obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); data.Add(new Vector2Int(x, y), new Puyo(color, obj)); obj.transform.position = new Vector2(x, y); if (color == 1) obj.GetComponent<Renderer>().material.color = Color.red; if (color == 2) obj.GetComponent<Renderer>().material.color = Color.blue; if (color == 3) obj.GetComponent<Renderer>().material.color = Color.yellow; if (color == 4) obj.GetComponent<Renderer>().material.color = Color.green; if (color == 5) obj.GetComponent<Renderer>().material.color = Color.cyan; } } // デバッグ表示用の変数 int chainCount = 0; int totalCount = 0; // 連鎖のループ while (falled) { FallStart(); yield return new WaitForFixedUpdate(); SearchStart(); int id = data.Max(_ => _.Value.chainId); yield return new WaitForSeconds(1.0f); if (id > 0) chainCount++; int count = 0; // 同時消しを別々に処理してみた、id個の同時消しが存在する for (int i = 1; i <= id; i++) { var eraseData = data.Where(_ => _.Value.chainId == i); foreach (var puyo in eraseData) { Destroy(puyo.Value.gameObject); count++; } foreach (var erasePosition in eraseData.ToList()) { data.Remove(erasePosition.Key); } yield return new WaitForSeconds(0.2f); } // 処理終了でクラスに持たせてしまった変数の初期化、これは正直無駄すぎる気がする foreach (var puyo in data) { puyo.Value.searched = false; puyo.Value.connectedValue = 0; } if (id == 0) continue; Debug.Log($"{chainCount}連鎖目、{id}箇所で同時消し、{count}個のpuyoが消えました"); totalCount += count; } Debug.Log($"結果、{chainCount} 連鎖、{totalCount}のpuyoが消えました"); } // 上下左右を調べる、currentPositionと同じ色なら位置を再設定して再起、connectedValue++して繋がっている個数を設定 // 再設定された位置はここで検索済みとなる void SearchPosition(Vector2Int currentPosition, Vector2Int searchPosition, List<Vector2Int> positions) { foreach (var position in new Vector2Int[] { Vector2Int.up, Vector2Int.down, Vector2Int.left, Vector2Int.right }) { if (!data.ContainsKey(searchPosition + position)) continue; if (data[currentPosition].color == data[searchPosition + position].color && !data[searchPosition + position].searched) { data[currentPosition].connectedValue++; data[searchPosition + position].searched = true; positions.Add(searchPosition + position); SearchPosition(currentPosition, searchPosition + position, positions); } } } // 繋がりを検索する void SearchStart() { int id = 0; for (int y = 0; y < 18; y++) { for (int x = 0; x < 6; x++) { var key = new Vector2Int(x, y); List<Vector2Int> connectedPositions = new List<Vector2Int>(); if (!data.ContainsKey(key)) continue; if (data[key].searched) continue; SearchPosition(key, key, connectedPositions); data[key].searched = true; if (connectedPositions.Count > 3) id++; foreach (var position in connectedPositions) { data[position].connectedValue = data[key].connectedValue; if (data[key].connectedValue > 3) { data[position].chainId = id; falled = true; } } } } } // 全ての位置情報を回す void FallStart() { falled = false; for (int y = 0; y < 18; y++) { for (int x = 0; x < 6; x++) { if (data.ContainsKey(new Vector2Int(x, y))) { Fall(new Vector2Int(x, y)); } } } } // 下方向、最下段、もしくは下にpuyoが無くなるまで回す void Fall(Vector2Int position) { var falledPosition = new Vector2Int(position.x, position.y - 1); if (position.y < 1) return; if (!data.ContainsKey(falledPosition)) { data.Add(falledPosition, data[position]); data[falledPosition].gameObject.transform.position = new Vector3(falledPosition.x, falledPosition.y, 0); data.Remove(position); falled = true; Fall(falledPosition); } } }

投稿2021/02/17 12:28

編集2021/02/19 09:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問