On Saturday, 19 March 2022 at 11:02:55 UTC, İsmail Emre ARIKAN wrote:
> Salih hocam,
çalışmalarımda bayağı ilerledim. şimdi de bir tane amiral battı oyununun çevirisini sizinle paylaşıyorum. Ama bir sorum olacak, devamı kodlardan sonra... :) Kirill SAIDOV 'un Learn D Game Dev isimli çalışmasının 9.3 'üncü dosyasından:
// Savaş Gemisi Oyununu Bitirmek
import std.stdio: writeln, write, readf;
import std.conv: to;
import std.random: uniform;
// oyun durumları
enum OyunDurumu {
MENÜ, OYNA, YARDIM, ÇIKIŞ
}
/*
oyunDurumu = MENÜ; -> anaMenü(); // anaMenü yü yönetmek
oyunDurumu = YARDIM; -> yardım(); // nasıl oynanacağı
oyunDurumu = OYNA; -> oyna(); // oyunun mantığı
oyunDurumu = ÇIKIŞ; -> döngüden kurtulun ve çıkın
*/
immutable int GEMİLERİN_SAYISI = 10;
void main() {
// oyunDurumu değişkeni
OyunDurumu oyunDurumu = OyunDurumu.MENÜ;
// oyunDurumu = ÇIKIŞ olmadığı sürece oyunu çalıştır
while(oyunDurumu != OyunDurumu.ÇIKIŞ) {
if(oyunDurumu == OyunDurumu.MENÜ) {
anaMenü(oyunDurumu);
} else if(oyunDurumu == OyunDurumu.YARDIM) {
yardım(oyunDurumu);
} if(oyunDurumu == OyunDurumu.OYNA) {
oyununMantığı(oyunDurumu);
}
}
writeln("Oynadığınız için teşekkür ederiz!");
}
// 30 defa boş satır yazdır (görüntüleme için)
void temizle() {
for(int i = 0; i < 30; i++) {
writeln();
}
}
// MENÜ durumu: ana menüyü tutmak için kod
void anaMenü(ref OyunDurumu oyunDurumu) {
temizle();
writeln("selam ve hoş geldiniz!");
writeln();
writeln("(1) Oyna");
writeln("(2) Yardım");
writeln("(3) Çıkış");
writeln();
write("Seçim >> :_");
char c;
readf(" %s", c);
if(c == '1' || c == 'O' || c == 'o') {
oyunDurumu = OyunDurumu.OYNA;
} else if(c == '2' || c == 'Y' || c == 'y') {
oyunDurumu = OyunDurumu.YARDIM;
} else if(c == '3' || c == 'Ç' || c == 'ç') {
oyunDurumu = OyunDurumu.ÇIKIŞ;
} else {
writeln("\n\nHata! Lütfen tekrar deneyiniz!\n");
}
}
// YARDIM durumu: yardımcı bilgiyi göstermek
void yardım(ref OyunDurumu oyunDurumu) {
temizle();
writeln("1. Her oyuncu gemilerini on satır on sütundan oluşan bir ızgaraya gizlice yerleştirmelidir.");
writeln("\n2. Her oyuncu aynı büyüklükte ikinci bir kareye de sahip olacaktır. İlk ızgara kendi gemileriyken, ikincisi (oyunun başında boş olan) \nrakiplerinin savaş alanının bir aynasıdır.");
writeln("\n3. Oyuncular rastgele bir kare seçer ve onu satır ve \nsütun numarasına göre çağırır. Bu, doğrudan o kareye bir füze ateşlediklerini gösterir.");
writeln("\n4. Tüm rakiplerinin \ngemilerini işgal ettikleri her kareye vurarak başarılı bir şekilde bulan oyuncu, tüm gemiler yok edildiğindiği için kazanır.");
write("\nSeçim(2) >> :_");
char c;
readf(" %s", c);
oyunDurumu = OyunDurumu.MENÜ;
}
// OYUN durumu: oyunun mantığı
void oyununMantığı(ref OyunDurumu oyunDurumu) {
temizle();
// haritalarımızı oluşturmak
char[5][5] oyuncununHaritası = ' ';
char[5][5] düşmanınHaritası = ' ';
char[5][5] bölge = ' ';
// gemileri başlatmak
gemiKonumunuBaşlat(oyuncununHaritası); // oyuncunun gemilerini (manuel olarak, oyuncunun kendisi tarafından) başlat
düşmanGemiKonumunuBaşlat(düşmanınHaritası); // düşmanların gemilerini (rastgele) başlat
int oyuncunun_batırılan_gemileri = 0;
int düşmanın_batırılan_gemileri = 0;
bool kazanılanOyun = false;
while(oyunDurumu != OyunDurumu.ÇIKIŞ) {
// oyuncunun haritasını göstermek
writeln("Haritanız, Kaptanım: ");
göster(oyuncununHaritası);
// boş bölgeyi göstermek
writeln("\n", "Düşman bir yere saklanıyor, Kaptanım: ");
göster(bölge);
writeln("Alanı keşfe çıkalım ve saldıralım (", GEMİLERİN_SAYISI, "dan", oyuncunun_batırılan_gemileri, " tanesi", " gemi batırıldı)!");
// kullanıcının girdisini okumak
char x;
char y;
write("Saldırmak için X-koordinatı(çıkmak için ç): >>_"); readf(" %s", x);
if(x == 'ç') { // eğer girdi = 'ç' olursa oyundan çıkılır
oyunDurumu = OyunDurumu.ÇIKIŞ;
}
write("Saldırmak için Y-koordinatı(çıkmak için ç): >>_"); readf(" %s", y);
if(y == 'ç') { // eğer girdi = 'ç' olursa oyundan çıkılır
oyunDurumu = OyunDurumu.ÇIKIŞ;
}
// (x, y) koordinatlarını tamsayıya dönştürmek
int ix = to!int(x - '0');
int iy = to!int(y - '0');
temizle(); // yeni satırlar ekleyerek ekranı temizlemek
// eğer (x, y) koordinatları haritanın uzunluğundan daha büyükse veya negatifse, başlangıca git
if(ix < 0 || ix > bölge.length-1 || iy < 0 || iy > bölge.length-1) {
continue;
}
// koordinat boş değilse, başlangıca git
if(bölge[ix][iy] != ' ') {
continue;
}
// oyuncu düşmanın gemisine çarparsa, 'x' ile işaretleyin, aksi takdirde 'o' ile işaretleyin
if(düşmanınHaritası[ix][iy] == '1') {
bölge[ix][iy] = düşmanınHaritası[ix][iy] = 'x';
oyuncunun_batırılan_gemileri++;
} else {
bölge[ix][iy] = düşmanınHaritası[ix][iy] = 'o';
}
// eğer oyuncu, düşmanın tüm gemilerini batırdıysa oyuncu, oyundan çıksın
if(oyuncunun_batırılan_gemileri >= GEMİLERİN_SAYISI) {
oyunDurumu = OyunDurumu.ÇIKIŞ;
kazanılanOyun = true; // oyuncu kazandı
}
düşmanınSaldırısı(oyuncununHaritası, düşmanın_batırılan_gemileri);
// eğer düşman, oyuncunun tüm gemilerini batırdıysa oyuncu, oyundan çıksın
if(düşmanın_batırılan_gemileri >= GEMİLERİN_SAYISI) {
oyunDurumu = OyunDurumu.ÇIKIŞ;
kazanılanOyun = false; // oyuncu kaybetti
}
}
temizle();
if(kazanılanOyun) {
writeln("Kazandınız!");
} else {
writeln("Haritanız, Kaptanım: ");
göster(oyuncununHaritası);
writeln("\nKaybettiniz!");
}
}
// oyununMantığı işlevindeki yorumları okuyun, kod hemen hemen aynı
void gemiKonumunuBaşlat(ref char[5][5] dizi) {
int i = 0;
while(i < GEMİLERİN_SAYISI) {
göster(dizi);
writeln("Geminizin konumunu giriniz(", GEMİLERİN_SAYISI, " gemiden kalan ", i, " gemi):");
char x;
char y;
write("X-kordinatı: >>_"); readf(" %s", x);
write("Y-koordinatı: >>_"); readf(" %s", y);
int ix = to!int(x - '0');
int iy = to!int(y - '0');
temizle();
if(ix < 0 || ix > dizi.length-1 || iy < 0 || iy > dizi.length-1) {
writeln("\nHATA! TEKRAR DENEYİNİZ!");
continue;
}
if(dizi[ix][iy] != ' ') {
writeln("\nHATA! (", ix, ", ", iy, ") KONUMUNDA ZATEN GEMİ VAR!");
writeln("TEKRAR DENEYİNİZ!\n");
continue;
}
dizi[ix][iy] = '1';
i++;
}
}
// düşmanın gemilerini rastgele yüzdürmek
void düşmanGemiKonumunuBaşlat(ref char[5][5] dizi) {
int i = 0;
while(i < GEMİLERİN_SAYISI) {
int x = uniform(0, dizi.length.to!int);
int y = uniform(0, dizi.length.to!int);
if(dizi[x][y] != ' ') {
continue;
}
dizi[x][y] = '1';
i++;
}
}
void düşmanınSaldırısı(ref char[5][5] dizi, ref int batırılan_gemiler) {
while(true) {
int x = uniform(0, dizi.length.to!int);
int y = uniform(0, dizi.length.to!int);
// düşman bu konuma zaten saldırdıysa, döngünün başına gidin
if(dizi[x][y] == 'x' || dizi[x][y] == 'o') {
continue;
}
// gemi bulunduysa gemiyi batır
if(dizi[x][y] == '1') {
dizi[x][y] = 'x';
batırılan_gemiler++;
} else {
dizi[x][y] = 'o'; // diğer türlü onu 'o' ile işaretleyin
}
break;
}
}
// tüm diziyi tablo benzeri bir biçimde yazdırmak
void göster(char[5][5] dizi) {
write(" ");
for(int i = 0; i < dizi.length; i++) {
write(" ", i);
}
writeln();
writeln("_ _ _ _ _ _ _ _ _ _ _ _");
for(int i = 0; i < dizi.length; i++) {
write(i, " ");
for(int j = 0; j < dizi[i].length; j++) {
write(" | ", dizi[i][j]);
}
writeln();
writeln("_ _ _ _ _ _ _ _ _ _ _ _");
}
writeln();
writeln();
}