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.IO; using System.Drawing.Imaging; using System.Threading; namespace Zelva { public partial class Form1 : Form { Zelva zelva; Graphics grafikaPole; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { zelva = new Zelva(350, 350); // Želva zaujme pozici ve středu ohrádky // Vyrobí grafiku ohrady, aby se nemusela zbytečně vyvolávat pořád dokola grafikaPole = pole.CreateGraphics(); } private void tlNahratProgram_Click(object sender, EventArgs e) { if (otevirani.ShowDialog() == DialogResult.OK) { // uživatel dialog nezamítl // nahrajeme program // čtečka souborů nahraje zvolený soubor StreamReader r = new StreamReader(otevirani.FileName); // uložení programu do želvy zelva.program = r.ReadToEnd(); zelva.shrinkProgram(); r.Close(); } } private void tlUlozitVystup_Click(object sender, EventArgs e) { // Vytvoříme novou bitmapu if (ukladaniObrazku.ShowDialog() == DialogResult.OK) { } } private void tlSpustit_Click(object sender, EventArgs e) { Int32 zbyvaTahu = Convert.ToInt32(numPocetTahu.Value); List<Prikaz> sekvence = zelva.parseProgram(); Prikaz aktualni = new Prikaz(); /* * Instruction Pointer. Ukazuje na právě prováděnou položku pole příkazů */ Int32 eip = -1; // Provedení všech tahů while ((zbyvaTahu > 0) && ((eip-1)<sekvence.Count)) { eip++; if (!(eip < sekvence.Count)) break; aktualni = sekvence[eip]; switch (aktualni.jmeno) { case "forward": Int32 noveX, noveY, dist = aktualni.parametry[0]; noveX = Convert.ToInt32(Math.Round(zelva.x + dist * GonioFce.cos(zelva.uhel))); noveY = Convert.ToInt32(Math.Round(zelva.y + dist * GonioFce.sin(zelva.uhel))); if (zelva.penDown) { // želva kreslí, snížíme počet tahů o 1 grafikaPole.DrawLine(zelva.pero, new Point(Convert.ToInt32(zelva.x), Convert.ToInt32(zelva.y)), new Point(noveX, noveY)); zbyvaTahu--; } zelva.x = noveX; zelva.y = noveY; break; case "pen": // Přehodí pero podle podmínek Int32 param = aktualni.parametry[0]; if (param < 1) { zelva.penDown = false; } else { zelva.penDown = true; Color barvaPera = zelva.pero.Color; zelva.pero = new Pen(barvaPera, param); } break; case "right": // Otočí želvu doprava zelva.uhel += Convert.ToInt16(aktualni.parametry[0]); zelva.angleCorrection(); break; case "left": // Otočí želvu doprava zelva.uhel -= Convert.ToInt16(aktualni.parametry[0]); zelva.angleCorrection(); break; case "color": // oprava chyb Byte r, g, b; r = Convert.ToByte(aktualni.parametry[0]); g = Convert.ToByte(aktualni.parametry[1]); b = Convert.ToByte(aktualni.parametry[2]); if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (g > 255) b = 255; // nastavení barvy zelva.pero = new Pen(Color.FromArgb(r, g, b), zelva.pero.Width); break; } } } private void tlNasledujici_Click(object sender, EventArgs e) { } /// <summary> /// Způsobí reinicializaci, tedy stav, v jakém se nachází program vždy po zapnutí. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { pole.Refresh(); grafikaPole = pole.CreateGraphics(); zelva = new Zelva(350,350); } private void groupBox1_Enter(object sender, EventArgs e) { } private void button1_Click_1(object sender, EventArgs e) { } } }