IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Míny - Práca s myšou (ťuknutím na pole)

Tento článok je súčasťou nákupný programovacích jazykov C #, Java a game maker pri tvorbe klasických Min (Minesweeper) pozri: -> Miny aneb nákupný programovacích jazykov C #, Java, GM

Teraz pridáme eventy pre kliknutie myšou, aby sme mohli program tiež testovať, či všetko funguje.

C # - MouseEventHandler

VC # pridáme jednoducho MouseEventHandler a potom v príslušnej metóde přetypujeme object na našu komponent a zistíme od nej súradnice, ďalej potom metóda obstará všetko za nás.

Pri generovaní tlačidiel pridáme udalosť myši.

_buttons[x, y].MouseDown += new MouseEventHandler(Mines_MouseDown);

A potom pridáme uvedenú metódu.

// 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])
        {
            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
        {
            // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
        }
    }
    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 = "?";
    }
}

Java - MouseListener

V Jave vytvoríme vnorenú triedu, ktorá dedí MouseAdapter a tú potom pridáme tlačidle ako MouseListener s príslušnými parametrami.

// vnořená třída posluchače myši -> z důvodu možnosti přístupu k instanci mines_field
public class ButtonMouseListener extends MouseAdapter
{
    private final JToggleButton[][] button;
    private final boolean[][] mines;
    private final int x;
    private final int y;

    public ButtonMouseListener(JToggleButton[][] button, boolean[][] mines, int x, int y)
    {
        this.button = button;
        this.mines = mines;
        this.x = x;
        this.y = y;
    }

    public void mousePressed(MouseEvent e)
    {
        // pokud je stisknuto levé myšítko a na tlačítku není otazník -> otazník určuje -> hráč se domnívá, že na označeném poli se nachází mina (označí jej stiskem pravého tlačítka)
        if ((e.getButton() == MouseEvent.BUTTON1) && (button[x][y].getText() != "?"))
        {
            // pokud na daných souřadnicých je mina
            if (mines[x][y])
            {
                // nastaví se tlačítko červeně
                mines_field.setButton("M", Color.red, x, y);

                // zobrazí se dialog o prohře s dotazem na opakování
                if ((JOptionPane.showConfirmDialog(null, "Prohrál jsi na živu si vydržel po dobu: " + GUI.time + "s!\nPak tě mina roztrhala na kusy.\n\nChceš to zkusit znovu?", "Prohra", JOptionPane.YES_NO_OPTION)) == JOptionPane.YES_OPTION)
                    mines_field.reloadMinesField(GUI.this);
                else
                    System.exit(0);
            }
            else
            {
                // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
            }
        }
        else if (e.getButton() == MouseEvent.BUTTON3)
        {
            // pravé tlačítko myši označí dané pole jako hráčem považované za minu
            if (button[x][y].isEnabled())
            {
                if (button[x][y].getText() == "?")
                    button[x][y].setText(" ");
                else
                    button[x][y].setText("?");
            }
        }
    }
}

Túto triedu vložíme do triedy GUI ako vnorenú triedu, aby sme mohli pristupovať k jej premenným. V cykle pri vytváraní tlačidiel priradíme jednotlivým tlačidlám inštanciu tejto triedy.

Ako parameter metódy dáme triedu GUI, aby sme mohli pristupovať k vnorené triede pre prácu s Myší (public JPanel generateMinesField (GUI gui) {...})

buttons[x][y].addMouseListener(gui.new ButtonMouseListener(buttons, mines_array, x, y));

Game maker - Event MousePressed

V game maker nie je samozrejme nič jednoduchšie ako si kliknúť Add Event - Mouse.

Do udalosti ľavého tlačidla dáme tieto akcie:

if (sprite_index == spr_button)
{
    if (mine == true)
    {
        // mina konec ende šlus

        if (show_message_ext("Mina tě roztrhala na kusy! Na živu jsi vydržel po dobu " + string(obj_controler.time) + "s" + chr(13) + "Přeješ si to zkusit znovu?", "Ano", "Ne", "") == 1)
            game_restart();
        else
            game_end();
    }
    else
    {
        sprite_index = spr_clicked;

        // zde za chvilku dopíšeme akce pro kotnrolu min v okolí, kontrola vítězství a zobrazení prázdných polí v okolí
    }
}

A do pravého len:

// označení možné miny vlaječkou
if (sprite_index == spr_button)
    sprite_index = spr_flag;
else if (sprite_index == spr_flag)
    sprite_index = spr_button;

Pokračovanie> Funkcia - kontrola počtu min, zobrazenie poľa, víťazstvo ...


 

Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity