A więc, postanowiłem w ramach testu swoich umiejętności napisać imitacje windowsowego Sapera :P
W większości wszystko działa jak powinno, mam jedynie problem z jakby sie wydawało czymś prostym, podczas kliknięcia w jeden z buttonów odpala sie metoda losowania które pola mają być zaminowane, chce zrobić zeby klikniete pole nie było brane pod uwage i żeby mina nie była dodawana na to pole, tak sie jednak nie dzieje i czesto te pole dostaje mine. Buttony są dodawane do grida dynamicznie i są częścią klasy Gra która pobiera informacje z obiektów klasy Pole.
Myślałem żeby zrobic to tak ( kod może być troche namieszany bo starałem sie to ugryźć z wielu stron i przez to dodatkowo nabrudziłem w kodzie :P )
//Klasa Pole
public void DodajMine(int a, int b) // wymaga naprawy // a i b to polozenie przycisku na polu // dojebalem tutaj ostro ;p ale nie wiem juz za co mam sie chwycic,
{
if (doOnce == false)
{
doOnce = true; // doOnce jest static
xx = a; //xx i yy tez jest static
yy = b;
}
else if (doOnce == true)
{
if (this.zaminowane == false && ((this.x != xx)&&(this.y != yy))) // jesli niezaminowane i kordy sa inne od pierwszego klikniecia
{
this.zaminowane = true;
iloscMin++;
this.znak = "*";
mybutton.Content = this.znak;
}
}
}
metoda jednorazowo sprawdza polozenie Buttona ktory zostal klikniety jako pierwszy a następnie teoretycznie powinien go pomijac przy dodawaniu min.
Metoda ta jest wywolywana przez inna metode.
//Klasa Gra
public void RozlozMiny(int x, int y, int a, int b) // to bedzie odpalane przy pierwszym kliknieciu w pole // a i b to polozenie przycisku na polu, y i x to rozdzielczosc pola minowego
{
while (Pole.IloscMin < Pole.IloscMinMax) // jesli maksymalna ilosc min nie zostala osiagnieta, dodaje pozostale miny losowo
{
plansza[rand.Next() % x][rand.Next() % y].DodajMine(a, b); //plansza to lista listy obiektów klasy Pole
}
}
natomiast ta metoda jest wywolywana przez
//Klasa Gra
public void DodajPola(int x, int y, Button mybutton, int a, int b, int parx, int pary) // a i b to polozenie przycisku na polu, parx pary to maksymalne wartosci, x, y to doslowne polozenie na gridzie
{
mybutton.Height = 20;
mybutton.Width = 20;
mybutton.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
mybutton.VerticalAlignment = System.Windows.VerticalAlignment.Top;
mybutton.Margin = new System.Windows.Thickness(x, y, 0, 0);
// mybutton.Content = plansza[a][b].Znak;
// mybutton.Content = plansza[a][b].X + " " + plansza[a][b].Y;
// mybutton.BorderBrush = Brushes.Aqua; //to pozniej, do odkrytych guzikow
mybutton.Click += (object sender, RoutedEventArgs e) => // co bedzie lewy przycisk myszy robil, event
{
RozlozMiny(parx, pary, a, b);
};
}
Wiem, że strasznie namieszane ale to przez to ze przekombinowalem z programowaniem na ślepo bez wcześniejszego zaplanowania :P ktoś moze mi powiedzieć gdzie popełniłem błąd i czemu podczas losowania min, miny tak czy siak sa dodawane w miejsce pierwszego kliknięcia?
Kod źródłowy: https://files.one.ubuntu.com/9q05tAAHTEeAh42xf4at2g