none
Yaptığım Basit Projede Array Ayırma İşlemi RRS feed

  • Genel Tartışma

  • Herkese Merhabalar,

    C# ile yaptığım bir uygulama mevcut. Gerçi ne ile yapıldığı önemli değil, aslında sorduğum soru bir mantık sorusu. 2 gündür uğraşıyorum, iç içe for mu kullanmadım, 20 satır if mi kullanmadım, herşeyi denedim ama birtürlü ayıramadım bunlar yeni dizi'ye.

    Aşağıda resim var, bloklar (x,y) -> (0,0) 'dan başlayıp -> (9,9) 'a kadar gidiyor. Yeşil olanlar yan yana oluşan bloklar'ın tamamı. Siyah kısımlar ise kaç tane ayrı ayrı oluşturulmuş yeşil bloklar varsa onları yeni dizi'ye atamak için ayıraca kısım. Siyah kısmı paint ile çizdim. Şuan anlıyoruz, yeşil kısımlar zaten ayrı ama bunlar aynı dizide bulunuyor. Bende bunları başka diziye taşımak istiyorum. Mesela dizi1 sol alttaki dizi kümesini, dizi2 yanındaki tetris bloğunu, dizi3 .....

    (Not: Test işlemi olduğu için kafa karışmaması açısından sadece yeşil bloklar ile işlem yapmaktayım.)

    Bunları nasıl çizdirdim konusu ise aşağıda, bu kod sayesinde tıklayınca aşağıdaki yeşil bloklar oluşuyor.

    vSameTiles -Dikey, aynı yeşil blokları işaretliyor.

    hSameTiles -Yatay, aynı yeşil blokları işaretliyor.

    	for (int x = 0; x < WorldController.Instance.World.Width; x++)
            {
                for (int y = 0; y < WorldController.Instance.World.Height; y++)
                {
    			
    		//Blok'u dünya üzerinden koordinatını alıyoruz.
                    Block t1 = WorldController.Instance.World.GetBlockAt(x, y);
                    Block t2 = WorldController.Instance.World.GetBlockAt(x, y + 1);
                    Block t3 = WorldController.Instance.World.GetBlockAt(x + 1, y);
    
                    if (t1 != null && t2 != null && t1.Type == Block.BlockType.Green && t2.Type == Block.BlockType.Green)
                    {
                        if (t1.Type == t2.Type)
                        {
                            if(vSameBlocks[x,y] == null)
                            {
                                verticalSameBlocks[x, y] = new Block(WorldController.Instance.World, x, y);
                                
                            }
    						
    			//Yatay olan aynı satırdaki yeşil blokları işaretliyoruz.
                            SameSpawnCursor(Color.green, t1.X, t1.Y);
                            SameSpawnCursor(Color.green, t2.X, t2.Y);
    
                        }
                    }
    
                    if (t1 != null && t3 != null && t1.Type == Block.BlockType.Green && t3.Type == Block.BlockType.Green)
                    {
                        if (t1.Type == t3.Type)
                        {
                            if (hSameBlocks[x, y] == null)
                            {
                                horitontalSameBlocks[x, y] = new Block(WorldController.Instance.World, x, y);
                               
                            }
    
                            //Dikey olan aynı satırdaki yeşil blokları işaretliyoruz.
                            SameSpawnCursor(Color.green, t1.X, t1.Y);
                            SameSpawnCursor(Color.green, t3.X, t3.Y);
                        }
                    }
                }
            }

    20 Aralık 2015 Pazar 11:35

Tüm Yanıtlar

  • Merhabalar,

    Kafa karıştıran array'ları kaldırıp sadece "sameTiles" adlı değişken ekledim. Bu iki boyutlu array aynı ve yanyana olan ve en az iki yeşil bloğun birleşimi olursa üstünü yeşile boyuyor şekildeki gibi.

    Amacım bir parser oluşturmak.

    Block[,,] differentTiles = new Block[100, WorldController.Instance.World.Width, WorldController.Instance.World.Height];

    Burada üç boyutlu array oluşturdum. 100 tane farklı şekil birleşimini alabiliyor. Amacım öyle bir iç içe for döngüsü kullanıp, if yapıları kullanmalıyım ki:

    Block[Şekil Numarası, X, Y] olmak üzere;

    -----

    Block[0,0,0] => Sol en alttaki yeşil blok

    Block[0,0,1] => Sol en alttaki yeşil bloğun üstü

    -----

    Block[1,2,0] => Sol en alttaki yeşil bloğun iki sağındaki yeşil blok

    Block[1,2,1] => Sol en alttaki yeşil bloğun iki sağındaki yeşil bloğun üstü

    Block[1,2,2] => Sol en alttaki yeşil bloğun iki sağındaki yeşil bloğun üstünün üstü

    Block[1,3,1] => Sol en alttaki yeşil bloğun iki sağındaki yeşil bloğun üstünün sağındaki yeşil blok

    -----

    Şeklinde hepsine olacak, biliyorum karışık anlattım fakat insan gözü ayrılmış şekilleri seçebiliyor. Bende bunu yazılıma şeçtirmem lazım. Birkaç gündür bununla ilgili aramadığım algoritma kalmadı. Stackoverflow 'da bununla ilgili araştırma yapıyorum hala...

    Tekrardan Teşekkürler...

    21 Aralık 2015 Pazartesi 12:56