コード例 #1
0
        public void Spawn()
        {
            if (plant_turtles.Count() > 500)
            {
                return;
            }
            Random rnd = new Random();
            List <Plant_Turtle> new_turtles = new List <Plant_Turtle>();

            foreach (Plant_Turtle individual_turtle in plant_turtles)
            {
                int locx = individual_turtle.location_x;
                int locy = individual_turtle.location_y;
                if (waterMap[locx, locy].val < 20 && waterMap[locx, locy].val > 5)
                {
                    Plant_Turtle newplant = new Plant_Turtle(locx, locy, rnd.NextDouble() * 360.0, this);
                    new_turtles.Add(newplant);
                }
            }
            plant_turtles.AddRange(new_turtles);
        }
コード例 #2
0
        public void MoveTurtles()
        {
            List <Plant_Turtle> alive_turtles = (from turtle in plant_turtles where turtle.alive select turtle).ToList();

            plant_turtles = alive_turtles;

            foreach (Plant_Turtle individual in plant_turtles) // still need to add in the alive function above
            {
                //int counter = 0;
                //double valuex = 0.0;
                //double valuey = 0.0;
                //double factorplant = 1.0;
                //double factorwater = 2.0;
                //int originx = individual.location_x;
                //int originy = individual.location_y;
                //double weightages = 0.0;

                //for (int xcor = originx - (plantMap.xLen/5); xcor < originx + (plantMap.xLen / 5); xcor++)
                //{
                //    if (xcor < plantMap.yLen - 1 && xcor > 0 && xcor != originx)
                //    {
                //        for (int ycor = originy - (plantMap.xLen / 5); ycor < originy + (plantMap.xLen / 5); ycor++)
                //        {
                //            if (ycor < plantMap.yLen - 1 && ycor > 0 && ycor != originy)
                //            {
                //                double distancesquare = Math.Pow(xcor - originx, 2) + Math.Pow(ycor - originy, 2);
                //                valuex += factorplant * (1.0 / distancesquare) *(plantMap[xcor,ycor].val* factorplant + waterMap[xcor, ycor].val * factorwater) *(xcor - originx);
                //                valuey += factorplant * (1.0 / distancesquare) * (plantMap[xcor, ycor].val * factorplant + waterMap[xcor, ycor].val * factorwater) * (ycor - originy);
                //                weightages += (plantMap[xcor, ycor].val + waterMap[xcor, ycor].val);
                //                counter += 1;
                //            }

                //        }
                //    }

                //}

                //Are conditions to find new target met?
                if (individual.target_x == -1 || individual.target_y == -1 || (individual.target_x == individual.location_x && individual.target_y == individual.location_y))
                {
                    int tx, ty;
                    Plant_Turtle.FindNewTarget(waterMap.bestWater, out tx, out ty);
                    individual.target_x = tx;
                    individual.target_y = ty;
                }

                //Throw dice to determine if individual should head straight for the target or move towards a patch.
                Random r = new Random(15528);
                if (r.NextDouble() < Plant_Turtle.patchBias)
                {
                    individual.MoveTowardsPatch(plantMap.desired_plants);
                }
                else
                {
                    individual.MoveTowardsTarget();
                }

                //Vector2d direction_vector = new Vector2d(valuex / weightages, valuey / counter); //directional vector to face
                //if (plantMap.desired_plants.Count() > 0)
                //{
                //    for (int patch = 0; patch<plantMap.desired_plants.Count(); patch++)
                //    {
                //        direction_vector.X += .5 * (plantMap.desired_plants[patch].locX-originx);
                //        direction_vector.Y += 5 * (plantMap.desired_plants[patch].locY-originy);
                //    }
                //}
                //double initial_heading = Math.Atan(direction_vector.X/direction_vector.Y);
                //direction_vector.Unitize();
                //double locX = individual.location_x;
                //double locY = individual.location_y;
                //locX += direction_vector.X;
                //locY += direction_vector.Y;
                //locX = Math.Round(locX);
                //locY = Math.Round(locY);

                //individual.location_x = (int)locX;
                //individual.location_y = (int)locY;

                //if (individual.location_x < 0)
                //{
                //    individual.location_x = 0;
                //}
                //if (individual.location_x > plantMap.xLen-1)
                //{
                //    individual.location_x = plantMap.xLen - 1;
                //}
                //if (individual.location_y < 0)
                //{
                //    individual.location_y = 0;
                //}
                //if (individual.location_y > plantMap.yLen - 1)
                //{
                //    individual.location_y = plantMap.yLen - 1;
                //}
            }
        }