2016-07-09 13 views
0

これはすべて間違っていると思いますが、良い解決策を見つけることができないので、どのポインタも役に立ちます。私は自分のコードに次の文があります。何も起こらないif文内の3項演算子

if (!mapDict.ContainsKey(_thisRoom.Item1)) 
     { 

      MapGraphItem roomMGI = new MapGraphItem(); 


      var rndOrderRooms = roomList.OrderBy(i => rnd.Next()); 
      foreach (MapGraphItem room in rndOrderRooms) 
      { 
       if (!room._flags.IsFlagSet(GlobalValues.MapTileType.start) && !room._flags.IsFlagSet(GlobalValues.MapTileType.exit) 
        && ((_thisRoom.Item2 == 'N') ? room._north : (_thisRoom.Item2 == 'S') ? room._south : (_thisRoom.Item2 == 'E') ? room._east : room._west) 
        && ((mapOpenings.Count < 4) : !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) ? *ignore this section*)) 
       { 
        roomMGI = room; 
        earlyRooms.Add(room); 
        goto Exit; 
       } 
      } 

      Exit: 
      //MapGraphItem _room = earlyRooms[rnd.Next(0, earlyRooms.Count)]; 

      GameObject _roomGO = (GameObject)Instantiate(roomMGI.gameObject, _thisRoom.Item1, Quaternion.identity); 
      roomMGI._position = GlobalValues.MapTilePos.Early; 
      mapDict.Add(_roomGO.transform.position, roomMGI); 

      _mapUsed++; 

      if (roomMGI._north) _n = true; 
      if (roomMGI._south) _s = true; 
      if (roomMGI._east) _e = true; 
      if (roomMGI._west) _w = true; 

      Debug.Log ("Early room added at: " + _thisRoom.Item1.ToString() + " N? " + (_n ? "yes" : "no") + " S? " + (_s ? "yes" : "no") + 
       " E? " + (_e ? "yes" : "no") + " W? " + (_w ? "yes" : "no")); 

      GetRoomOpenings(_roomGO.transform.position, _n, _s, _e, _w); 

      _tiles--; 
     } 

基本的には、*ignore this section*面積は、私は何も起こりませんすることを意味します。

つまり、ifの最初の2行が正しいと仮定すると、.Countが4未満の場合、追加の条件があります。 .Countが4つ以上の場合、その条件は必要ありません。

反対側に設定することはできません。ちょうどroom._flags.IsFlagSet(GlobalValues.MapTileType.deadend)に設定することはできません。私は強制終了させたくないからです。私はちょうどそれが4つよりも少なく残っていないことを確かめたいと思うmapOpening。多くの人が指摘したよう

+0

3つの演算子を1つのステートメントで使用すると賞がありますか?なぜなら、あなたはこれをいくつか入れ子にしてしまわないようにする他の説得力のある理由は考えられないからです。 –

+0

質問 - このプログラムの出力には決定的な答えがあります - 出力はそれを書いた開発者が解雇されたことです。 – Stilgar

+0

if {if {if {if ...} ...} ...} ...}の可読性が良くないため、 1つのif文の各セクションに簡単にコメントを付けることができます。そして結果として生まれる体は1つのもののセットであり、まったく何もないからです。 –

答えて

2

あなたは両方の以下のコード

((mapOpenings.Count < 4) || !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend)) 
+0

ガー、私は単純なものが欠けていることを知っていた。ありがとう、@Dandré! –

+0

動作しませんでしたああ、...それは、 '||' 'のような&&((mapOpening.Count> 4)||!room._flags.IsFlagSet(GlbalValues.MapTileType.deadend))' –

+0

として仕事をします申し訳ありません、私の悪い。提案していただきありがとうございます。 –

0

として

((mapOpenings.Count < 4)) ? !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) : *ignore this section*) 

を書き換えることができますが読みやすく部門に改善の切実に必要である質問とリファクタリングあなたのコードを、(答えますコメントの人)。

if (room._flags.IsFlagSet(GlobalValues.MapTileType.start) { 
return; 
} 

if (room._flags.IsFlagSet(GlobalValues.MapTileType.exit) { 
return; 
} 

bool dirFlag = false; 
if (_thisRoom.Item2 == 'N') { 
dirFlag = room._north; 
}else if (_thisRoom.Item2 == 'S') { 
dirFlag = room._south; 
}else if (_thisRoom.Item2 == 'E') { 
dirFlag = room._east; 
}else { 
dirFlag = room._west; 
} 

if (!dirFlag) { 
return; 
} 

if (mapOpenings.Count < 4 && room._flags.IsFlagSet(GlobalValues.MapTileType.deadend)) { 
return; 
} 

roomMGI = room; 
earlyRooms.Add(room); 
goto Exit; 
+0

なぜこれがオプションでないのかを示すコードを追加しました。私はちょうどそれから '戻って'ことはできません。常にifステートメントの内部に到達しなければならず、rndOrderRoomsの項目の1つは常にすべての必須条件に一致します。しかし、基準は毎回変わり、rndOrderRoomsの順番は、無作為化され、複数の可能性のある一致が常に同じ優先順位で選択されるわけではありません。 –

+0

@JesseWilliamsちょうど私のコードはメソッドをブロックし、メソッドをコールし、それから戻り値を返すことができます - それはifブロックに入っていないものと同じことをします。あなたはこの方法は、あなたがGOTOにジャンプするかどうかを示すブール値を返すことができます必要に応じて(あなたはまた、使用するべきではありませんが、それは別の問題だ)場合 – nhouser9

+0

@JesseWilliamsは – nhouser9