using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; namespace SnakeMonoGame; public class Game1 : Game { private GraphicsDeviceManager _graphics; private SpriteBatch _spriteBatch; private KeyboardState _previousKeyboardState; private int w = 15; private int h = 15; private int scale; private int xoff; private bool paused = false; public Snake Snake; public Game1() { _graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void Initialize() { Window.Title = "SnakeMonoGame - Press Space to Pause - Esc to Quit"; Snake = new Snake(w, h); scale = (int)Window.ClientBounds.Height / h; xoff = (int)(Window.ClientBounds.Width - (w * scale)) / 2; base.Initialize(); } protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); } protected override void Update(GameTime gameTime) { Input(); if (!paused) { Snake.Update(); } base.Update(gameTime); } protected override void Draw(GameTime gameTime) { Color DarkGray = new Color(0.2f, 0.2f, 0.2f); GraphicsDevice.Clear(Color.Black); _spriteBatch.Begin(); Primitives2D.FillRectangle(_spriteBatch, new Rectangle(xoff + 0, 0, scale * w, scale * h), DarkGray); Primitives2D.FillRectangle(_spriteBatch, new Rectangle(xoff + Calc(Snake.Food.X), Calc(Snake.Food.Y), scale, scale), Color.DarkRed); Primitives2D.DrawRectangle(_spriteBatch, new Rectangle(xoff + Calc(Snake.Food.X), Calc(Snake.Food.Y), scale, scale), DarkGray, 2f); foreach (Point p in Snake.Segments) { Primitives2D.FillRectangle(_spriteBatch, new Rectangle(xoff + Calc(p.X), Calc(p.Y), scale, scale), Color.Gray); Primitives2D.DrawRectangle(_spriteBatch, new Rectangle(xoff + Calc(p.X), Calc(p.Y), scale, scale), DarkGray, 2f); } _spriteBatch.End(); base.Draw(gameTime); } private void Input() { KeyboardState keyboardState = Keyboard.GetState(); if (KeyPress(keyboardState, Keys.Escape)) { Exit(); } if (KeyPress(keyboardState, Keys.Space)) { paused = !paused; } if (!paused) { Snake.AddDirection(KeyPress(keyboardState, Keys.Up) || KeyPress(keyboardState, Keys.W) ? "UpArrow" : ""); Snake.AddDirection(KeyPress(keyboardState, Keys.Down) || KeyPress(keyboardState, Keys.S) ? "DownArrow" : ""); Snake.AddDirection(KeyPress(keyboardState, Keys.Left) || KeyPress(keyboardState, Keys.A) ? "LeftArrow" : ""); Snake.AddDirection(KeyPress(keyboardState, Keys.Right) || KeyPress(keyboardState, Keys.D) ? "RightArrow" : ""); } _previousKeyboardState = keyboardState; } private int Calc(int Value) { return Value * this.scale; } private bool KeyPress(KeyboardState keyboardState, Keys key) { return keyboardState.IsKeyDown(key) && _previousKeyboardState.IsKeyUp(key); } }