Aşağıdaki makale bir serinin parçası. Bu dizideki diğer makaleler için bkz. Ruby'de Oyun 2048'i Klonlama. Tam ve son kod için özete bakın.
Şimdi algoritmanın nasıl çalışacağını bildiğimize göre, bu algoritmanın üzerinde çalışacağı verileri düşünmenin zamanı geldi. Burada iki ana seçenek vardır: dizi bir tür, ya da iki boyutlu bir dizi. Her birinin avantajları vardır, ancak karar vermeden önce bir şeyi hesaba katmamız gerekir.
KURU Bulmacalar
Böyle desenler aramak zorunda olduğunuz ızgara tabanlı bulmacalarla çalışırken yaygın bir teknik, bir tane yazmaktır. soldan sağa doğru bulmaca üzerinde çalışan algoritma sürümü ve sonra dört etrafında tüm bulmaca döndürmek zamanlar. Bu şekilde, algoritma sadece bir kez yazılmalı ve sadece soldan sağa çalışmalıdır. Bu karmaşıklığı ve boyutu önemli ölçüde azaltır bu projenin en zor kısmı.
Bulmaca üzerinde soldan sağa çalışacağımızdan, satırların dizilerle temsil edilmesi mantıklıdır. İki boyutlu bir dizi oluştururken Yakut (veya daha doğru bir şekilde, nasıl ele alınmasını istediğiniz ve verilerin gerçekte ne anlama geldiğini) istiyorsanız, bir satır yığını (ızgaranın her satırının bir dizi ile temsil edildiği yerde) veya bir sütun yığını (her sütunun bir dizi olduğu yerde). Satırlarla çalıştığımız için satırları seçeceğiz.
Bu 2D dizi nasıl döndürülürse, böyle bir dizi oluşturduktan sonra ulaşacağız.
İki Boyutlu Diziler Oluşturma
Array.new yöntemi, istediğiniz dizinin boyutunu tanımlayan bir bağımsız değişken alabilir. Örneğin, Dizi. Yeni (5) 5 sıfır nesneden oluşan bir dizi oluşturur. İkinci argüman size varsayılan bir değer verir, Dizi.yeni (5, 0) diziyi verecek [0,0,0,0,0]. İki boyutlu bir diziyi nasıl yaratırsınız?
Yanlış ve insanları sık sık denediğimi söylemek, Dizi.yeni (4, Dizi.yeni (4, 0)). Başka bir deyişle, 4 satırlık bir dizi, her satır 4 sıfırlık bir dizidir. Ve bu ilk başta işe yarıyor gibi görünüyor. Ancak, aşağıdaki kodu çalıştırın:
Basit görünüyor. 4x4'lük bir dizi sıfır yapın, sol üstteki öğeyi 1 olarak ayarlayın. Ama yazdırın ve biz…
İlk sütunun tamamını 1 olarak ayarlar, ne olur? Dizileri yaptığımızda, Array'a yapılan en iç çağrı. İlk olarak tek bir satır yaparak çağrılır. Bu satıra tek bir başvuru daha sonra en dıştaki diziyi doldurmak için 4 kez çoğaltılır. Daha sonra her satır aynı diziye başvuruyor. Birini değiştirin, hepsini değiştirin.
Bunun yerine, üçüncü Ruby'de bir dizi yaratmanın bir yolu. Array.new yöntemine bir değer iletmek yerine bir blok geçiririz. Array.new yöntemi her yeni değere ihtiyaç duyduğunda blok yürütülür. Eğer söyleseydin Array.new (5) {gets.chomp}, Ruby duracak ve 5 kez giriş isteyecektir. Tek yapmamız gereken bu blok içinde yeni bir dizi oluşturmak. Sonuç olarak Dizi.yeni (4) {Dizi.yeni (4,0)}. Şimdi bu test senaryosunu tekrar deneyelim.
Ve tam beklediğiniz gibi.
Bu yüzden Ruby iki boyutlu dizileri desteklemese de ihtiyacımız olanı yapabiliriz. Sadece üst düzey dizinin Referanslar ve her alt dizi farklı bir değer dizisine başvurmalıdır.
Bu dizinin temsili size kalmış. Bizim durumumuzda, bu dizi satır olarak düzenlenmiştir. İlk dizin, yukarıdan aşağıya dizine eklediğimiz satırdır. Bulmacanın üst sırasını dizine eklemek için a [0], bir sonraki satırı dizine eklemek için a [1]. İkinci satırdaki belirli bir döşemeyi dizine eklemek için a [1], [n]. Ancak, sütunlara karar verseydik… aynı şey olurdu. Ruby'nin bu verilerle ne yaptığımız hakkında hiçbir fikri yok ve teknik olarak iki boyutlu dizileri desteklemediğinden, burada yaptığımız bir hack. Sadece kongre ile erişin ve her şey bir arada olacak. Altındaki verilerin ne yapması gerektiğini unutun ve her şey çok hızlı bir şekilde parçalanabilir.