/// <summary>
        /// Draw a line between two points of the acceleration representation
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="brush">Brush to use</param>
        /// <param name="latest">First point</param>
        /// <param name="next">Second point</param>
        /// <param name="scaleX">Scale on the X-Axis</param>
        /// <param name="scaleZ">Scale on the Z-Axis</param>
        private void DrawAccelerationLine(Canvas canvas, SolidColorBrush brush, Model.Point latest, Model.Point next, float scaleX, float scaleZ)
        {
            Line l = new Line();

            l.X1 = (scaleX * latest.X) + CANVAS_PADDING;
            l.X2 = (scaleX * next.X) + CANVAS_PADDING;
            l.Y1 = -(scaleZ * latest.Z) + CANVAS_PADDING;
            l.Y2 = -(scaleZ * next.Z) + CANVAS_PADDING;
            DrawLine(canvas, l, brush);
        }
        /// <summary>
        /// Draw a line between two points of the energies representation
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="brush">Brush to use</param>
        /// <param name="latest">First point</param>
        /// <param name="next">Second point</param>
        /// <param name="scaleX">Scale on the X-Axis</param>
        /// <param name="scaleZ">Scale on the Z-Axis</param>
        private void DrawEnergyLine(Canvas canvas, SolidColorBrush brush, Model.Point latest, Model.Point next, float scaleX, float scaleZ)
        {
            double invert = canvas.ActualHeight;
            Line   l      = new Line();

            l.X1 = (scaleX * latest.X) + CANVAS_PADDING;
            l.X2 = (scaleX * next.X) + CANVAS_PADDING;
            l.Y1 = invert - CANVAS_PADDING - scaleZ * latest.Z;
            l.Y2 = invert - CANVAS_PADDING - scaleZ * next.Z;
            DrawLine(canvas, l, brush);
        }
        /// <summary>
        /// Draw where the max lenght is
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="point">Max lenght</param>
        /// <param name="scaleX">Scale on X-Axis</param>
        /// <param name="scaleZ">scale on Z-Axis</param>
        /// <param name="brush">Brush to use</param>
        private void DrawMaxLength(Canvas canvas, Model.Point point, float scaleX, float scaleZ, SolidColorBrush brush)
        {
            Line l = new Line();

            l.X1 = scaleX * point.X + CANVAS_PADDING;
            l.Y1 = canvas.ActualHeight - CANVAS_PADDING - HALF_GRADUATION;
            l.X2 = scaleX * point.X + CANVAS_PADDING;
            l.Y2 = canvas.ActualHeight - CANVAS_PADDING + HALF_GRADUATION;
            DrawLine(canvas, l, brush);
            TextBlock grad = new TextBlock();

            grad.Foreground = brush;
            grad.Text       = Math.Round(point.X, 2).ToString() + "m";
            grad.Margin     = new Thickness(point.X * scaleX + CANVAS_PADDING - 4 * HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING + 4 * HALF_GRADUATION, 0, 0);
            canvas.Children.Add(grad);
        }
        /// <summary>
        /// Plot the trajectory of the equation on the given canvas
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="precision">With which precision draw</param>
        /// <param name="equation">Equation to draw</param>
        private void DrawMainCanvas(Canvas canvas, float precision, Equation equation)
        {
            float scaleX = (float)(canvas.ActualWidth - CANVAS_PADDING - MARGIN_SCALE) / equation.ZeroHeight.X;
            float scaleZ = (float)(canvas.ActualHeight - CANVAS_PADDING - MARGIN_SCALE) / equation.MaxHeight.Z;
            List <Model.Point> points = equation.GetPoints(precision);

            scaleX     = CheckScales(scaleX);
            scaleZ     = CheckScales(scaleZ);
            mainScaleX = scaleX;
            mainScaleZ = scaleZ;
            //X-Axis
            Line xAxis = new Line();

            xAxis.X1 = 0;
            xAxis.X2 = canvas.ActualWidth;
            xAxis.Y1 = canvas.ActualHeight - CANVAS_PADDING;
            xAxis.Y2 = canvas.ActualHeight - CANVAS_PADDING;
            DrawLine(canvas, xAxis, blackBrush);

            float factor = GetFactor(scaleX);
            float length = 0;

            //X-Axis graduations
            for (float i = CANVAS_PADDING; i < canvas.ActualWidth; i += factor * scaleX)
            {
                Line grad = new Line();
                grad.X1 = i;
                grad.X2 = i;
                grad.Y1 = canvas.ActualHeight - CANVAS_PADDING - HALF_GRADUATION;
                grad.Y2 = canvas.ActualHeight - CANVAS_PADDING + HALF_GRADUATION;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(i - HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING + HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Z-Axis
            Line zAxis = new Line();

            zAxis.X1 = CANVAS_PADDING;
            zAxis.X2 = CANVAS_PADDING;
            zAxis.Y1 = 0;
            zAxis.Y2 = canvas.ActualHeight;
            DrawLine(canvas, zAxis, blackBrush);
            factor = GetFactor(scaleZ);
            length = 0;
            //Z-Axis graduations
            for (float i = (float)canvas.ActualHeight - CANVAS_PADDING; i > 0; i -= factor * scaleZ)
            {
                Line grad = new Line();
                grad.X1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.X2 = CANVAS_PADDING + HALF_GRADUATION;
                grad.Y1 = i;
                grad.Y2 = i;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(HALF_GRADUATION, i - 2 * HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Units
            TextBlock unitX = new TextBlock();

            unitX.Text   = "x (m)";
            unitX.Margin = new Thickness(canvas.ActualWidth - CANVAS_PADDING, canvas.ActualHeight - CANVAS_PADDING - 4 * HALF_GRADUATION, 0, 0);
            canvas.Children.Add(unitX);
            TextBlock unitZ = new TextBlock();

            unitZ.Text   = "z (m)";
            unitZ.Margin = new Thickness(CANVAS_PADDING + 2 * HALF_GRADUATION, HALF_GRADUATION, 0, 0);
            canvas.Children.Add(unitZ);

            //Origin
            TextBlock origin = new TextBlock();

            origin.Text   = "O";
            origin.Margin = new Thickness(CANVAS_PADDING - 4 * HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING, 0, 0);
            canvas.Children.Add(origin);

            Model.Point latest = null;
            points.Add(equation.ZeroHeight);
            foreach (Model.Point point in points)
            {
                if (latest != null)
                {
                    DrawMainLine(canvas, blueBrush, latest, point, scaleX, scaleZ);
                }
                latest = point;
            }
            DrawMaxHeight(canvas, equation.MaxHeight, scaleX, scaleZ, redBrush);
            DrawMaxLength(canvas, points[points.Count - 1], scaleX, scaleZ, blueBrush);
        }
        /// <summary>
        /// Plot the energies of the equation on the given canvas
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="precision">With which precision draw</param>
        /// <param name="equation">Equation to draw</param>
        private void DrawEnergiesCanvas(Canvas canvas, float precision, Equation equation)
        {
            List <Model.Point> pointsKinetic   = equation.GetPointsKineticEnergy(precision);
            List <Model.Point> pointsPotential = equation.GetPointsPotentialEnergy(precision);

            float scaleX = (float)((canvas.ActualWidth - CANVAS_PADDING - MARGIN_SCALE) / equation.FlightTime);
            float scaleZ = (float)(canvas.ActualHeight - CANVAS_PADDING - MARGIN_SCALE) / equation.GetTotalEnergy(0);

            scaleX = CheckScales(scaleX);
            scaleZ = CheckScales(scaleZ);

            //X-Axis
            Line xAxis = new Line();

            xAxis.X1 = 0;
            xAxis.X2 = canvas.ActualWidth;
            xAxis.Y1 = canvas.ActualHeight - CANVAS_PADDING;
            xAxis.Y2 = canvas.ActualHeight - CANVAS_PADDING;
            DrawLine(canvas, xAxis, blackBrush);

            float factor = GetFactor(scaleX);
            float length = 0;

            //X-Axis graduations
            for (float i = CANVAS_PADDING; i < canvas.ActualWidth; i += factor * scaleX)
            {
                Line grad = new Line();
                grad.X1 = i;
                grad.X2 = i;
                grad.Y1 = canvas.ActualHeight - CANVAS_PADDING - HALF_GRADUATION;
                grad.Y2 = canvas.ActualHeight - CANVAS_PADDING + HALF_GRADUATION;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(i - HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING + HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Z-Axis
            Line zAxis = new Line();

            zAxis.X1 = CANVAS_PADDING;
            zAxis.X2 = CANVAS_PADDING;
            zAxis.Y1 = 0;
            zAxis.Y2 = canvas.ActualHeight;
            DrawLine(canvas, zAxis, blackBrush);

            factor = GetFactor(scaleZ);
            length = 0;
            //Z-Axis graduations
            for (float i = (float)canvas.ActualHeight - CANVAS_PADDING; i > 0; i -= factor * scaleZ)
            {
                Line grad = new Line();
                grad.X1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.X2 = CANVAS_PADDING + HALF_GRADUATION;
                grad.Y1 = i;
                grad.Y2 = i;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(HALF_GRADUATION, i - 2 * HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            TextBlock unitX = new TextBlock();

            unitX.Text   = "t (s)";
            unitX.Margin = new Thickness(canvas.ActualWidth - 5 * HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING - 4 * HALF_GRADUATION, 0, 0);
            canvas.Children.Add(unitX);
            TextBlock unitZTE = new TextBlock();

            unitZTE.Text       = "TE (J)";
            unitZTE.Margin     = new Thickness(CANVAS_PADDING + HALF_GRADUATION, HALF_GRADUATION / 2, 0, 0);
            unitZTE.Foreground = redBrush;
            canvas.Children.Add(unitZTE);
            TextBlock unitZKE = new TextBlock();

            unitZKE.Text       = "KE (J)";
            unitZKE.Margin     = new Thickness(2 * CANVAS_PADDING + HALF_GRADUATION, HALF_GRADUATION / 2, 0, 0);
            unitZKE.Foreground = blueBrush;
            canvas.Children.Add(unitZKE);
            TextBlock unitZEP = new TextBlock();

            unitZEP.Text       = "EP (J)";
            unitZEP.Margin     = new Thickness(3 * CANVAS_PADDING + HALF_GRADUATION, HALF_GRADUATION / 2, 0, 0);
            unitZEP.Foreground = greenBrush;
            canvas.Children.Add(unitZEP);

            Model.Point latestK = null;
            Model.Point latestP = null;
            Model.Point latestT = null;
            for (int i = 0; i < pointsKinetic.Count; i++)
            {
                if (latestK != null)
                {
                    DrawEnergyLine(canvas, blueBrush, latestK, pointsKinetic[i], scaleX, scaleZ);
                }
                latestK = pointsKinetic[i];
                if (latestP != null)
                {
                    DrawEnergyLine(canvas, greenBrush, latestP, pointsPotential[i], scaleX, scaleZ);
                }
                latestP = pointsPotential[i];
                if (latestT != null)
                {
                    DrawEnergyLine(canvas, redBrush, latestT, new Model.Point(pointsKinetic[i].X, pointsKinetic[i].Z + pointsPotential[i].Z), scaleX, scaleZ);
                }
                latestT = new Model.Point(pointsKinetic[i].X, pointsKinetic[i].Z + pointsPotential[i].Z);
            }
        }
        /// <summary>
        /// Plot the acceleration of the equation on the given canvas
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="precision">With which precision draw</param>
        /// <param name="equation">Equation to draw</param>
        private void DrawAccelerationCanvas(Canvas canvas, float precision, Equation equation)
        {
            List <Model.Point> points = equation.GetPointsAcceleration(precision);
            float scaleX = (float)((canvas.ActualWidth - CANVAS_PADDING - MARGIN_SCALE) / equation.FlightTime);
            float scaleZ = (float)((canvas.ActualHeight - CANVAS_PADDING - MARGIN_SCALE) / (-equation.Acceleration.Z));

            scaleX = CheckScales(scaleX);
            scaleZ = CheckScales(scaleZ);

            //X-Axis
            Line xAxis = new Line();

            xAxis.X1 = 0;
            xAxis.X2 = canvas.ActualWidth;
            xAxis.Y1 = CANVAS_PADDING;
            xAxis.Y2 = CANVAS_PADDING;
            DrawLine(canvas, xAxis, blackBrush);

            float factor = GetFactor(scaleX);
            float length = 0;

            //X-Axis graduations
            for (float i = CANVAS_PADDING; i < canvas.ActualWidth; i += factor * scaleX)
            {
                Line grad = new Line();
                grad.X1 = i;
                grad.X2 = i;
                grad.Y1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.Y2 = CANVAS_PADDING + HALF_GRADUATION;
                DrawLine(canvas, grad, blackBrush);

                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(i - HALF_GRADUATION, CANVAS_PADDING + HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Z-Axis
            Line zAxis = new Line();

            zAxis.X1 = CANVAS_PADDING;
            zAxis.X2 = CANVAS_PADDING;
            zAxis.Y1 = 0;
            zAxis.Y2 = canvas.ActualHeight;
            DrawLine(canvas, zAxis, blackBrush);


            factor = GetFactor(scaleZ);
            length = 0;
            //Z-Axis graduations
            for (float i = CANVAS_PADDING; i < canvas.ActualHeight; i += factor * scaleZ)
            {
                Line grad = new Line();
                grad.X1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.X2 = CANVAS_PADDING + HALF_GRADUATION;
                grad.Y1 = i;
                grad.Y2 = i;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(HALF_GRADUATION, i - 2 * HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Units
            TextBlock unitX = new TextBlock();

            unitX.Text   = "t (s)";
            unitX.Margin = new Thickness(canvas.ActualWidth - 5 * HALF_GRADUATION, CANVAS_PADDING - 4 * HALF_GRADUATION, 0, 0);
            canvas.Children.Add(unitX);
            TextBlock unitZ = new TextBlock();

            unitZ.Text       = "az (m/s²)";
            unitZ.Margin     = new Thickness(CANVAS_PADDING + HALF_GRADUATION, canvas.ActualHeight - CANVAS_PADDING / 2, 0, 0);
            unitZ.Foreground = redBrush;
            canvas.Children.Add(unitZ);

            Model.Point latest = null;
            foreach (Model.Point point in points)
            {
                if (latest != null)
                {
                    DrawAccelerationLine(canvas, redBrush, latest, point, scaleX, scaleZ);
                }
                latest = point;
            }
        }
        /// <summary>
        /// Plot the speeds of the equation on the given canvas
        /// </summary>
        /// <param name="canvas">Canvas where to draw</param>
        /// <param name="precision">With which precision draw</param>
        /// <param name="equation">Equation to draw</param>
        private void DrawSpeedCanvas(Canvas canvas, float precision, Equation equation)
        {
            List <Model.Point> pointsSpeedX = equation.GetPointsSpeedX(precision);
            List <Model.Point> pointsSpeedZ = equation.GetPointsSpeedZ(precision);

            float scaleX = (float)((canvas.ActualWidth - CANVAS_PADDING - MARGIN_SCALE) / equation.FlightTime);
            float scaleZ;
            float sZ = -equation.GetSpeed(equation.FlightTime).Z;
            float sX = equation.SpeedX;

            if (sZ > sX)
            {
                scaleZ = (float)((canvas.ActualHeight / 2 - MARGIN_SCALE) / sZ);
            }
            else
            {
                scaleZ = (float)((canvas.ActualHeight / 2 - MARGIN_SCALE) / sX);
            }

            scaleX = CheckScales(scaleX);
            scaleZ = CheckScales(scaleZ);

            //X-Axis
            Line xAxis = new Line();

            xAxis.X1 = 0;
            xAxis.X2 = canvas.ActualWidth;
            xAxis.Y1 = canvas.ActualHeight / 2;
            xAxis.Y2 = canvas.ActualHeight / 2;
            DrawLine(canvas, xAxis, blackBrush);

            float factor = GetFactor(scaleX);
            float length = 0;

            //X-Axis graduations
            for (float i = CANVAS_PADDING; i < canvas.ActualWidth; i += factor * scaleX)
            {
                Line grad = new Line();
                grad.X1 = i;
                grad.X2 = i;
                grad.Y1 = canvas.ActualHeight / 2 - HALF_GRADUATION;
                grad.Y2 = canvas.ActualHeight / 2 + HALF_GRADUATION;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(i - HALF_GRADUATION, canvas.ActualHeight / 2 + HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }

            //Z-Axis
            Line zAxis = new Line();

            zAxis.X1 = CANVAS_PADDING;
            zAxis.X2 = CANVAS_PADDING;
            zAxis.Y1 = 0;
            zAxis.Y2 = canvas.ActualHeight;
            DrawLine(canvas, zAxis, blackBrush);

            factor = GetFactor(scaleZ);
            length = 0;
            //Z-Axis graduations
            for (float i = (float)canvas.ActualHeight / 2; i > 0; i -= factor * scaleZ)
            {
                Line grad = new Line();
                grad.X1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.X2 = CANVAS_PADDING + HALF_GRADUATION;
                grad.Y1 = i;
                grad.Y2 = i;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(HALF_GRADUATION, i - 2 * HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length += factor;
            }
            length = 0;
            for (float i = (float)canvas.ActualHeight / 2; i < (float)canvas.ActualHeight; i += factor * scaleZ)
            {
                Line grad = new Line();
                grad.X1 = CANVAS_PADDING - HALF_GRADUATION;
                grad.X2 = CANVAS_PADDING + HALF_GRADUATION;
                grad.Y1 = i;
                grad.Y2 = i;
                DrawLine(canvas, grad, blackBrush);
                TextBlock num = new TextBlock();
                num.Text   = length.ToString();
                num.Margin = new Thickness(HALF_GRADUATION, i - 2 * HALF_GRADUATION, 0, 0);
                canvas.Children.Add(num);
                length -= factor;
            }

            //Units
            TextBlock unitX = new TextBlock();

            unitX.Text   = "t (s)";
            unitX.Margin = new Thickness(canvas.ActualWidth - 5 * HALF_GRADUATION, canvas.ActualHeight / 2 - 4 * HALF_GRADUATION, 0, 0);
            canvas.Children.Add(unitX);
            TextBlock unitZVZ = new TextBlock();

            unitZVZ.Text       = "v (m/s)";
            unitZVZ.Margin     = new Thickness(2 * CANVAS_PADDING + HALF_GRADUATION, HALF_GRADUATION / 2, 0, 0);
            unitZVZ.Foreground = blueBrush;
            canvas.Children.Add(unitZVZ);
            TextBlock unitZVX = new TextBlock();

            unitZVX.Text       = "v (m/s)";
            unitZVX.Margin     = new Thickness(CANVAS_PADDING + HALF_GRADUATION, HALF_GRADUATION / 2, 0, 0);
            unitZVX.Foreground = redBrush;
            canvas.Children.Add(unitZVX);

            Model.Point latestX = null;
            Model.Point latestZ = null;
            for (int i = 0; i < pointsSpeedX.Count; i++)
            {
                if (latestX != null)
                {
                    DrawSpeedLine(canvas, redBrush, latestX, pointsSpeedX[i], scaleX, scaleZ);
                }
                latestX = pointsSpeedX[i];

                if (latestZ != null)
                {
                    DrawSpeedLine(canvas, blueBrush, latestZ, pointsSpeedZ[i], scaleX, scaleZ);
                }
                latestZ = pointsSpeedZ[i];
            }
        }
Пример #8
0
        // Helper method for killing a snake
        private void snakeDeath(Snake s)
        {
            for (int i = 1; i < s.Verts.Count(); i++)
            {
                Model.Point p1 = s.Verts[i - 1];
                Model.Point p2 = s.Verts[i];

                if (p1.X == p2.X)    //moving vertically
                {
                    if (p1.Y > p2.Y) //moving down
                    {
                        for (int j = p1.Y; j > p2.Y; j--)
                        {
                            if (r.Next(0, 100) < snakeRecycleRate * 100)
                            {
                                int  id = foodID++;
                                Food f  = new Food(id, new Model.Point(p1.X, j));
                                foods.Add(id, f);
                                world[p1.X, j] = f;
                            }
                            else
                            {
                                world[p1.X, j] = null;
                            }
                        }
                    }
                    else //moving up
                    {
                        for (int j = p1.Y; j < p2.Y; j++)
                        {
                            if (r.Next(0, 100) < snakeRecycleRate * 100)
                            {
                                int  id = foodID++;
                                Food f  = new Food(id, new Model.Point(p1.X, j));
                                foods.Add(id, f);
                                world[p1.X, j] = f;
                            }
                            else
                            {
                                world[p1.X, j] = null;
                            }
                        }
                    }
                }
                else //Moving horizontally
                {
                    if (p1.X > p2.X) //moving left
                    {
                        for (int j = p1.X; j > p2.X; j--)
                        {
                            if (r.Next(0, 100) < snakeRecycleRate * 100)
                            {
                                int  id = foodID++;
                                Food f  = new Food(id, new Model.Point(j, p1.Y));
                                foods.Add(id, f);
                                world[j, p1.Y] = f;
                            }
                            else
                            {
                                world[j, p1.Y] = null;
                            }
                        }
                    }
                    else //moving right
                    {
                        for (int j = p1.X; j < p2.X; j++)
                        {
                            if (r.Next(0, 100) < snakeRecycleRate * 100)
                            {
                                int  id = foodID++;
                                Food f  = new Food(id, new Model.Point(j, p1.Y));
                                foods.Add(id, f);
                                world[j, p1.Y] = f;
                            }
                            else
                            {
                                world[j, p1.Y] = null;
                            }
                        }
                    }
                }
            }

            // the head of the snake is always set to null on snake death
            if (world[s.Head().X, s.Head().Y] != null)
            {
                if (object.ReferenceEquals(world[s.Head().X, s.Head().Y].GetType(), typeof(Snake)))
                {
                    world[s.Head().X, s.Head().Y] = null;
                }
            }

            //send data to sql server
            int    length = s.Length;
            Thread t1     = new Thread(() => HighScore.addEntry(s.Name, s.AliveDuration.ToString(), length));

            t1.Start();

            // set the verts to -1, -1
            s.Verts = new Model.Point[2] {
                new Model.Point(-1, -1), new Model.Point(-1, -1)
            };
            // add the snake to the garbage
            garbageSnake.Add(s);
        }
Пример #9
0
        // helper method for detecting any type of collision
        // return:
        //         0: no collision
        //         1: Food eaten in regularmode
        //         2: Food eaten in shrinkmode
        private int collisionCheck(Snake s)
        {
            Model.Point head = s.Head();
            // Check if the head has made contact with any wall
            if (head.X == 0 || head.X == width - 1 || head.Y == 0 || head.Y == height - 1)
            {
                snakeDeath(s);
                return(1);
            }
            else
            {
                object cellvalue = world[head.X, head.Y];

                // check if the head is on an empty cell
                if (cellvalue == null)
                {
                    world[head.X, head.Y]             = s;
                    world[s.Verts[0].X, s.Verts[0].Y] = null;
                    return(0);
                }
                // check if the head is on a cell with food in it
                else if (object.ReferenceEquals(cellvalue.GetType(), typeof(Food)))
                {
                    world[head.X, head.Y] = s;
                    Food f = (Food)cellvalue;
                    f.Location = new Model.Point(-1, -1);
                    garbageFood.Add(f);

                    // shrink mode has to null the last two cells on the snake
                    if (shrinkMode)
                    {
                        if (s.Length > 4)
                        {
                            world[s.Verts[0].X, s.Verts[0].Y] = null;

                            if (s.Verts[0].X == s.Verts[1].X)
                            {
                                if (s.Verts[0].Y < s.Verts[1].Y)
                                {
                                    world[s.Verts[0].X, s.Verts[0].Y + 1] = null;
                                }
                                else
                                {
                                    world[s.Verts[0].X, s.Verts[0].Y - 1] = null;
                                }
                            }
                            else
                            {
                                if (s.Verts[0].X < s.Verts[1].X)
                                {
                                    world[s.Verts[0].X + 1, s.Verts[0].Y] = null;
                                }
                                else
                                {
                                    world[s.Verts[0].X - 1, s.Verts[0].Y] = null;
                                }
                            }
                            return(2);
                        }
                        else
                        {
                            return(1);
                        }
                    }
                    else
                    {
                        return(1);
                    }
                }
                // check if the head is in a cell occupied by another snake
                else if (object.ReferenceEquals(cellvalue.GetType(), typeof(Snake)))
                {
                    snakeDeath(s);
                    return(1);
                }

                return(0);
            }
        }
Пример #10
0
        /// <summary>
        /// Servers way to add new snakes
        /// </summary>
        /// <param name="s"></param>
        public void addSnake(Snake s)
        {
            s.Direction = r.Next(1, 5);
            Model.Point head  = null;
            Model.Point tail  = null;
            bool        space = false; //variable used to identify if there is space for the snake to be placed without touching anything

            //length of snake       if shrinkmode is enabled lenght is 11/20 of the size            otherwise it starts at 15
            int initialSnakeSize = shrinkMode ? (int)(11 * (width > height ? height : width) / 20) : 15;

            // head is moved around until the snake can safely fit in the world
            while (!space)
            {
                space = true;

                switch (s.Direction)
                {
                case 1:
                    head = new Model.Point(r.Next(1, width - 1), r.Next((int)(2 * height / 5), height - initialSnakeSize));
                    for (int i = 0; i <= initialSnakeSize; i++)
                    {
                        if (world[head.X, head.Y + i] != null)
                        {
                            space = false;
                        }
                    }
                    if (head.Y + initialSnakeSize >= height)
                    {
                        space = false;
                    }
                    tail = new Model.Point(head.X, head.Y + initialSnakeSize);
                    break;

                case 2:
                    head = new Model.Point(r.Next(initialSnakeSize, (int)(3 * width / 5)), r.Next(1, width - 1));
                    for (int i = 0; i <= initialSnakeSize; i++)
                    {
                        if (world[head.X - i, head.Y] != null)
                        {
                            space = false;
                        }
                    }
                    if (head.X - initialSnakeSize <= 0)
                    {
                        space = false;
                    }
                    tail = new Model.Point(head.X - initialSnakeSize, head.Y);
                    break;

                case 3:
                    head = new Model.Point(r.Next(1, width - 1), r.Next(initialSnakeSize, (int)(3 * height / 5)));
                    for (int i = 0; i <= initialSnakeSize; i++)
                    {
                        if (world[head.X, head.Y - i] != null)
                        {
                            space = false;
                        }
                    }
                    if (head.Y + initialSnakeSize <= 0)
                    {
                        space = false;
                    }
                    tail = new Model.Point(head.X, head.Y - initialSnakeSize);
                    break;

                default:
                    head = new Model.Point(r.Next((int)(2 * width / 5), width - initialSnakeSize), r.Next(1, width - 1));
                    for (int i = 0; i <= initialSnakeSize; i++)
                    {
                        if (world[head.X + i, head.Y] != null)
                        {
                            space = false;
                        }
                    }
                    if (head.X + initialSnakeSize >= width)
                    {
                        space = false;
                    }
                    tail = new Model.Point(head.X + initialSnakeSize, head.Y);
                    break;
                }
            }

            // update the snake verts
            s.Verts = new Model.Point[2] {
                tail, head
            };

            // add the snake to snakes
            lock (snakeLock)
                snakes.Add(s.Id, s);

            // fills in all snake cells in 2d world array
            switch (s.Direction)
            {
            case 1:
                for (int i = 0; i <= initialSnakeSize; i++)
                {
                    world[head.X, head.Y + i] = s;
                }
                break;

            case 2:
                for (int i = 0; i <= initialSnakeSize; i++)
                {
                    world[head.X - i, head.Y] = s;
                }
                break;

            case 3:
                for (int i = 0; i <= initialSnakeSize; i++)
                {
                    world[head.X, head.Y - i] = s;
                }
                break;

            default:
                for (int i = 0; i <= initialSnakeSize; i++)
                {
                    world[head.X + i, head.Y] = s;
                }
                break;
            }
        }