Miny - Vygenerování pole

Miny - Vygenerování pole

Tento článek je součástí porovnání programovacích jazyků C#, Java a GameMaker při tvorbě klasických Min (MineSweeper) viz: -> Miny aneb porovnání programovacích jazyků C#, Java, GM

Nejprve je vhodné docílit toho, že zadáme šířku a výšku a vykreslí se nám pole min.

C# a práce s tableLayoutem (Javovský ekvivalent GridLayoutu)

Použitím této komponenty sice docílíte toho, že se vám vygenerovaná tlačítka nádherně uspořádají, ale pokud budete chtít poté resizovat větší tabulku, již teď říkám, že je to strašně pomalé. C# vše přepočítává znovu a hrozně se to zasekává.

// pole tlačítek
MineButton[,] _buttons = new MineButton[_xLength, _yLength];

// vytvoříme tablelayoutpanel a nastavíme mu základní vlastnosti
TableLayoutPanel field = new TableLayoutPanel();

// rámeček
field.CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset;

// možnost automatické změny velikosti
field.AutoSize = true;

// table layout se roztáhne po celém formu
field.Dock = DockStyle.Fill;

// pevný počet řádků (nebudou se automaticky přidávat)
field.GrowStyle = TableLayoutPanelGrowStyle.FixedSize;

// počet řádků/sloupců
field.ColumnCount = _xLength;
field.RowCount = _yLength;

for (int y = 0; y < _yLength; y++)
{
        // mění velikost řádku dle velikosti celé tabulky
        RowStyle rowstyle = new RowStyle(SizeType.Percent, (float)(100 / _xLength));
        field.RowStyles.Add(rowstyle);

        for (int x = 0; x < _xLength; x++)
        {
                // mení velikost sloupce v závislosti na celé tabulce
                ColumnStyle colstyle = new ColumnStyle(SizeType.Percent, (float)(100 / _xLength));
                field.ColumnStyles.Add(colstyle);

                // vytvoří se nové tlačítko a přidá se do pole
                _buttons[x, y] = new MineButton(x, y);
                _buttons[x, y].Text = " ";

                field.Controls.Add(_buttons[x, y], x, y);
        }
}

Vytvořil jsem si novou komponentu MineButton, která navíc obsahuje informace o své souřadnici a má změněný vzhled. Komponentu vytvoříme -> add Component, poděděním komponenty Button a přepsáním základních vlastností.

// vlastní komponenta dědící z tlačítka obsahující navíc informaci o souřadnicích a přepsaný vzhled
public partial class MineButton : Button
{
    public int _x;
    public int _y;

    public MineButton(int x, int y)
    {
        _x = x;
        _y = y;

        base.FlatAppearance.BorderSize = 0;
        base.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        base.BackColor = Color.CadetBlue;

        base.FlatAppearance.MouseOverBackColor = Color.LightSkyBlue;
        base.FlatAppearance.MouseDownBackColor = Color.LightGray;

        base.Margin = Padding.Empty;
        base.Dock = DockStyle.Fill;
    }
}

Nastavení okna

this.Width = mines._xLength * 50;
this.Height = mines._yLength * 50;

Java a její GridLayout

Java má pro tyto účely vynikající GridLayout, který automaticky přizpůsobí prvky v něm umístěné a změna velikosti okna mu nedělá sebemenší problém. Není třeba tolik nastavovat a kód je o hodně kratší než v C#.

// vytvoření panelu s grid layoutem o patřičné velikosti
JPanel mines_field = new JPanel(new GridLayout(x_length,y_length));

// vytvoření pole tlačítek
JToggleButton buttons = new JToggleButton[x_length][y_length];

// a naplnění pole
for (int y = 0; y < y_length; y++)
{
        for (int x = 0; x < x_length; x++)
        {
                buttons[x][y] = new JToggleButton(" ");

                mines_field.add(buttons[x][y]);
        }
}

Nastavení okna

this.setTitle("Hledač min");
this.setSize(mines_field.x_length * 50, mines_field.y_length * 50);
this.setLocationRelativeTo(null);// vystředí okno
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

GameMaker a přidání instancí objektu dle souřadnic

V GM pouze vytvoříme instance objektu tlačítka přičítáním souřadnic. Nastavíme okno, aby nedělala problém změna velikosti okna.

// vytvoření pole
for (_x = 0; _x < x_length; _x += 1)
{
    for (_y = 0; _y < y_length; _y += 1)
    {
        instance_create(_x * spr_width + sprite_get_xoffset(spr_button), _y * spr_height + sprite_get_yoffset(spr_button), obj_button);
    }
}

Sprite tlačítka má rozměry 16x16 a má vycentrovaný origin.

Nastavení okna

spr_width = sprite_get_width(spr_button);
spr_height = sprite_get_height(spr_button);

view_wview[0] = x_length * spr_width;
view_hview[0] = y_length * spr_height;

window_set_size(x_length * spr_width, y_length * spr_height);
window_set_sizeable(true);
window_center();

Pokračování > Generujeme pole min


 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!