Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > Amiral Battı Oyunu İçin Yardım
Yazar
berrak


avatar

Kayıt: 28.12.2007
28.12.2007-21:49 #33352
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


avatar
Antalya
Kayıt: 05.05.2006
28.12.2007-22:43 #33356
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


avatar

Kayıt: 28.12.2007
28.12.2007-23:29 #33361
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


avatar
istanbul
banlandı
Kayıt: 15.02.2006
28.12.2007-23:54 #33362
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


avatar

Kayıt: 28.12.2007
29.12.2007-02:22 #33368
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


avatar
istanbul
Kayıt: 12.12.2006
29.12.2007-12:41 #33378
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..peace

kolay gelsin..





Yazar
reccae


avatar
istanbul
banlandı
Kayıt: 15.02.2006
29.12.2007-14:48 #33394
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 peace





insa ettigim binanin cimentosu kelâm

Yazar
berrak


avatar

Kayıt: 28.12.2007
29.12.2007-15:10 #33395
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 peace

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


avatar
Antalya
Kayıt: 05.05.2006
29.12.2007-15:26 #33396
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


avatar
istanbul
banlandı
Kayıt: 15.02.2006
29.12.2007-15:30 #33397
eğer gemiler birbirine değmeyecek diyorsan

14*14=208 // toplam alan (12+2 biggrin)
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


avatar

Kayıt: 28.12.2007
29.12.2007-16:16 #33402
reccae yazdi
 
eğer gemiler birbirine değmeyecek diyorsan

14*14=208 // toplam alan (12+2 biggrin)
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.confusedAçıklayabilir misiniz?





Yazar
reccae


avatar
istanbul
banlandı
Kayıt: 15.02.2006
29.12.2007-16:31 #33404
berrak yazdi
 
toplam alan derken nasıl düşündünüz?Anlayamadım.confusedAçıklayabilir misiniz?


kontrol etmen gereken alan yani peace
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 peace





insa ettigim binanin cimentosu kelâm

Yazar
berrak


avatar

Kayıt: 28.12.2007
29.12.2007-16:44 #33406
reccae yazdi
 


ama 9 gemi bile yerleşmiyor birbirine değmeden peace


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


avatar

Kayıt: 28.12.2007
29.12.2007-23:22 #33429
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


avatar
istanbul
banlandı
Kayıt: 15.02.2006
29.12.2007-23:33 #33430
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 peace





insa ettigim binanin cimentosu kelâm

1 2
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb