C# WPF Plansza do gry w statki

0

Witam serdecznie,
Chcę wykonać planszę do gry w statki.
Mam klasę komórka:

class komórka
    {
        public int X { get; set; }
        public int Y { get; set; }
        public Rectangle Rect { get; private set; }
        public bool active;
        public komórka(int x, int y)
        {
            X = x;
            Y = y;
           
            Rect = new Rectangle();
            Rect.Width = Rect.Height = 20;
            if(active == true)
            {
                Rect.Fill = Brushes.Red;
            } else if(active == false)
            {
                Rect.Fill = Brushes.Yellow;
            }
        }
    } 

oraz siatka:

class siatka
    {
        public komórka [,] mesh { get; private set; }

        public Cell(int x, int y)
        {         
            SetShip(x, y);                    
        }
        
        public void RedrawCells()
        {
            foreach(StructuralElement tmp in mesh)
            {
                Grid.SetColumn(tmp.Rect, tmp.X);
                Grid.SetRow(tmp.Rect, tmp.Y);
                if(tmp.active == true)
                    tmp.Rect.Fill = System.Windows.Media.Brushes.Red;
                if (tmp.active == false)
                    tmp.Rect.Fill = System.Windows.Media.Brushes.Yellow;
            }
        }

        public void SetShip(int x, int y)
        {
            mesh[x, y].active = true;
        }
    } 

W konstruktorze klasy komórka brakuje utworzenia obiektu z "new"..
Jeżeli mesh był tworzony jako lista:

public List<komórka> mesh { get; private set; } 

to odwoływałem się do niego poprzez:

mesh = new List<komórka>(); 

Ktoś mi podsunie w jaki sposób mogę zainicjować swoją tablicę obiektów?

0

Ja bym zaczął od posprzątania kodu:

  • uzywaj tylko angielskich nazw

  • uzywaj konwencji (nazwa klasy, metody i propertiesa z dużej, prywatne pole z _malej)

  • ten "else if" w klasie komórki nie ma sensu, skoro active moze byc tylko true albo false - wystarczy zwykly if albo nawet operator ?:

  • ten kod sie nawet nie skompiluje, cos zle przekleiles:)

2

a czemu nie zrobisz tego na zasadzie ze w wpf zrobisz sobie grida. Wypelnisz poprzez kod pole X na Y i zbindujesz akcje do selected items.

Kod sie uprosci i bedzie robic to co bedziesz chcial

http://4programmers.net/Forum/1242843

tu pokazywalem jak to zrobic.

0

Nie widzę tego.. Definicje kolumn?

 <DataGrid.Columns>
                <DataGridTextColumn Header="1" Binding="{Binding Path=Row}"></DataGridTextColumn>

I potem mogę odnosić się do każdego obiektu X na Y ?

0

http://www.c-sharpcorner.com/resources/676/how-to-create-a-grid-in-wpf-dynamically.aspx

tutaj jeden z przykladow. Tylko nie rob tak jest tutaj.

Grid stworz w wpf i pozniej odnies sie do niego w swojej klasie (pamietaj, ze musisz podac odpowiedni datacontext). Nastepnie w petli wygeneruj kolumny i wiersze. Zbinduj na gridzie itemselected (poszukaj w google) i ze jak klikniesz w jakas komorke to jakas tam funkcja sie wykona

znalazlem jeszcze taki przyklad. Jest bardziej podobny do tego co opisalem (tylko nie musisz tworzyc buttonow...)
http://deepak-sharma.net/2013/02/01/how-to-add-rows-and-columns-to-a-wpf-grid-programmatically/

0

Tworzenie grida:

<Grid Name="grid_1" Height="400" Width="400">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition DataContext="column"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition DataContext="row"></RowDefinition>
                </Grid.RowDefinitions>
            </Grid>
        </Grid>

Cały dzień usiłuję to rozgryźć i chyba dalej stoję w miejscu.. Teraz do tego mam się odnieść w swojej klasie?

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