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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

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

Q&A

解決済

1回答

668閲覧

Unityにてfor文がなぜか動作せず困っています

Mt.Tachikawa

総合スコア20

Unity

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

0グッド

0クリップ

投稿2020/03/06 12:42

前提・実現したいこと

Unityを勉強するためテトリスのようなものを作っているですが、for文がなぜか動作せず困っています。
安易に人様の時間を奪うのは好きではありませんが、3日ほど調べても分からないのでお力をお貸しください。

問題が発生している箇所は、テトリスでは画面上から落ちてくるブロックの集まりのことを「ミノ」といいますが、
このミノが落下またはキー入力による移動する際に、移動先のスペースが空白であるか(外壁または硬化したミノが占有していないか)を判定するための関数です。

ソースコードは長いので問題部分(と思われる)を抜粋します。必要であれば全て掲載いたします。

コードをご覧いただけるとすぐに露見しますがど素人です。
初めての質問で情報不足なところがあるかと思いますが、それを含めて指摘していただけると幸いです。

発生している問題・エラーメッセージ

for文がなぜか動作していません。動作しない原因がわからず困っています。

エラーメッセージは特に発生していません。

該当のソースコード

C#

1 void CanMove(int moveDirection) 2 { 3 // 落下中のミノが左、右、下に移動できるかを判定します。ミノ配列内の実ブロックの左、右、下に位置するpool[]が、空きスペースであるかを判定します。 4 Debug.Log("CanMove()内でのログ①。CanMove()が呼び出されました。"); 5 6 int blockRow; // mino[]内の実ブロックがある行数 7 int blockColOffset; // mino[]内の実ブロックの列オフセット 8 int blockIndex; // 実ブロックのpool[]上での位置(要素番号) 9 int srcCounter; // srcMino[]の何番目の要素を処理しているかを保持しておくカウンター 10 11 srcCounter = (int)srcMino.Length - 1; 12 Debug.Log("CanMove()内でのログ②。srcCounter:" + srcCounter); 13 14 srcMino = IdentifyMinoArray(minoType, minoDirection); // minoTypeとminoDirectionを元に表示するミノの形を特定します。ミノが新しく変わるときに初期化する必要あり 15 Debug.Log("CanMove()内でのログ③。(int)srcMino.Length:" + (int)srcMino.Length); 16 17 for (int i = srcCounter; i == 0; i--) // ⬅︎ここが問題点。for文が動作していない 18 { 19 // ⬇︎mino[]の中から実ブロック(0以外の値)が格納されている要素番号を特定します。 20 Debug.Log("CanMove()内でのログ④。srcMino[i]]:" + srcMino[srcCounter]); 21 if (srcMino[srcCounter] != 0) 22 { 23 // ⬇︎0以外が格納されている要素番号と配列長を元に、mino[]内で0以外の値が格納されている列と行オフセットを特定します。 24 blockRow = srcCounter / (int)Math.Sqrt(srcMino.Length); 25 blockColOffset = srcCounter % (int)Math.Sqrt(srcMino.Length); 26 27 Debug.Log("CanMove()内でのログ。blockRow:" + blockRow); 28 Debug.Log("CanMove()内でのログ。blockColOffset:" + blockColOffset);

試したこと

コード内のあちこちにDebug.Log()を用いて動作を確認したところ、for文が動作していないことがわかりました。

補足情報(FW/ツールのバージョンなど)

Unity2018.4.9f1
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

for (int i = srcCounter; i == 0; i--) // ⬅︎ここが問題点。for文が動作していない

このfor文は、i == 0 が成立してないとループしません。
for文の動作を調べてみよう

ループしなくて当然、の for文です

投稿2020/03/06 12:48

編集2020/03/06 12:49
y_waiwai

総合スコア88042

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

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

Mt.Tachikawa

2020/03/06 13:05

回答いただきありがとうございます。 「srcCounterから代入された値(4〜16までの整数値)が、0になるまで、ループを繰り返す…」 というつもりで記述したのですが、「ループしなくて当然」なんですね。ふむふむ。 ありがとうございます。 for文について勉強し直してみます。
y_waiwai

2020/03/06 13:07

するなら、 for (int i = srcCounter; i >= 0; i--) ですね
Mt.Tachikawa

2020/03/06 13:15

神速の回答ありがとうございます。 「i==0」ではなく「i>=0」なんですね。 「i>=0」という記述でも良いのはわかるのですが、「なぜi==0ではだめなんだろう?」というのが率直な思いです。「iが0以上になるまで」も「iが0になるまで」も結果は同じではないのか…と考えています。 waiwai様のように、困っている人をさらっと助けられるレベルになれるよう頑張ります。 ありがとうございました。
y_waiwai

2020/03/06 13:30

その条件が成立しているときに、for文のナカミが実行される、という動作となります それぞれの条件のときにどうなるかを考えてみれば
Mt.Tachikawa

2020/03/06 13:59

回答ありがとうございます。 「条件が成立している時に、ナカミが実行される…」なるほど、そういう仕組みだとたしかに「i==0」では動作しませんね。 すっきりしました!! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問