// použití tablelayoutpanelu (obdobné jako Java Grid Layout) aplikace se nehorázně zasekává -> ukázka automatického resizování buňěk // imho je lepší použít klasický panel, práce s tablelayoutpanelem je sice jednodušší a //nastaví si sám velikost jednotlivých buněk, avšak hrozně se to seká, nedoporučuju používat pro tyto účely (snažil sem se aby byl výsledek shodný ve všech jazycích) public void createField() { _form.field = new TableLayoutPanel(); _form.field.CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset; _form.field.AutoSize = true; _form.field.Dock = DockStyle.Fill; _form.field.GrowStyle = TableLayoutPanelGrowStyle.FixedSize; _form.field.ColumnCount = _xLength; _form.field.RowCount = _yLength; this.generateMines(); _buttons = new MineButton[_xLength, _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)); _form.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)); _form.field.ColumnStyles.Add(colstyle); _buttons[x, y] = new MineButton(x, y); _buttons[x, y].MouseDown += new MouseEventHandler(Mines_MouseDown); _form.field.Controls.Add(_buttons[x, y], x, y); } } _form.Controls.Add(_form.field); }
// událost stisku tlačítka myši private void Mines_MouseDown(object sender, MouseEventArgs e) { // přetypování objektu který vyvolal tento event (tlačítko) na MineButton (přístup k souřadnícím) MineButton minebutton = (MineButton)sender; // levé tlačítko - lze vyvolat pokud je tlačítko aktivní a není označeno uživatelem za minové if ((e.Button == MouseButtons.Left) && (minebutton.Text != "?")) { minebutton.Enabled = false; // kontrola miny if (_minesArray[minebutton._x, minebutton._y]) { this.showField(); _form.timer1.Enabled = false; if (MessageBox.Show("Prohrál jsi, na živu si vydržel po dobu: " + _form.time + "s!\nPak tě mina roztrhala na kusy.\n\nChceš to zkusit znovu?", "Prohra", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { Application.Restart(); } else { Application.Exit(); } } else { minebutton.BackColor = Mines.getColor(this.checkMinesAround(minebutton._x, minebutton._y)); minebutton.Text = this.checkMinesAround(minebutton._x, minebutton._y).ToString(); // pokud má v okolí nulový počet min najde v jeho okolí další s touto vlastností if (this.checkMinesAround(minebutton._x, minebutton._y) == 0) { this.showFree(minebutton._x, minebutton._y); } // zkontroluje počet aktivních tlačítek a vyhodnotí vítězství if (this.checkVictory()) { this.showField(); _form.timer1.Enabled = false; if (MessageBox.Show("Vyhrál jsi v čase: " + _form.time + "s!\nMáš schopnosti superhrdiny.\n\nHrát znovu?", "Výhra", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { Application.Restart(); } else { Application.Exit(); } } } } else if (e.Button == MouseButtons.Right)// pravé tlačítko -> označení tlačítka uživatelem za minové { if (minebutton.Text == "?") { minebutton.Text = ""; } else { minebutton.Text = "?"; } } }