using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text; using System.Linq; using System.Windows.Forms; using System.IO; using System.Drawing; namespace Z17 { public partial class Form1 : Form { //definice proměnných private int bx = 350; private int by = 350; private int nx = 0; private int ny = 0; private Panel kp; private System.Drawing.Pen p = new Pen(Color.Black); private System.Drawing.Graphics g; private string soubor = "zadny"; private bool kresli = false; private int smer = 0; private OpenFileDialog sd = new OpenFileDialog(); public Form1() { InitializeComponent(); //inicializace kp = panel1; g = kp.CreateGraphics(); } //udalost vykresleni paint containeru private void panel1_Paint(object sender, PaintEventArgs e) { g.Clear(Color.White); renderZelvu(); } //funkce "forward" private void vpred(int delka) { delka /= 2; //deleni dvema -> stred neni 0,0 ale 350,350 t.j. polovina if (smer == 0) //rozpoznani smeru; smer nahoru { nx = bx; ny = by - delka; } else if (smer == 1) //smer vpravo { nx = bx + delka; ny = by; } else if (smer == 2) //smer dolu { nx = bx; ny = by + delka; } else if (smer == 3) //smer vlevo { nx = bx - delka; ny = by; } else { throw new Exception("Nerozpoznaný identifikátor směru"); } if (kresli == true) { //pokud je pero zapnuté, kresli g.DrawLine(p, bx -350, by-350, nx-350 , ny-350); } //nastavení aktuální pozice na konec nakreslené čáry bx = nx; by = ny; } private void parsujPrikaz(string prikaz) { string[] castiprikazu = prikaz.Split('('); string nazevprikazu = castiprikazu[0]; string argument = castiprikazu[1].Split(')')[0].Trim(); //rozporcovani prikazu int uhelf = 0; int a = 0; switch (nazevprikazu) //akce podle prikazu { case "left": Int32.TryParse(argument, out uhelf); if (uhelf == 0 || ((uhelf % 90) > 0)) //kontrola na udaje return; uhelf /= 90; if (uhelf > 4) { int pocet = (int)(uhelf / 4); uhelf -= pocet * 3; } switch (uhelf) //zmena smeru { case 1: smer = smer + 1; smer = smer - ((smer / 4) * 3); break; case 2: smer = smer + 2; smer = smer - ((smer / 4) * 3); break; case 3: smer = smer + 3; smer = smer - ((smer / 4) * 3); break; case 4: smer = smer + 4; smer = smer - ((smer / 4) * 3); break; default: //neznama akce smer = 0; break; } break; case "right": //otoceni v pravo Int32.TryParse(argument, out uhelf); if (uhelf == 0 || ((uhelf % 90) > 0)) //kontrola udaju return; uhelf /= 90; //deleno 90 -> identifikator smeru if (uhelf > 3) //uhel je vetsi, zkratit! { int pocet = (int)(uhelf / 4); uhelf -= pocet * 3; } switch (uhelf) //nastaveni smeru podle ciloveho uhlu { case 1: smer = smer + 1; smer = smer - ((smer / 4) * 3); break; case 2: smer = smer + 2; smer = smer - ((smer / 4) * 3); break; case 3: smer = smer + 3; smer = smer - ((smer / 4) * 3); break; case 4: smer = smer + 4; smer = smer - ((smer / 4) * 3); break; default: smer = 0; break; } break; case "pen": //prikaz pen Int32.TryParse(argument, out a); if (a != 0) { kresli = true; } else { kresli = false; } break; case "forward": Int32.TryParse(argument.Trim(), out a); vpred(a); break; } if (nazevprikazu == string.Empty) //prikaz je prazdny, vyhozeni chybovky MessageBox.Show("Zaznamenán příkaz pro Krunimíra bez názvu.", "Chyba aplikace", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } private void renderZelvu() { if (soubor == "zadny") { return; } else { StreamReader sr = new StreamReader(soubor); string obsah = sr.ReadToEnd(); obsah = obsah.Trim(); string[] prikazy = obsah.Split(')'); int hotovo = 0; foreach (string prikaz in prikazy) { if (hotovo > (int)numericUpDown1.Value) { break; } if (prikaz != string.Empty) { string prikazn = prikaz.Trim() + ")"; //zavorka se pridava protoze je funkci Array.Split odstranena parsujPrikaz(prikazn); //parsovani prikazu } hotovo++; } } } private void nahratsoubor_Click(object sender, EventArgs e) //eventhandler na kliknuti na tlacitko nahratsoubor { sd.FileOk += new CancelEventHandler(sd_FileOk); //nastaveni eventhandleru na vybrani souboru a klepnuti na OK v dialogu sd.ShowDialog(); //otevreni dialogu } void sd_FileOk(object sender, CancelEventArgs e) //eventhandler na vybrani souboru v dialogu { if (File.Exists(sd.FileName)) //jeste jedna kontrola jestli soubor existuje (pro jistotu) soubor = sd.FileName; //nastaveni promenne soubor na vybrany soubor v dialogu panel1.Refresh(); //obnoveni panelu a nasledne jeho zviditelneni panel1.Visible = true; } } }