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