100 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реА # рдореЗрдВ рдЯреЗрдЯреНрд░рд┐рд╕

рдпреБрдкреАрдбреАред рдЬреАрдердм рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ - рдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдЦреЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдореЗрд░реА рдкрд╕рдВрдж рдЯреЗрдЯреНрд░рд┐рд╕ рдкрд░ рдЧрд┐рд░ рдЧрдИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рдХреА рд╣реИрдВ:

  • рдмрд╛рдПрдВ / рджрд╛рдПрдВ рдЖрдВрдХрдбрд╝реЗ рдХреА рдЧрддрд┐;
  • рдЧрд┐рд░рддреЗ рд╣реБрдП рдЖрдВрдХрдбрд╝реЗ;
  • рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рд░реЛрдЯреЗрд╢рди;
  • рднрд░реЗ рд╣реБрдП рдЖрдВрдХрдбрд╝реЗ рд╣рдЯрд╛рдПрдВ;
  • рдЦреЗрд▓ рдХрд╛ рдЕрдВрддред

рддреЛ, рдкрд╣рд▓реЗ рдПрдХ рдкрд┐рдХреНрдЪрд░рдмреЙрдХреНрд╕ рдХреЛ рдлреЙрд░реНрдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдПрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

public const int width = 15, height = 25, k = 15; //        public int[,] shape = new int[2, 4]; //      (   2  [0, i]  [1, i] public int[,] field = new int[width, height]; //     public Bitmap bitfield = new Bitmap(k * (width + 1) + 1, k * (height + 3) + 1); public Graphics gr; //     PictureBox 

рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдлрд╝реАрд▓реНрдб рднрд░реЗрдВ:

  for (int i = 0; i < width; i++) field[i, height - 1] = 1; for (int i = 0; i < height; i++) { field[0, i] = 1; field[width - 1, i] = 1; } 

