source: 2016/koodauskerho/GordeyZ/Snake/Form1.cs @ 8348

Revision 8348, 6.7 KB checked in by sieerinn, 3 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Drawing;
4using System.Windows.Forms;
5
6namespace Snake
7{
8    public partial class Form1 : Form
9    {
10        private List<Circle> Snake = new List<Circle>();
11        private Circle food = new Circle();
12
13        public Form1()
14        {
15            InitializeComponent();
16
17            //Set settings to default
18            new Settings();
19
20            //Set game speed and start timer
21            gameTimer.Interval = 1400 / Settings.Speed;
22            gameTimer.Tick += UpdateScreen;
23            gameTimer.Start();
24
25            //Start New game
26            StartGame();
27        }
28
29        private void StartGame()
30        {
31            lblGameOver.Visible = false;
32
33            //Set settings to default
34            new Settings();
35
36            //Create new player object
37            Snake.Clear();
38            Circle head = new Circle {X = 10, Y = 5};
39            Snake.Add(head);
40
41
42            lblScore.Text = Settings.Score.ToString();
43            GenerateFood();
44
45        }
46
47        //Place random food object
48        private void GenerateFood()
49        {
50            int maxXPos = pbCanvas.Size.Width / Settings.Width;
51            int maxYPos = pbCanvas.Size.Height / Settings.Height;
52
53            Random random = new Random();
54            food = new Circle {X = random.Next(0, maxXPos), Y = random.Next(0, maxYPos)};
55        }
56
57
58        private void UpdateScreen(object sender, EventArgs e)
59        {
60            //Check for Game Over
61            if (Settings.GameOver)
62            {
63                //Check if Enter is pressed
64                if (Input.KeyPressed(Keys.Enter))
65                {
66                    StartGame();
67                }
68            }
69            else
70            {
71                if (Input.KeyPressed(Keys.Right) && Settings.direction != Direction.Left)
72                    Settings.direction = Direction.Right;
73                else if (Input.KeyPressed(Keys.Left) && Settings.direction != Direction.Right)
74                    Settings.direction = Direction.Left;
75                else if (Input.KeyPressed(Keys.Up) && Settings.direction != Direction.Down)
76                    Settings.direction = Direction.Up;
77                else if (Input.KeyPressed(Keys.Down) && Settings.direction != Direction.Up)
78                    Settings.direction = Direction.Down;
79
80                MovePlayer();
81            }
82
83            pbCanvas.Invalidate();
84
85        }
86
87        private void pbCanvas_Paint(object sender, PaintEventArgs e)
88        {
89            Graphics canvas = e.Graphics;
90
91            if (!Settings.GameOver)
92            {
93                //Set colour of snake
94
95                //Draw snake
96                for (int i = 0; i < Snake.Count; i++)
97                {
98                    Brush snakeColour;
99                    if (i == 0)
100                        snakeColour = Brushes.Black;     //Draw head
101                    else
102                        snakeColour = Brushes.Green;    //Rest of body
103
104                    //Draw snake
105                    canvas.FillEllipse(snakeColour,
106                        new Rectangle(Snake[i].X * Settings.Width,
107                                      Snake[i].Y * Settings.Height,
108                                      Settings.Width, Settings.Height));
109
110
111                    //Draw Food
112                    canvas.FillEllipse(Brushes.Red,
113                        new Rectangle(food.X * Settings.Width,
114                             food.Y * Settings.Height, Settings.Width, Settings.Height));
115
116                }
117            }
118            else
119            {
120                string gameOver = "Game over \nYour final score is: " + Settings.Score + "\nPress Enter to try again";
121                lblGameOver.Text = gameOver;
122                lblGameOver.Visible = true;
123            }
124        }
125
126
127        private void MovePlayer()
128        {
129            for (int i = Snake.Count - 1; i >= 0; i--)
130            {
131                //Move head
132                if (i == 0)
133                {
134                    switch (Settings.direction)
135                    {
136                        case Direction.Right:
137                            Snake[i].X++;
138                            break;
139                        case Direction.Left:
140                            Snake[i].X--;
141                            break;
142                        case Direction.Up:
143                            Snake[i].Y--;
144                            break;
145                        case Direction.Down:
146                            Snake[i].Y++;
147                            break;
148                    }
149
150
151                    //Get maximum X and Y Pos
152                    int maxXPos = pbCanvas.Size.Width / Settings.Width;
153                    int maxYPos = pbCanvas.Size.Height / Settings.Height;
154
155                    //Detect collission with game borders.
156                    if (Snake[i].X < 0 || Snake[i].Y < 0
157                        || Snake[i].X >= maxXPos || Snake[i].Y >= maxYPos)
158                    {
159                        Die();
160                    }
161
162
163                    //Detect collission with body
164                    for (int j = 1; j < Snake.Count; j++)
165                    {
166                        if (Snake[i].X == Snake[j].X &&
167                           Snake[i].Y == Snake[j].Y)
168                        {
169                            Die();
170                        }
171                    }
172
173                    //Detect collision with food piece
174                    if (Snake[0].X == food.X && Snake[0].Y == food.Y)
175                    {
176                        Eat();
177                    }
178
179                }
180                else
181                {
182                    //Move body
183                    Snake[i].X = Snake[i - 1].X;
184                    Snake[i].Y = Snake[i - 1].Y;
185                }
186            }
187        }
188
189        private void Form1_KeyDown(object sender, KeyEventArgs e)
190        {
191            Input.ChangeState(e.KeyCode, true);
192        }
193
194        private void Form1_KeyUp(object sender, KeyEventArgs e)
195        {
196            Input.ChangeState(e.KeyCode, false);
197        }
198
199        private void Eat()
200        {
201            //Add circle to body
202            Circle circle = new Circle
203            {
204                X = Snake[Snake.Count - 1].X,
205                Y = Snake[Snake.Count - 1].Y
206            };
207            Snake.Add(circle);
208
209            //Update Score
210            Settings.Score += Settings.Points;
211            lblScore.Text = Settings.Score.ToString();
212
213            GenerateFood();
214        }
215
216        private void Die()
217        {
218            Settings.GameOver = true;
219        }
220    }
221}
Note: See TracBrowser for help on using the repository browser.