C # рдореЗрдВ рдЧреЗрдордмреЙрдп

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

GitHub рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдБрдк рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ рдЧреЗрдо рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ рдФрд░ рдЧреЗрдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВред

class Snake : Game 

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЦреЗрд▓ рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╣рдо рд╕рднреА рдХреЛ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 public Snake() : base() { OnPreview += BasePreview; OnNewGame += Snake_OnNewGame; OnUpdateGame += Snake_OnUpdateGame; OnGameOver += DrawScore; } 

OnPreview рдФрд░ OnGameOver рдИрд╡реЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╕реНрдЯрдмреНрд╕ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рдЧреЗрдо рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

 private GameBlock head; private List<GameBlock> body; private GameBlock eat; private void Snake_OnNewGame() { head = new GameBlock() { X = 10, Y = 10, Vector = Vector.Up, Color = GameColor.Green }; body = new List<GameBlock>(); body.Add( head ); body.Add( new GameBlock() { X = 10, Y = 11, Vector = Vector.Up, Color = GameColor.Black } ); body.Add( new GameBlock() { X = 10, Y = 12, Vector = Vector.Up, Color = GameColor.Black } ); CreateEat(); DrawField(); } 

рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЧреЗрдордмреНрд▓реЙрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдерд┐рддрд┐, рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдФрд░ рд░рдВрдЧ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдордиреЗ рд╕рд╛рдВрдк рдХреЗ рд╢рд░реАрд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛, рднреЛрдЬрди рдХрд╛ рдкрд╣рд▓рд╛ рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдпрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореИрджрд╛рди рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

 private void CreateEat() { var emptyBlocks = new List<GameBlock>(); for( int i = 0; i < MainForm.FIELD_SIZE; i++ ) for( int j = 0; j < MainForm.FIELD_SIZE; j++ ) if( CheckEmptyBlock( i, j ) ) emptyBlocks.Add(new GameBlock() { X = i, Y = j, Color = GameColor.Red } ); if (emptyBlocks.Count > 0) eat = emptyBlocks[random.Next( emptyBlocks.Count )]; } 

рднреЛрдЬрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЦрд╛рд▓реА рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдПрдХ рд░реИрдВрдбрдорд╛рдЗрдЬрд╝рд░ рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЗрдо рдореЗрдВ рдШреЛрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ) рд░реИрдВрдбрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдпрджрд┐ рд╕рд╛рдВрдк рдиреЗ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╕реВрдЪреА рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИред

рджрд░рдЕрд╕рд▓, рдЦрд╛рд▓реА рд╕реЗрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп:

 private bool CheckEmptyBlock(int x, int y) => !( x < 0 || y < 0 || x == MainForm.FIELD_SIZE || y == MainForm.FIELD_SIZE ) && !body.Exists( a => a.Equals( new GameBlock() { X = x, Y = y } ) ); 

рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 private void DrawField() { Field.Clear( GameColor.White ); Field.DrawGameBlock( eat ); Field.DrawGameBlocks( body ); WriteScore(); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдореИрджрд╛рди рдХреЛ рд╕рдлреЗрдж рд░рдВрдЧ рдореЗрдВ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдВрдк рдХреЗ рд╕рд╛рде рднреЛрдЬрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдореЗрдВ рд╕реНрдХреЛрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WriteScore рдПрдХ рдФрд░ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рддреЛ, рд╣рдо рдЧреЗрдо рдЕрдкрдбреЗрдЯ рдЗрд╡реЗрдВрдЯ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ 300 рдПрдордПрд╕ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред

 private void Snake_OnUpdateGame( Controller controller ) { ControlMove( controller.GameKey ); if( CheckGameOver() ) GameOver(); else SnakeMove(); } 

рдЗрд╕рдореЗрдВ рдЪрд╛рд░ рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ: рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдмрджрд▓рдирд╛, рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдХреА рдШрдЯрдирд╛ рдХреЛ рдмреБрд▓рд╛рдирд╛ рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рдВрдк рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИред

 private void ControlMove( GameKey key ) { switch( key ) { case GameKey.Left: head.Vector = head.Vector == Vector.Right ? Vector.Right : Vector.Left; break; case GameKey.Right: head.Vector = head.Vector == Vector.Left ? Vector.Left : Vector.Right; break; case GameKey.Up: head.Vector = head.Vector == Vector.Down ? Vector.Down : Vector.Up; break; case GameKey.Down: head.Vector = head.Vector == Vector.Up ? Vector.Up : Vector.Down; break; default: break; } } 

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

 private bool CheckGameOver() { switch( head.Vector ) { case Vector.Up: return !CheckEmptyBlock( head.X, head.Y - 1 ); case Vector.Down: return !CheckEmptyBlock( head.X, head.Y + 1 ); case Vector.Left: return !CheckEmptyBlock( head.X - 1, head.Y ); case Vector.Right: return !CheckEmptyBlock( head.X + 1, head.Y ); default: throw new NotImplementedException(); } } 

рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рджрд┐рд╢рд╛ рдореЗрдВ рдмреНрд▓реЙрдХ рдореБрдХреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЪреЗрдХ рдореЗрдВ рднреЛрдЬрди рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЧрдИ рд╣реИред

рдпрд╣ рд╕рд╛рдБрдк рдХреА рдЧрддрд┐ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ:

 private void SnakeMove() { var temp = body.Last().Copy(); foreach( var block in body ) block.Move(); for( int i = body.Count - 1; i > 0; i-- ) body[i].Vector = body[i - 1].Vector; if( head.Equals( eat ) ) { score++; body.Add( temp ); CreateEat(); } DrawField(); } 

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

 List<Game> games = new List<Game>(); games.Add( new Snake() ); games.Add( new Tetris() ); games.Add( new Life() ); Application.Run( new MainForm( games ) ); 

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдкреВрд░реЗ рдЧреЗрдо рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ 102 рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧреАрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреЗрдЯреНрд░рд┐рд╕ рдФрд░ рдЧреЗрдо рд▓рд╛рдЗрдл рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдиреАрдЪреЗ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐
рдЦреЗрд▓ рдЪрдпрди рдореЗрдиреВ

рдЫрд╡рд┐
рдЦреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдЫрд╡рд┐
рдЦреЗрд▓ рдХрд╛ рдЕрдВрдд

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


All Articles