рдЖрдХреГрддрд┐ рднрд░реЗрдВ:

  public void SetShape(){ Random x = new Random(DateTime.Now.Millisecond); switch (x.Next(7)){ //   1  7   case 0: shape = new int[,] { { 2, 3, 4, 5 }, { 8, 8, 8, 8 } }; break; case 1: shape = new int[,] { { 2, 3, 2, 3 }, { 8, 8, 9, 9 } }; break; case 2: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 9 } }; break; case 3: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 7 } }; break; case 4: shape = new int[,] { { 3, 3, 4, 4 }, { 7, 8, 8, 9 } }; break; case 5: shape = new int[,] { { 3, 3, 4, 4 }, { 9, 8, 8, 7 } }; break; case 6: shape = new int[,] { { 3, 4, 4, 4 }, { 8, 7, 8, 9 } }; break; } } 

рдкрд┐рдХреНрдЪрд░рдмреЙрдХреНрд╕ рдореЗрдВ "рдЧреНрд▓рд╛рд╕" рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛:

 public void FillField(){ gr.Clear(Color.Black); //  for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) if (field[i, j] == 1){ //     gr.FillRectangle(Brushes.Green, i * k, j * k, k, k); //      gr.DrawRectangle(Pens.Black, i * k, j * k, k, k); } for (int i = 0; i < 4; i++){ //    gr.FillRectangle(Brushes.Red, shape[1, i] * k, shape[0, i] * k, k, k); gr.DrawRectangle(Pens.Black, shape[1, i] * k, shape[0, i] * k, k, k); } FieldPictureBox.Image = bitfield; } 

рдореИрдВ рдкрд╣рд▓реЗ рдЖрдВрдХрдбрд╝реЗ рд▓реЗ рдЬрд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдХрд┐рд╕реА рд╕реНрдерд╛рди рдкрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ (рдЖрдВрдХрдбрд╝рд╛ рдлрд╝реАрд▓реНрдб рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдВрдХрд┐рдд рд╣реИ), рддреЛ рдЖрдВрдХрдбрд╝рд╛ рдЕрдкрдиреЗ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкрд╛рдИ рдЧрдИ рдпрд╛ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рддреЛ рд╕рд╣реА рд╣реИред

  public bool FindMistake(){ for (int i = 0; i < 4; i++) if (shape[1, i] >= width || shape[0, i] >= height || shape[1, i] <= 0 || shape[0, i] <= 0 || field[shape[1, i], shape[0, i]] == 1) return true; return false; } 

рдЕрдм рдЖрдЗрдП рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ KeyDown рдЗрд╡реЗрдВрдЯ рдмрдирд╛рдПрдВред

рдмрд╛рдПрдБ рд▓реЗ рдЬрд╛рдПрдБ:

  switch (e.KeyCode){ case Keys.A: for (int i = 0; i < 4; i++) shape[1, i]--; //        1    OX if (FindMistake()) //      for (int i = 0; i < 4; i++) shape[1, i]++; //     1  break; ... } 

рдЗрд╕реА рддрд░рд╣, рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрджреЛрд▓рди:

  case Keys.D: for (int i = 0; i < 4; i++) shape[1, i]++; if (FindMistake()) for (int i = 0; i < 4; i++) shape[1, i]--; break; 

рдлрд┐рдЧрд░ рдХрд╛ рдлрдбрд╝рдХрдирд╛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИ:

 case Keys.W: var shapeT = new int[2, 4]; Array.Copy(shape, shapeT, shape.Length); //   ,   ,       ,    ,     int maxx = 0, maxy = 0; for (int i = 0; i < 4; i++){ if (shape[0, i] > maxy) maxy = shape[0, i]; if (shape[1, i] > maxx) maxx = shape[1, i]; } //       X   Y for (int i = 0; i < 4; i++) { int temp = shape[0, i]; shape[0, i] = maxy - (maxx - shape[1, i]) - 1; shape[1, i] = maxx - (3 - (maxy - temp)) + 1; } //  .               . if (FindMistake()) Array.Copy(shapeT, shape, shape.Length); break; 

рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдПрдХ рдмреВрдВрдж рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рд╕рдм рдЯрд╛рдЗрдорд░ рдЗрд╡реЗрдВрдЯ рдкрд░ рд╣реЛрдЧрд╛:

 private void TickTimer_Tick(object sender, System.EventArgs e){ if (field[8, 3] == 1) Environment.Exit(0); //   ,     ,  . for (int i = 0; i < 4; i++) shape[0, i]++; //    if (FindMistake()){ for (int i = 0; i < 4; i++) field[shape[1, i], --shape[0, i]]++; SetShape(); } //   ,    1  ,     field     for (int i = height - 2; i > 2; i--){ var cross = (from t in Enumerable.Range(0, field.GetLength(0)).Select(j => field[j, i]).ToArray() where t == 1 select t).Count(); //      if (cross == width) for (int k = i; k > 1; k--) for (int l = 1; l < width - 1; l++) field[l, k] = field[l, k - 1]; } //    ,   ,     ,   ,     ,  1  FillField(); //   } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  SetShape(); 

рдЕрдВрддрд┐рдо рдХреЛрдб:

 using System; using System.Linq; using System.Drawing; using System.Windows.Forms; namespace LittleTetris{ public partial class Form1 : Form{ public const int width = 15, height = 25, k = 15; public int[,] shape = new int[2, 4]; public int[,] field = new int[width, height]; public Bitmap bitfield = new Bitmap(k * (width + 1) + 1, k * (height + 3) + 1); public Graphics gr; public Form1(){ InitializeComponent(); gr = Graphics.FromImage(bitfield); for (int i = 0; i < width; i++) field[i, height - 1] = 1; for (int i = 0; i < height; i++) { field[0, i] = 1; field[width - 1, i] = 1; } SetShape(); } public void FillField(){ gr.Clear(Color.Black); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) if (field[i, j] == 1){ gr.FillRectangle(Brushes.Green, i * k, j * k, k, k); gr.DrawRectangle(Pens.Black, i * k, j * k, k, k); } for (int i = 0; i < 4; i++){ gr.FillRectangle(Brushes.Red, shape[1, i] * k, shape[0, i] * k, k, k); gr.DrawRectangle(Pens.Black, shape[1, i] * k, shape[0, i] * k, k, k); } FieldPictureBox.Image = bitfield; } private void TickTimer_Tick(object sender, System.EventArgs e){ if (field[8, 3] == 1) Environment.Exit(0); for (int i = 0; i < 4; i++) shape[0, i]++; for (int i = height - 2; i > 2; i--){ var cross = (from t in Enumerable.Range(0, field.GetLength(0)).Select(j => field[j, i]).ToArray() where t == 1 select t).Count(); if (cross == width) for (int k = i; k > 1; k--) for (int l = 1; l < width - 1; l++) field[l, k] = field[l, k - 1];} if (FindMistake()){ for (int i = 0; i < 4; i++) field[shape[1, i], --shape[0, i]]++; SetShape();} FillField(); } private void Form1_KeyDown(object sender, KeyEventArgs e){ switch (e.KeyCode){ case Keys.A: for (int i = 0; i < 4; i++) shape[1, i]--; if (FindMistake()) for (int i = 0; i < 4; i++) shape[1, i]++; break; case Keys.D: for (int i = 0; i < 4; i++) shape[1, i]++; if (FindMistake()) for (int i = 0; i < 4; i++) shape[1, i]--; break; case Keys.W: var shapeT = new int[2, 4]; Array.Copy(shape, shapeT, shape.Length); int maxx = 0, maxy = 0; for (int i = 0; i < 4; i++){ if (shape[0, i] > maxy) maxy = shape[0, i]; if (shape[1, i] > maxx) maxx = shape[1, i]; } for (int i = 0; i < 4; i++) { int temp = shape[0, i]; shape[0, i] = maxy - (maxx - shape[1, i]) - 1; shape[1, i] = maxx - (3 - (maxy - temp)) + 1; } if (FindMistake()) Array.Copy(shapeT, shape, shape.Length); break; } } public void SetShape(){ Random x = new Random(DateTime.Now.Millisecond); switch (x.Next(7)){ case 0: shape = new int[,] { { 2, 3, 4, 5 }, { 8, 8, 8, 8 } }; break; case 1: shape = new int[,] { { 2, 3, 2, 3 }, { 8, 8, 9, 9 } }; break; case 2: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 9 } }; break; case 3: shape = new int[,] { { 2, 3, 4, 4 }, { 8, 8, 8, 7 } }; break; case 4: shape = new int[,] { { 3, 3, 4, 4 }, { 7, 8, 8, 9 } }; break; case 5: shape = new int[,] { { 3, 3, 4, 4 }, { 9, 8, 8, 7 } }; break; case 6: shape = new int[,] { { 3, 4, 4, 4 }, { 8, 7, 8, 9 } }; break; } } public bool FindMistake(){ for (int i = 0; i < 4; i++) if (shape[1, i] >= width || shape[0, i] >= height || shape[1, i] <= 0 || shape[0, i] <= 0 || field[shape[1, i], shape[0, i]] == 1) return true; return false; } } } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдмрдВрдж рдмреНрд░реИрдХреЗрдЯ рдФрд░ FindMistake рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 95 рд▓рд╛рдЗрдиреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВред

рдпрд╣рд╛рдБ рдПрдХ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ:

рдЫрд╡рд┐

Source: https://habr.com/ru/post/hi433908/


All Articles