Mayın Tarlasında Sayıların Anlamı Nedir?
Mayın tarlası oyunu, küçük kutulardan oluşur.Bu kutuların bazılarının içinde bomba, bazılarının içinde sayı olabilir yada bazı kutuların içi boş olabilir.Kutunun içinde yazan sayılar, o kutunun etrafında bulunan toplam bomba sayısını gösterir.
Kaynak Kodlar
Design kısmına sadece menuStrip ekliyoruz.Geriye kalan tüm nesneleri kod ile oluşturacağız.
Burada ilk olarak dizileri, nesneleri, değişkenleri tanımladık.Ardından panel oluşturduk ve oluşturulan panel içerisinde 9x9 olacak şekilde butonlarımızı oluşturduk.
Burada bombaları ve sayıları yerleştirdik.
Burada butonların ortak click methodu olan Form1_Click methodunu oluşturduk.
Herhangi bir butona tıklandığında bombamı, boşmu yada sayımı olduğunu öğrenmek için kontrol yapıyoruz.Boş ise boşaç methoduna gönderiyoruz eğer sayı ise etrafında kaç adet bomba olduğunu yazıyoruz.
Son olarak bu methodu ise oyunun bitip bitmediğini kontrol ediyor.Eğer bomba bulunan butonlar hariç diğer tüm butonlar açıldıysa oyunun bittiğine dair bir mesaj verilmesini sağlıyoruz.
Kodlar bu şekilde arkadaşlar açık ve net yazmaya çalıştım.Umarım işinize yarar.
İyi Kodlamalar!
Mayın tarlası oyunu, küçük kutulardan oluşur.Bu kutuların bazılarının içinde bomba, bazılarının içinde sayı olabilir yada bazı kutuların içi boş olabilir.Kutunun içinde yazan sayılar, o kutunun etrafında bulunan toplam bomba sayısını gösterir.
Kaynak Kodlar
Design kısmına sadece menuStrip ekliyoruz.Geriye kalan tüm nesneleri kod ile oluşturacağız.
Burada ilk olarak dizileri, nesneleri, değişkenleri tanımladık.Ardından panel oluşturduk ve oluşturulan panel içerisinde 9x9 olacak şekilde butonlarımızı oluşturduk.
Kod:
// 9x9' luk Buton dizisi oluşturduk
Button[,] btn = new Button[9, 9];
// Buton indeks kontrollerini edeceğiz,yani bombamı, sayımı yada boş mu olduğunu öğrenmemizi sağlayacak.
int[,] indeks = new int[9, 9];
//Bomba etrafında butonların, bomba sayısını gösterecek.
int[,] sayilar = new int[9, 9];
Random rndm = new Random();
// Oyunda toplamda 9 bomba olacak, bunu toplamBombaSayisi değişkeni ile belirledik.
int yerlestirilenBombaSayisi = 0, toplamBombaSayisi = 9;
//Yeni Oyuna Tıklandığında Gerçekleşek olan İşlemler
Panel panel = new Panel();
private **** YeniOyunToolStripMenuItem_Click(object sender, EventArgs e)
{
// Panel oluşturduk
panel.Name = "panel1";
panel.Size = new Size(600, 660);
panel.BackColor = Color.Transparent;
//Paneli formda ortaladık.
float x = (Convert.ToInt32(this.Width) - Convert.ToInt32(panel.Width)) / 2;
float y = (Convert.ToInt32(this.Height) - Convert.ToInt32(panel.Height)) / 2;
panel.******** = new Point(Convert.ToInt32(x), Convert.ToInt32(y));
this.Controls.Add(panel);
//
//Buton oluşturduk
//
int H = 60, sayac = 1;
for (int j = 0; j < 9; j++) // satır sayısı
{
for (int i = 0; i < 9; i++) // sütun sayısı
{
btn[j, i] = new Button();
btn[j, i].Name = "button" + sayac.ToString();
btn[j, i].Size = new Size(60, 60);
btn[j, i].FlatStyle = FlatStyle.Popup;
btn[j, i].FlatAppearance.BorderSize = 0;
btn[j, i].******** = new Point(i * 60, H);
btn[j, i].BackColor = Color.MediumBlue;
btn[j, i].ForeColor = Color.White;
btn[j, i].Font = new Font("Arial", 20.0f,FontStyle.Bold);
btn[j, i].Text = "";
btn[j, i].Enabled = true;
btn[j, i].Click += Form1_Click;
panel.Controls.Add(btn[j, i]);
sayac++;
// 1: Boşluk
// 0: Bomba
//-1: Sayılar
indeks[j, i] = 1;
sayilar[j, i] = 0;
}
H += 60;
}
BombalariYerlestir();
SayilariYerlestir();
}
Burada bombaları ve sayıları yerleştirdik.
Kod:
// Bomba indekslerini random(rastgele) ata
private **** BombalariYerlestir()
{
int x, y;
for (int i = 0; i < toplamBombaSayisi;)
{
x = rndm.Next(1, 8);
y = rndm.Next(1, 8);
if (indeks[x, y] == 1)
{
indeks[x, y] = 0;
i++;
yerlestirilenBombaSayisi++;
}
}
}
private **** SayilariYerlestir()
{
for (int x = 1; x < 8; x++)
{
for (int y = 1; y < 8; y++)
{
if (indeks[x, y] == 0)
{
// y + 1 , y - 1
if (indeks[x, y + 1] != 0 && y != 8)
{
sayilar[x, y + 1]++;
indeks[x, y + 1] = -1;
}
if (indeks[x, y - 1] != 0 && y != 0)
{
sayilar[x, y - 1]++;
indeks[x, y - 1] = -1;
}
// x + 1, x - 1
if (indeks[x + 1, y] != 0 && x != 8)
{
sayilar[x + 1, y]++;
indeks[x + 1, y] = -1;
}
if (indeks[x - 1, y] != 0 && x != 0)
{
sayilar[x - 1, y]++;
indeks[x - 1, y] = -1;
}
//y + 1 ---- x+1,x-1
if (x < 8 && y < 8)
{
if (indeks[x + 1, y + 1] != 0)
{
sayilar[x + 1, y + 1]++;
indeks[x + 1, y + 1] = -1;
}
}
if (x > 0 && y < 8)
{
if (indeks[x - 1, y + 1] != 0)
{
sayilar[x - 1, y + 1]++;
indeks[x - 1, y + 1] = -1;
}
}
// y - 1 ---- x+1,x-1
if (x < 8 && y > 0)
{
if (indeks[x + 1, y - 1] != 0)
{
sayilar[x + 1, y - 1]++;
indeks[x + 1, y - 1] = -1;
}
}
if (x > 0 && y > 0)
{
if (indeks[x - 1, y - 1] != 0)
{
sayilar[x - 1, y - 1]++;
indeks[x - 1, y - 1] = -1;
}
}
}
}
}
}
Burada butonların ortak click methodu olan Form1_Click methodunu oluşturduk.
Kod:
private **** Form1_Click(object sender, EventArgs e)
{
Button btnBasilan = (sender as Button);
int sayac = 1;
for (int i = 0; i < 9; i++)
{
for (int f = 0; f < 9; f++)
{
if (btnBasilan.Name == "button" + sayac)
BombaKontrol(i, f);
sayac++;
}
}
}
Herhangi bir butona tıklandığında bombamı, boşmu yada sayımı olduğunu öğrenmek için kontrol yapıyoruz.Boş ise boşaç methoduna gönderiyoruz eğer sayı ise etrafında kaç adet bomba olduğunu yazıyoruz.
Kod:
private **** BombaKontrol(int i, int j)
{
try
{
if (indeks[i, j] == 1)
{
BosAc(i, j);
}
else if (indeks[i, j] == 0)
{
btn[i, j].BackgroundImage = Image.FromFile(@"images\bomb.png");
btn[i, j].BackgroundImageLayout = ImageLayout.Stretch;
SoundPlayer ses = new SoundPlayer
{
Sound******** = @"ses\bomb.wav"
};
ses.Play();
MessageBox.Show("Oyunu Kaybettiniz!");
panel.Controls.Clear();
}
else if (indeks[i, j] == -1)
{
btn[i, j].Enabled = false;
btn[i, j].BackColor = Color.White;
btn[j, i].ForeColor = Color.Blue;
btn[i, j].Text = sayilar[i, j].ToString();
indeks[i, j] = 4;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
OyunBittiKontrol();
}
/* Recursive bir yapı ile eğer basılan buton boş ise(Yani bomba ya da sayı değil ise) sayı görene kadar butonları her yönde aç */
private **** BosAc(int i, int j)
{
if (indeks[i, j] == 1)
{
btn[i, j].Enabled = false;
btn[i, j].BackColor = Color.White;
indeks[i, j] = 4;
//jjjjjjj
if (j < 8)
{
BosAc(i, j + 1);
}
if (j > 0)
{
BosAc(i, j - 1);
}
//iiiiiiii
if (i < 8)
{
BosAc(i + 1, j);
}
if (i > 0)
{
BosAc(i - 1, j);
}
//iiiiiii----jjjjjjjjjj
if (i > 0 && j < 8)
{
BosAc(i - 1, j + 1);
}
if (i < 8 && j < 8)
{
BosAc(i + 1, j + 1);
}
if (i < 8 && j > 0)
{
BosAc(i + 1, j - 1);
}
if (i > 0 && j > 0)
{
BosAc(i - 1, j - 1);
}
}
else if (indeks[i, j] == 0)
{
}
else if (indeks[i, j] == -1)
{
btn[i, j].Enabled = false;
btn[i, j].BackColor = Color.White;
btn[j, i].ForeColor = Color.Blue;
btn[i, j].Text = sayilar[i, j].ToString();
indeks[i, j] = 4;
}
}
Son olarak bu methodu ise oyunun bitip bitmediğini kontrol ediyor.Eğer bomba bulunan butonlar hariç diğer tüm butonlar açıldıysa oyunun bittiğine dair bir mesaj verilmesini sağlıyoruz.
Kod:
int acilanAlanSayisi = 0;
// Oyunun Başarı ile bitip bitmediğini kontrol et
private **** OyunBittiKontrol()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (btn[i, j].Enabled == false)
{
acilanAlanSayisi++;
}
}
}
if (acilanAlanSayisi == 72)
{
acilanAlanSayisi = 0;
MessageBox.Show("Oyun Bitti, Kazandınız!!!");
panel.Controls.Clear();
}
else
{
acilanAlanSayisi = 0;
}
}
Kodlar bu şekilde arkadaşlar açık ve net yazmaya çalıştım.Umarım işinize yarar.
İyi Kodlamalar!
Moderatör tarafında düzenlendi: