2013-05-01 6 views
0

하나의 bool이 참인 2D 배열의 요소를 가져와야합니다. 이 부울이있는 것은 유일한 것입니다.특정 값을 가진 배열의 요소를 얻는 방법

public void getCurrentTile() 
{ 
    for (int x = 0; x < 75; x++) 
    { 
     for (int y = 0; y < 75; y++) 
     { 
      if (((Tile)grid[y, x]).lit) 
      { 
       current = (Tile)grid[y, x]; 
      } 
     } 
    } 
} 

이것은 현재 코드입니다. 올바르게 작동하지 않는 것 같습니다. 하나의 타일에 불이 들어올 때만 현재 값을 반환합니다. 다른 타일에 불이 들어 오면 타일을 반환하지 않습니다. 타일의

코드 :

이 그것을해야
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.GamerServices; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Media; 


namespace SimMedieval 
{ 
    public class Tile 
    { 
     public int size; 
     public String path; 
     public Texture2D texture; 
     public bool lit = false; 
     public bool lightable; 
     MouseState mouseState; 
     public System.Drawing.Color color; 
     public int posX; 
     public int posY; 

     public Tile(int s, String texturepath, bool light) 
     { 
      size = s; 
      path = texturepath; 
      lightable = light; 

     } 

     public void load(Game game, Game1 game1, System.Drawing.Color colour) 
     { 
      color = colour; 
      texture = game.Content.Load<Texture2D>(path); 
      game1.tiles.Add(this); 
     } 
     public void render(SpriteBatch sprites,int x, int y, Camera cam, Tile[,] grid) 
     { 
      mouseState = Mouse.GetState(); 
      float camPosX = (x * size) + cam.posX; 
      float camPosY = (y * size) + cam.posY; 
      if (-20 < camPosX && camPosX < 960 && -20 < camPosY && camPosY < 640) 
      { 
       if (new Microsoft.Xna.Framework.Rectangle(x, y, 1, 1).Contains((mouseState.X/size) - ((int)Math.Round(cam.posX)/size), (mouseState.Y/size) - ((int)Math.Round(cam.posY)/size))) 
       { 
        lit = true; 
        grid[y, x] = this; 
        sprites.Draw(texture, new Vector2((x * size) + cam.posX, (y * size) + cam.posY), Microsoft.Xna.Framework.Color.Coral); 
       } 
       else 
       { 
        lit = false; 
        grid[y, x] = this; 
        sprites.Draw(texture, new Vector2((x * size) + cam.posX, (y * size) + cam.posY), Microsoft.Xna.Framework.Color.White); 
       } 
      } 
     } 

     public void spawn(int x, int y, Tile[,] grid) 
     { 
      grid[y, x] = this; 
      posX = x; 
      posY = y; 
     } 


    } 


} 
+1

나는 이해하지 못한다. 한편으로는'이 부울을 가진 유일한 존재입니다 '라고 말하면서'다른 타일이 켜지면'이라고 말합니다. 그래서 하나 이상의 타일이있을 수 있습니까? –

+0

그래, 새로운 전류를 선택할 때 타일을 꺼 놓는 것을 잊어 버릴지도 모른다. 아니면 조명이없는 타일이있을 것입니다. 더 좋은 접근법에 대한 두 대답을 모두 확인해보십시오. (합산하기 위해 함수 내에서 할당하는 대신 발견 된 타일을 반환하고, 호출자가 아닌 결과를 처리해야합니다.) – SimpleVar

+0

설명해 드리겠습니다. 항상 하나의 타일이 켜져 있습니다. 또 다른 한 번. 그러나 제 코드는 # 20 타일이 켜져있을 때 타일을 반환합니다. 그러나 타일 # 13이 켜져 있고 # 20은 아무것도 반환되지 않습니다. – Hobbit9797

답변

2

, 내가 생각하는 대신 검색 기능 내부 current을 설정

public Tile getCurrentTile() 
{ 
    for (int x = 0; x < 75; x++) 
     for (int y = 0; y < 75; y++) 
      if (((Tile)grid[y, x]).lit) 
       return (Tile)grid[y, x]; 

    return null; // Return null if not found. 
} 

을, 그것이 발견 된 항목을 반환하기 위해 명확하게, 또는 null 찾을 수없는 경우

그런 다음 호출 코드가 더 같을 것이다 :

var item = getCurrentTile(); 

if (item != null) 
    current = item; 
else 
    // Code to handle no current tile being found. 
또는

(그리고 훨씬 더 간단) 그냥 Linq에 사용할 수 있습니다 : 효율적

Tile item = grid.Cast<Tile>().FirstOrDefault(cell => cell.lit); 

if (item != null) 
    current = item; 
else 
    // Code to handle no current tile being found. 

그것은 가능한 한 빨리 반복하는 중지하기 때문에 첫 번째 항목을 찾습니다. 당신이 아무 것도 전혀 발견되지 않는 경우에 예외를 throw 할 경우

,이 작업을 수행 :이 또한 즉시 항목이 발견으로 반복하는 중지됩니다

Tile item = grid.Cast<Tile>().First(cell => cell.lit); 

. 이것은 가장 효율적이기 때문에 제가 사용하고자하는 것입니다. 그리고 그들 중 하나 인 이 술어와 일치해야한다는 생각을 표현합니다. 반환 된 item이 null이 될 수 없다는 것을 알고 있다는 것을 의미합니다. 그러나 이없는 경우 요소가 조건 자와 일치하는 경우 예외가 발생합니다. 아무도 또는 둘 이상이 발견되지 않는 경우는 예외가 발생하기를 원한다면

그러나, 당신은이 작업을 수행 할 것입니다 : 그것은 유일한 방법이기 때문에 항상 모든 요소를 반복합니다

Tile item = grid.Cast<Tile>().Single(cell => cell.lit); 

둘 이상의 요소가 술어와 일치하는지 점검 할 수 있습니다.

0

Linq를 사용하여 원하는 항목을 찾을 수 있습니다. 먼저 2D 배열을 IEnumerable<T>으로 변환해야하지만 어떻게해야합니까? gridTile의 개체가 포함 된 경우 아래의 간단한 한 줄 솔루션을 사용해보세요.

Tile current= (from Tile item in array 
        where item!=null && item.lit select item).FirstOrDefault(); 
+0

현재 타일에서 캐스팅하는 방법은 무엇입니까? – Hobbit9797

+0

@ Hobbit9797에는 많은 수의 Tiles가 켜져있을 수 있습니다. – Damith

관련 문제