Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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


 

Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity