Koukal jsme co async znamená a bohužel jsem to nepochopil.
přesně jak píšeš, chci aby se mi ten stav zaktualizoval po každým kroku, ne až na konci.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace KravaNaUteku
{
// parcialni trida predstavujici hlavni formular aplikace
public partial class Form1 : Form
{
// z repozitare prostredku nacteme do promennych jednotlive pouzite bitmapy
Image stena = global::KravaNaUteku.Properties.Resources.dlazdice;
Image krava = global::KravaNaUteku.Properties.Resources.krava;
Image vychod = global::KravaNaUteku.Properties.Resources.vychod;
Image zluta = global::KravaNaUteku.Properties.Resources.zluta;
Image cervena = global::KravaNaUteku.Properties.Resources.cervena;
// konstruktor formulare
public Form1()
{
InitializeComponent();
// rekneme tride Bludiste, ze pri volani delegata refresh se bude pouzivat metoda PrekresliBludiste
Bludiste.refresh += new PanelRefresh(PrekresliBludiste);
}
// event handler udalosti onPaint formulare;
// slouzi k vykresleni bludiste na Graphics double bufferovaneho panelu
public void panelDoubleBuffer1_Paint(object sender, PaintEventArgs e)
{
// z PaintEventArgs si vezmeme Graphics panelu
Graphics g = e.Graphics;
// projdeme celou strukturu bludiste
for (int y = 0; y < 25; y++) // radky
{
for (int x = 0; x < 35; x++) // sloupce
{
// pokud je na dane pozici stena, tak ji vykreslime
if (Bludiste.JeStena(x,y)) g.DrawImage(stena, x * 25, y * 25);
if (Bludiste.Zluta(x, y)) g.DrawImage(zluta, x * 25, y * 25);
if (Bludiste.Cervena(x, y)) g.DrawImage(cervena, x * 25, y * 25);
}
}
// nakonec nakreslime kravu na jeji aktualni pozici
g.DrawImage(krava, Bludiste.pozice.x * 25, Bludiste.pozice.y * 25);
// a vychod z bludiste
g.DrawImage(vychod, Bludiste.vychod.x * 25, Bludiste.vychod.y * 25);
}
// tato metoda je volana delegatem Bludiste.refresh
// nedela nic jineho, nez ze metodou Invalidate naseho upraveneho panelu iniciuje jeho prekresleni
public void PrekresliBludiste()
{
panelDoubleBuffer1.Invalidate();
}
// event handler pro udalost onKeyDown formulare
// zpracovava stisk klavesy
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// nacte si informace o stisknute klavese z KeyEventArgs
Keys tlacitko = e.KeyData;
// zavola metodu, ktera dane tlacitko zpracuje a provede pohyb kravou;
// metoda vraci bool hodnotu podle toho, zda se dorazilo do cile nebo ne
bool vysledek = ZpracujPohyb(tlacitko);
// pokud krava dorazila do cile, tak:
if (vysledek)
{
Zabuc(); // zabucime
MessageBox.Show("Hurá! Kráva je venku."); // vypiseme hlasku
Bludiste.NoveBludiste(); // vygenerujeme nove bludiste
pomoc = false;
}
}
// prehraje zvuk buceni ulozeny v repozitari zdroju
private void Zabuc()
{
System.Media.SoundPlayer sound = new System.Media.SoundPlayer();
sound.Stream = global::KravaNaUteku.Properties.Resources.buu;
sound.Play();
}
// metoda zpracovavajici pohyb kravy na zaklade stisknute klavesy
public static bool pomoc = false; //zjistuje, jestli chci pomoc
public static bool ZpracujPohyb(Keys tlacitko)
{
// promenna vyuzita pro ulozeni vysledku pohybu (zda jsme v cili ci ne)
bool vysledek = false;
// na zaklade stisknuteho tlacitka proved danou operaci
if(pomoc)
{
// SendKeys.Send("H");
// vysledek = Bludiste.Vyres();
// Thread.Sleep(20);
}
else
{
switch (tlacitko)
{
case Keys.Up:
vysledek = Bludiste.JdiNahoru();
break;
case Keys.Down:
vysledek = Bludiste.JdiDolu();
break;
case Keys.Left:
vysledek = Bludiste.JdiVlevo();
break;
case Keys.Right:
vysledek = Bludiste.JdiVpravo();
break;
case Keys.H:
vysledek = false;
pomoc = true;
break;
}
// na zaver vratime vysledek pohybu
}
return vysledek;
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Je to do školy, tak je mi blbý se takhle ptát, ale bohužel s tím nedokážu hnout sám a neznám nikoho kdo by to uměl. Kromě učitele samozřejmě.
Jak to chápu já: na začátku se mi vykreslí bludiště a kód jede až k "private void Form1_KeyDown(object sender, KeyEventArgs e)" což čeká na stisk klávesy, když zmáčknu šipku proběhne mi "ZpracujPohyb", takže podle šipky (třeba vlevo) se mi zavolá "JdiDoleva" v metodě JdiDoleva se mi změní souřadnice a do "vysledek" vrátim false, protože ještě nejsem v cíli, pak mi program skočí znovu na začátek, překreslí se celý bludiště, s novou polohou, a zase vleze do "Form1_KeyDown" a čeká na tlačítko, Teď když zmáčknu H, tak se mi nastaví proměnná pomoc na true, program pujde zas na začátek, bludiště se překreslí. A v tom potřebuju aby mi to skočilo do Vyres() a v podstatě to proběhlo stejně jako je to v tom From1_KeyDown, tedy změnit polohu >vykreslit >změnit polohu>vykreslit... až do cíle a aby to nebylo hned, tak tam bude zpoždění 30ms po každým kroku.
Můj původní nápad byl takový, že v momnetě kdy už chci volat Vyres(), tak nebudu čekat na klávesu, ale budu simulovat její stistk. Asi by bylo lepší v případě pomoc=true se do KeyDown vůbec nedostat, ale to taky nevím jak obejít. Nějak nechápu když jde program od shora dolu, tak do který metody vleze hned jak jí potká, a do kterejch leze jenom když jsou volány.
Je aspoň postup, kterým si myslím, že program jde shodný s tim postupem programu? Děkuju.