Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
Arkadaşlar bende bigisayar mühendisliği öğrencisiyim.Bize de bu oyunu yapmak ile ilgili proje verildi .Süresi çok kısa yani 3-4 günde bunu yapmamızı istiyorlar. Ama ben ne kadar da düşündüysem gemi yerleştirme algoritmasını kuramadım.Sitenizi inceledim.Sanırım sizde önceden yapmışsınınz.Siteye kodu yüklenmiş baktım ama hata ve eksiklikler var ve ben pek anlayamadım.Bu projeyi yapan ve ilgilenen arkadaşlar varsa yardım ederseniz çok memnun olurum.Şimdiden teşekkürler.
Bu arada ödevi de kısa bir şekilde açıklayayım. Bizim oyun 12*12 lik oynanacak.Maksimum gemi sayısı 10 ve maksimum gemi uzunluğu 6dır.Oyuncu bu sınırları belirleyecek ve daha sonra oyuncuya toplam gemi uzunluğunun 2 katı kadar hak verilcektir. Kullanıcı oyuna başlarken A12 şeklinde giriş yapacakır ve her türlü hata kontrolü denetlenecektir.
Her atıştan sonra önceki ve sonraki atışları ekranda görüntülenecektir.Savaş alanının görüntülenmesinde karavana atışlar için K,isabetli atışlar için I, batık gemiler için B ve henüz atış yapımamış yerler için de O karakteri kullanılacaktır.
Şimdiden teşekkürler
Hülya
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
Gemileri yerleştirirken en uzun tipli gemilerden başlaman daha doğru olur. Ele aldığın gemiyi ilk önce gemiyi yatay mı yoksa dikey mi yerleştireceğine karar verirsin (0-1 arasında seçilen rastgele bir sayı ile). Daha sonra diyelim eldeki geminin uzunluğu 5 ve yatay olarak yerleşecek; o zaman
12x12 bir matriste geminin ilk parçasını yerleştirebileceğin satır aralığı 0-11 ve sütün aralığı 0-7 olur (geminin oyun alanından taşmaması için). Sonra da satır ve sütün için bu aralıklarda rastgele bir hücre seçersin. En son olarak da seçilen hücre ve o hücreyi (5 uzunluklu gemi için) belirlenen yönde takip eden 4 hücrenin içeriğinin boş olup olmadığını kontrol edersin. Hepsi boş ise gemiyi yerleştirirsin ve sonraki gemiye geçersin. Gemiyi yerleştirememe durumunda gemi yerleşene kadar bu döngüyü devam ettirirsin. Eğer yerleştirmeye küçük gemilerden başlarsan büyük gemileri yerleştirmek uzun zaman alabilir ya da onlar için hiç yer kalmayabilir ve program sonsuz döngüye girebilir.
Tabi bu çok kaba bir algoritma, gemi yerleştirememe durumunda aynı olasılıklar tekrar edebilir ve bu da zaman kaybına neden olur. Bu algoritmada gemi yerleştirme konusunda bütün olasılıklar denenip de gemi yine de yerleşemezse dediğim gibi sonsuz döngü kaçınımaz olur. Fakat gemi sayısı makul ve yerleştirmeye uzun gemilerden başlanmış ise bu algoritma bu oyun için yeterli.
Kolay gelsin ;)
Let`s make this world a better place to live !
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
Verdiğiniz bilgiler için teşekkürler.Şöyle bir rica da bulunsam eğer daha önce yaptıysanız daha iyi anlayabilme açısından örnek olarak herhangi bir parçasını yazmanız mümkün mü?Birde şunu sormak istiyorum.
Örneğin bu yerleştirmeyi şu şekilde yaptım diyelim
0 0 0 0 3 0 3 0 6 0 0 0 Ama projede istenen 0 yerine O;
0 0 0 0 3 0 3 0 6 0 0 4 İsabetsiz atış için K; batık gemi için b ve
0 0 0 0 3 0 3 0 6 0 0 4 isabetli atışlar için I olacak bunları nasıl
2 0 0 0 0 0 0 0 6 0 0 4 bu şekle dönüştürüm.Gemi büyüklüklerine göre nasıl
2 0 0 0 2 0 0 1 6 0 0 4 düzenleyebilirim? Teşekkürler
0 0 1 0 2 0 0 0 6 0 0 0
0 0 0 0 0 1 0 0 0 0 0 3
0 0 0 0 0 0 0 0 2 0 0 3
1 0 0 2 2 0 0 0 2 0 0 3
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 2 0 0 0 2 2 0 0
0 0 0 0 0 0 1 0 0 0 0 0
Pardon birde şu aklıma geldi kullanıcı her iki seçeneği de maksimum seçerse yani gemi sayısını 10 ve hepsinin uzunluğunu 6 seçerse nasıl düşünmeliliyim?Bilgisayarın her derlemede hata verme olasılığı var gibi geldi bana...
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
0 gördüğün yerde o yazdırmak o kadar zor birşey değil. aynı şekilde karavana yaptığın atışlar için ayrı bir dizi tanımlayabilirsin
ayrıca istersen 15-20 tane 6 boyutunda gemi bile yerleştirebilirsin (bu biarzda şans işi ama 10 tane gemide sorun çıkmaz 24 gemilik yer var matriste.)
isabetsiz atışlarıda 1-6 arasını gemi türleri için kullanırsan isabetsiz atışları 7 ile isabetli atışları 8 ile ve batan gemileri 9 ile gösterebilrisin (yine aynı şekilde rakam gördüğü yerde ekrana karakter yazdırırsın) gemileri saklamak için integer kullandığın için 4 milyar gemi türü seçebilirsin :)
if(ships[i][j]<=7)
printf(" %d |",ships[i][j]);
else if (ships[i][j]==8)
printf(" O |",ships[i][j]);
else
printf(" 0 |");
burada 7'den düşük rakamlar vurulan gemi, 8 karavana atışlar ve diğer durumda atış yapılmamış kutular için sıfır yazıyor ekrana. i
insa ettigim binanin cimentosu kelâm
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
reccae yazdi | 0 gördüğün yerde o yazdırmak o kadar zor birşey değil. aynı şekilde karavana yaptığın atışlar için ayrı bir dizi tanımlayabilirsin
ayrıca istersen 15-20 tane 6 boyutunda gemi bile yerleştirebilirsin (bu biarzda şans işi ama 10 tane gemide sorun çıkmaz 24 gemilik yer var matriste.)
|
ben kağıt üzerinde uzun bir süre uğraşmama rağmen 6 birimlik 10 gemiyi matrise yerleştirmedim.
Örnek olarak bir tane verebilir misiniz?
|
|
Yazar |
|
akgulozkan
istanbul
Kayıt: 12.12.2006 |
|
berrak yazdi | reccae yazdi | 0 gördüğün yerde o yazdırmak o kadar zor birşey değil. aynı şekilde karavana yaptığın atışlar için ayrı bir dizi tanımlayabilirsin
ayrıca istersen 15-20 tane 6 boyutunda gemi bile yerleştirebilirsin (bu biarzda şans işi ama 10 tane gemide sorun çıkmaz 24 gemilik yer var matriste.)
|
ben kağıt üzerinde uzun bir süre uğraşmama rağmen 6 birimlik 10 gemiyi matrise yerleştirmedim.
Örnek olarak bir tane verebilir misiniz? |
algoritmayı söylüyoruz.. gerisi senin programlama dili bilmene kalmış..:) hazır kodu vermek de olmaz.. (benim kodu yollayabilirim ama senin için bir faydası olmaz çünkü senin anlattığından çok farklı bir tarzda yapmıştım..)
önce geminin yatay mı dikey mi olduğunu belirleyeceksin(rasgele).. sonra yatay ise rasgele boş bir satır seçeceksin sonra matrisin sütun boyutlarını sınırlandırırken geminin sığacağı kısım içerisnden bir başlangıç noktasını rasgele seçip gemi boyutu kadar o satır içerisinde kontrol ederek ilerleyeceksin.. daha sonra eğer dikey ise aynı şeyi satır ve sütunların yerlerini değiştirerek yapacaksın.. şafak arkadaşın dediği gibi yerleştirmeye öncelikle büyük gemilerden başla..
kolay gelsin..
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
10 tane 6 boyutlu gemi yerleştirirken sorun olmuyor.. ancak gemi boyutları ile biraz oynayıp yeterli sayıda gemiyi daha küçük yerlere de sığdırabilirsin.
http://img257.imageshack.us/img257/9331/12x12gh1.jpg
bence takıldığın yerleri sorman senin için daha iyi olur. projeni teslim ettiğinde gönül rahatlığıyla ben yaptım diyebilirsin
insa ettigim binanin cimentosu kelâm
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
reccae yazdi | 10 tane 6 boyutlu gemi yerleştirirken sorun olmuyor.. ancak gemi boyutları ile biraz oynayıp yeterli sayıda gemiyi daha küçük yerlere de sığdırabilirsin.
http://img257.imageshack.us/img257/9331/12x12gh1.jpg
bence takıldığın yerleri sorman senin için daha iyi olur. projeni teslim ettiğinde gönül rahatlığıyla ben yaptım diyebilirsin |
Bilgilendirdiğiniz ve verdiğiniz örnekten dolayı teşekkürler.Yalnız sizin yaptığınız matriste gemiler birbirine temas ediyor.Yani örnek verecek olursam.
3 birim uzunlugunda bir gemiyi b2-b3-b4 hucrelerine yerlestirebilmek icin, b2-b3-b4 hucrelerinin bos olmasi gerektigi gibi, a1-a2-a3-a4-a5-b1-b5-c1-c2-c3-c4-c5 hucreleri de bos olmalidir .
Kuralı var buna göre 12*12 lik matrise sanırım 10 tane 6 birim uzunluk yerleşmiyor ya da ben kendim yerleştiremiyorum.Sizce yerleşebilir mi?Eğer yerleşirseya da uğraşabilirseniz ve örnek verebilirseniz memnun olurum.Teşekkürler
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
berrak yazdi | 3 birim uzunlugunda bir gemiyi b2-b3-b4 hucrelerine yerlestirebilmek icin, b2-b3-b4 hucrelerinin bos olmasi gerektigi gibi, a1-a2-a3-a4-a5-b1-b5-c1-c2-c3-c4-c5 hucreleri de bos olmalidir |
O zaman geminin ilk parçasında gerisi, üstü ve altı; ara parçalarında üst ve altı; son parçasında ise üstü, altı ve ilerisi kontrol edilebilir.
Ya da daha sağlam olacaksa; nasılsa ilk gemide böyle bir şart olmayacak, çünkü martis boş. Bir gemi yerleştirirken etrafındaki karelere de gemi parçası denk gelmemesi için doluymuş gibi davranan farklı bir değer atanabilir. Bu sayede daha sonra yerleştirilecek gemiler için de o alanlarda gemi varmış gibi davranılabilir.
Let`s make this world a better place to live !
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
eğer gemiler birbirine değmeyecek diyorsan
14*14=208 // toplam alan (12+2 )
3*8=24 //geminin kapladağı alan
208/24~=9 // en iyimser ihtimalle yerleştirebileceğin maksimum gemi sayısı
bu durumda programını biraz esnetmen gerek. gemilerin bazılarını küçültürsen hallolur sanırım sorun.
insa ettigim binanin cimentosu kelâm
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
reccae yazdi | eğer gemiler birbirine değmeyecek diyorsan
14*14=208 // toplam alan (12+2 )
3*8=24 //geminin kapladağı alan
208/24~=9 // en iyimser ihtimalle yerleştirebileceğin maksimum gemi sayısı
bu durumda programını biraz esnetmen gerek. gemilerin bazılarını küçültürsen hallolur sanırım sorun. |
toplam alan derken nasıl düşündünüz?Anlayamadım.Açıklayabilir misiniz?
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
berrak yazdi | toplam alan derken nasıl düşündünüz?Anlayamadım.Açıklayabilir misiniz? |
kontrol etmen gereken alan yani
geminin hem sağında ve solunda bir kare daha kontrol etmen gerektiği için 14 olarak aldım toplam boyutu. ilk ve son satıra gemi gelmesi için şart
ama 9 gemi bile yerleşmiyor birbirine değmeden
insa ettigim binanin cimentosu kelâm
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
reccae yazdi |
ama 9 gemi bile yerleşmiyor birbirine değmeden |
6 6 6 6 6 6 0 6 0 6 0 6
0 0 0 0 0 0 0 6 0 6 0 6
6 6 6 6 6 6 0 6 0 6 0 6
0 0 0 0 0 0 0 6 0 6 0 6
6 6 6 6 6 6 0 6 0 6 0 6
0 0 0 0 0 0 0 6 0 6 0 6
6 6 6 6 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
6 6 6 6 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
6 6 6 6 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
Yani 9 tane oluyor ama 10 tane olmuyor.
|
|
Yazar |
|
berrak
Kayıt: 28.12.2007 |
|
Her atıştan sonra önceki ve sonraki atışları ekranda görüntülenecektir.Savaş alanının görüntülenmesinde karavana atışlar için K,isabetli atışlar için I, batık gemiler için B ve henüz atış yapımamış yerler için de O karakteri kullanılacaktır.
Arkadaşlar I ve O karakterlerini yapabildiğim halde B karakterini bir türlü yapamıyorum.Yardım edebilir misiniz?
Örneğin yaptığım örnekte 0 değilse I yazdırabilirim ama örneğin; 2 tane 4 birim uzunluğunda gemi olsun. Kullanıcı ilk 4 gemiyi isabetli girdiğinde hepsine B karakteri yazıyor.
Ama yalnızca 4 isabetli vuruş aynı gemiyeyse ve farklı noktalarınaysa o geminin I yazan yerlerini son vuruşla beraber B karakterine çevirmeliyim.
Yani görsel olarak şu şekilde olmalı:
4 4 4 4 0 0 0 0 .... gibiyse kullanıcı sırasıyla a1,a2,a3 a4 girdiğinde
0 0 0 0 0 0 0 0 ....
4 4 4 4 0 0 0 0 ....
..........................
şöyle olmalı:
B B B B 0 0 0 0 ....
0 0 0 0 0 0 0 0 ....
4 4 4 4 0 0 0 0 ....
..........................
ama benim yaptığımda bilgisayar bütün 4leri B 'ye çeviriyor.Bunu nasıl düzeltebilirim ya da nasıl bir mantık yürütmeliyim?Yardımcı olursanız sevinirim.Teşekkürler
|
|
Yazar |
|
reccae
istanbul
banlandı
Kayıt: 15.02.2006 |
|
her gmiyi ayrı ayrı kodlayabilirsin.
mesela elinde 6 tane 6 uzunluğunda gemi varsa bunları 6.1, 6.2, 6.3, .64, 6.5, 6.6 diye kodlarsın. ekrana integer değeri yazarsın. eğer 6 tane 6.y gemisinden vurulmuşsa rakam yerine karakteri yazarsın
insa ettigim binanin cimentosu kelâm
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | | | | | | | | |