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.Drawing2D; namespace WindowsFormsApplication1 { public partial class Form1 : Form { string[] prikazy; public Form1() { InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (prikazy == null)return; zelva z = new zelva(e.Graphics,int.Parse(textBox1.Text)); z.interaktivni = checkBox1.Checked; List fcename = new List(); List> fceobsah = new List>(); List> fceargumenty = new List>(); for (int i=0; i < prikazy.Length; i++) { string[] fce=prikazy[i].Split('('); Vykonej(fce,prikazy,ref i, z,true,fcename,fceobsah,fceargumenty,new string[]{},new int[]{}); } if(z.vykreslit)textBox1.Text = z.pocettahu.ToString(); } private void zapisfce(string[] fce, string[] prikazy, ref int i,int indexfce, List> fceobsah) { int istart = i + 1; int istop = i; fce[0] = fce[0].Replace("{", ""); switch (fce[0]) { case "left": fceobsah[indexfce].Add(string.Join("(",fce)); break; case "right": fceobsah[indexfce].Add(string.Join("(", fce)); break; case "pen": fceobsah[indexfce].Add(string.Join("(", fce)); break; case "forward": fceobsah[indexfce].Add(string.Join("(", fce)); break; case "color": fceobsah[indexfce].Add(string.Join("(", fce)); break; case "repeat": fceobsah[indexfce].Add(string.Join("(", fce)); for (int l = istart; l < prikazy.Length; l++) { if (prikazy[l] == "") { fceobsah[indexfce].Add(""); istop = l; break; }; string[] fcee = prikazy[l].Split('('); zapisfce(fcee, prikazy, ref l, indexfce, fceobsah); istop = l + 1; } break; case "if": fceobsah[indexfce].Add(string.Join("(", fce)); for (int l = istart; l < prikazy.Length; l++) { if (prikazy[l] == "") { fceobsah[indexfce].Add(""); istop = l; break; }; string[] fcee = prikazy[l].Split('('); zapisfce(fcee, prikazy, ref l, indexfce, fceobsah); istop = l + 1; } break; default: fceobsah[indexfce].Add(string.Join("(", fce)); break; } i = istop; } private void Vykonej(string[] fce, string[] prikazy, ref int i, zelva z, bool vykonej, List fcename, List> fceobsah, List> fceargumenty,string[] nazevargumentu,int[] argumenty) { int istart = i+1; int istop = i; fce[0]=fce[0].Replace("{", ""); if (fce[0].IndexOf("define") >= 0) { string nazev = fce[0].Substring(6); string[] arg = fce[1].Split(','); fcename.Add(nazev); fceargumenty.Add(new List()); fceobsah.Add(new List()); foreach (string s in arg) fceargumenty[fcename.Count - 1].Add(s); for (int l = istart; l < prikazy.Length; l++) { if (prikazy[l].Replace("{","") == "") { istop = l; break; }; string[] fcee = prikazy[l].Split('('); zapisfce(fcee, prikazy, ref l, fcename.Count-1, fceobsah); istop = l + 1; } } switch (fce[0]) { case "left": if (vykonej) z.left(vypocti(fce[1],argumenty,nazevargumentu)); break; case "right": if (vykonej) z.right(vypocti(fce[1], argumenty, nazevargumentu)); break; case "pen": if (vykonej) z.pen(vypocti(fce[1], argumenty, nazevargumentu)); break; case "forward": if (vykonej) z.forward(vypocti(fce[1], argumenty, nazevargumentu)); break; case "color": if (vykonej) z.color(vypocti(fce[1].Split(',')[0], argumenty, nazevargumentu),vypocti(fce[1].Split(',')[1], argumenty, nazevargumentu),vypocti(fce[1].Split(',')[2], argumenty, nazevargumentu)); break; case "repeat": if (int.Parse(fce[1]) == 0) { for (int l = istart; l < prikazy.Length; l++) { if (prikazy[l] == "") { istop = l; break; }; string[] fcee = prikazy[l].Split('('); Vykonej(fcee, prikazy, ref l, z,false,fcename,fceobsah,fceargumenty,nazevargumentu,argumenty); istop = l + 1; } } for (int t = 0; t < int.Parse(fce[1]); t++) { for (int l=istart; l < prikazy.Length; l++) { if (prikazy[l] == "") { istop = l; break; }; string[] fcee = prikazy[l].Split('('); Vykonej(fcee, prikazy,ref l, z,vykonej,fcename,fceobsah,fceargumenty,nazevargumentu,argumenty); istop = l+1; } } break; case "if": for (int l = istart; l < prikazy.Length; l++) { if (prikazy[l] == "") { istop = l; break; }; string[] fcee = prikazy[l].Split('('); Vykonej(fcee, prikazy, ref l, z, vykonej&&vypocti(fce[1],argumenty,nazevargumentu) > 0,fcename,fceobsah,fceargumenty,nazevargumentu,argumenty); istop = l + 1; } break; default: for (int t = 0; t < fcename.Count; t++) { if (fcename[t] == fce[0]) { for (int b = 0; b < fceobsah[t].Count;b++ ) Vykonej(fceobsah[t][b].Split('('), fceobsah[t].ToArray(), ref b, z, true, fcename, fceobsah,fceargumenty,fceargumenty[t].ToArray(),args(fce[1],nazevargumentu,argumenty)); } } break; } i = istop; } private int vypocti(string vyraz, int[] argumenty, string[] nazevargumentu) { if (vyraz.IndexOf("+") > 0) return vymenzacislo(vyraz.Split('+')[0], argumenty, nazevargumentu) + vymenzacislo(vyraz.Split('+')[1], argumenty, nazevargumentu); if (vyraz.IndexOf("-") > 0) return vymenzacislo(vyraz.Split('-')[0], argumenty, nazevargumentu) - vymenzacislo(vyraz.Split('-')[1], argumenty, nazevargumentu); if (vyraz.IndexOf("*") > 0) return vymenzacislo(vyraz.Split('*')[0], argumenty, nazevargumentu) * vymenzacislo(vyraz.Split('*')[1], argumenty, nazevargumentu); if (vyraz.IndexOf("/") > 0) return vymenzacislo(vyraz.Split('/')[0], argumenty, nazevargumentu) / vymenzacislo(vyraz.Split('/')[1], argumenty, nazevargumentu); return vymenzacislo(vyraz, argumenty, nazevargumentu); } private int vymenzacislo(string p, int[] argumenty, string[] nazevargumentu) { for (int i = 0; i < nazevargumentu.Length; i++) if (nazevargumentu[i] == p) return argumenty[i]; return int.Parse(p); } private int[] args(string pom,string[] nazevargumentu,int[] argumenty) { if (pom == "") return new int[]{}; List cisla = new List(); string[] cislo = pom.Split(','); foreach (string s in cislo) { cisla.Add(vypocti(s,argumenty,nazevargumentu)); } return cisla.ToArray(); } private int vypocti(string vyraz) { if (vyraz.IndexOf("+") >= 0) return int.Parse(vyraz.Split('+')[0]) + int.Parse(vyraz.Split('+')[1]); if (vyraz.IndexOf("-") >= 0) return int.Parse(vyraz.Split('-')[0]) - int.Parse(vyraz.Split('-')[1]); if (vyraz.IndexOf("*") >= 0) return int.Parse(vyraz.Split('*')[0]) * int.Parse(vyraz.Split('*')[1]); if (vyraz.IndexOf("/") >= 0) return int.Parse(vyraz.Split('/')[0]) / int.Parse(vyraz.Split('/')[1]); return int.Parse(vyraz); } private void button1_Click(object sender, EventArgs e) { if (checkBox1.Checked) textBox1.Text = "1"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { string data=File.ReadAllText(openFileDialog1.FileName); data = data.Replace(" ", ""); data = data.Replace("\r", ""); data = data.Replace("\n", ""); data = data.Replace("\t", ""); prikazy = data.Split(new String[]{")","}"},StringSplitOptions.None); pictureBox1.Invalidate(); } } private void textBox1_KeyDown(object sender, KeyEventArgs e) { } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; if (e.KeyChar >= '0' && e.KeyChar <= '9') e.Handled = false; if (e.KeyChar == '\b') e.Handled = false; } private void button2_Click(object sender, EventArgs e) { if (saveFileDialog1.ShowDialog() != DialogResult.OK) return; Bitmap bmp = new Bitmap(700, 700); Graphics g = Graphics.FromImage(bmp); if (prikazy == null) return; zelva z = new zelva(g, int.Parse(textBox1.Text)); for (int i = 0; i < prikazy.Length; i++) { string[] fce = prikazy[i].Split('('); switch (fce[0]) { case "left": z.left(int.Parse(fce[1])); break; case "right": z.right(int.Parse(fce[1])); break; case "pen": z.pen(int.Parse(fce[1])); break; case "forward": z.forward(int.Parse(fce[1])); break; case "color": z.color(int.Parse(fce[1].Split(',')[0]), int.Parse(fce[1].Split(',')[1]), int.Parse(fce[1].Split(',')[2])); break; } } g.Flush(); bmp.Save(saveFileDialog1.FileName); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { button3.Enabled = button4.Enabled = checkBox1.Checked; pictureBox1.Invalidate(); } private void button3_Click(object sender, EventArgs e) { if (checkBox1.Checked) { textBox1.Text = (int.Parse(textBox1.Text) - 1).ToString(); pictureBox1.Invalidate(); } } private void button4_Click(object sender, EventArgs e) { if (checkBox1.Checked) { textBox1.Text = (int.Parse(textBox1.Text) + 1).ToString(); pictureBox1.Invalidate(); } } } class zelva { public int pero; public int uhel; public PointF pozice; public Color barva=Color.Black; Graphics graphics; public int tahy; public bool vykreslit = false; public int pocettahu=0; public bool interaktivni=false; public zelva(Graphics graphics,int tahy) { if (tahy == 0) vykreslit = true ; this.tahy = tahy; this.graphics = graphics; graphics.TranslateTransform(350, 350); graphics.ScaleTransform(1, -1); pozice = new PointF(0, 0); uhel = 90; pero = 0; } public void left(int uhel) { this.uhel += uhel; } public void right(int uhel) { this.uhel -= uhel; } public void pen(int pen) { this.pero = pen; } public void forward(int kolik) { float xposun= (float)(kolik * Math.Cos(uhel * Math.PI / 180f)); float yposun= (float)(kolik * Math.Sin(uhel * Math.PI / 180f)); if (pero > 0) { if (tahy > 0||vykreslit) { tahy--; if (vykreslit) pocettahu++; Pen p=new Pen(barva, pero); if (tahy == 0 && interaktivni) { p.DashStyle = DashStyle.Dot; p.Color = Color.FromArgb(255 - p.Color.R, p.Color.G, 255 - p.Color.B); Matrix m = graphics.Transform.Clone(); graphics.TranslateTransform(pozice.X+xposun, pozice.Y+yposun); graphics.RotateTransform(uhel-90); graphics.DrawLine(Pens.Black, -5, 0, +5, 0); graphics.DrawLine(Pens.Black, -5, 0, 0, +5); graphics.DrawLine(Pens.Black, +5, 0, 0, +5); graphics.RotateTransform(-uhel+90); graphics.Transform = m; } graphics.DrawLine(p, pozice.X, pozice.Y, pozice.X + xposun, pozice.Y + yposun); } } pozice.X+=xposun; pozice.Y+=yposun; } public void color(int r, int g, int b) { r = (r < 0 ? 0 : (r > 255 ? 255 : r)); g = (g < 0 ? 0 : (g > 255 ? 255 : g)); b = (b < 0 ? 0 : (b > 255 ? 255 : b)); barva = Color.FromArgb(r, g, b); } } }