C# WPF, Saper, sprawienie by pierwsze klikniete pole nie miało miny.

0

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

1

Tzn. losujesz miny po kliknięciu w przycisk planszy?
Saper level Godlike.

1

Miny są losowane i nanoszone na plansze po pierwszym kliknięciu, w taki sposob żeby pierwsy wybranu button nie zawierał miny, jest to operacja jednorazowa, wszystkie kolejne kliknięcia beda "grały w gre" i miny nie będą już losowane :P

0

Możliwe do postawienia miny możesz trzymać w List<>
Przy pierwszym kliknięciu robisz Remove z List<> miny ze współrzędnymi odpowiadającymi kliknięciu.

Później losujesz z listy dostępnych min w List<>. (tej z klikniętego pola już nie ma więc nie wylosujesz)
Czyli losujesz index dla List<> a nie współrzędne. (od 0 do .Count)
Po wylosowaniu również robisz Remove (tej wylosowanej).
I tak dalej...

Spróbuj w ten sposób.

0

Dziękuje wszystkim za pomoc, problem został rozwiazany a program ukończony :P Dla ciekawskich wrzucam kod źródłowy
http://www.sendspace.com/file/rgh8wc

2

@Vehumet, w ten sposób pisało się 6 lat temu:

private byte id ;

public byte Id
{
    get { return id; }
    set { id = value; }
}

Od tamtej pory (C# 3.0) można po prostu:

public byte Id { get; set; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1