Ejemplo n.º 1
0
        private static void Main(string[] args)
        {
            //object met al de functies in voor main program
            var programFunctions = new _ProgramFunctions();
            var lineDrawer       = new _LineDrawer();

            //schrijven van de titel
            var title = "TERRARIUM";

            Console.WriteLine(title);
            Console.Write(lineDrawer.DrawLine(title.Length, '*'));

            //Grootte terrarium vragen met controle input
            //Hier later mogelijk om meerdere terrariums aan te maken via for lus
            //als we input vragen over aantal terrariums te maken
            var     sizeTerrarium = programFunctions.AskSizeTerrarium();
            var     terrarium     = new Terrarium(sizeTerrarium);
            Logboek logboek       = new Logboek(terrarium);

            terrarium.LogBook = logboek;

            // ask user for starting values for Organisms

            double[] StartingValuesOrganisms = programFunctions.AskStartingValuesOrganisms();

            //array aanmaken met first day values
            Console.Clear();
            var arrTerrarium = terrarium.FirstDay(StartingValuesOrganisms);
            var day          = 1;

            // ask type of logbook
            string logbookChoice = programFunctions.AskTypeLog(terrarium, logboek, arrTerrarium);

            //Terrarium tonen op het scherm (first day)
            programFunctions.DrawTitelWithLine(day);
            terrarium.Display(arrTerrarium);
            if (logbookChoice == "simple")
            {
                terrarium.LogBook.Showlogboek();
            }
            else if (logbookChoice == "detailed")
            {
                Console.Write(terrarium.LogBook.ShowExtensiveLogboek(arrTerrarium));
            }
            else
            {
                // no logbook
            }

            //Terrarium tonen op het scherm (first day)

            //infinite loop as long program runs
            while (true)
            {
                programFunctions.AskNextMove(terrarium, arrTerrarium, logboek, logbookChoice);
            }
        }
Ejemplo n.º 2
0
        // interface method Fight
        public void Fight(ref Organism[,] arrOrganism, Organism opponentOrganism, ref Logboek logbook)
        {
            var xPosition = this.Position.xPosition;
            var yPosition = this.Position.yPosition;

            if (this.Life == opponentOrganism.Life)
            {
                // win
                this.Life += opponentOrganism.Life;

                // destroy opponent, make terrain at this location
                arrOrganism[opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition] = new Terrain(opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);

                // move to this location
                ((Animal)this).MoveTo(ref arrOrganism, opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);
                logbook.numberOfCarnivores--;
                logbook.DiedCarnivores++;
            }
            else if (this.Life > opponentOrganism.Life)
            {
                // victory
                // add opponent's life to yours
                this.Life += opponentOrganism.Life;

                // destroy opponent, make terrain at his location
                arrOrganism[opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition] = new Terrain(opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);

                // move to opponent's location
                this.MoveTo(ref arrOrganism, opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);

                // humans can only fight carnivores
                logbook.numberOfCarnivores--;
                logbook.DiedCarnivores++;
            }
            else
            {
                // lose, add life to opponent
                opponentOrganism.Life += this.Life;

                // destroy yourself, make terrain at this location
                arrOrganism[xPosition, yPosition] = new Terrain(xPosition, yPosition);

                // opponent moves to this location
                ((Animal)opponentOrganism).MoveTo(ref arrOrganism, xPosition, yPosition);
                logbook.numberOfHumans--;
                logbook.DiedHumans++;
            }
            // reduce moves by 1 for both organisms
            // set last move to fight for both organisms
            this.LastMove             = OrganismMoves.Fight;
            opponentOrganism.LastMove = OrganismMoves.Fight;
            this.Moves--;
            opponentOrganism.Moves--;
        }
Ejemplo n.º 3
0
        // ask whether to show limited log, extensive log or not log

        public string AskTypeLog(Terrarium terrarium, Logboek logboek, Organism[,] arrOrganism)
        {
            string consoleInput;

            Console.WriteLine("Show simple, detailed, or no log? (\"simple\", \"detailed\", \"no\")");
            consoleInput = Console.ReadLine();

            while (consoleInput != "simple" && consoleInput != "detailed" && consoleInput != "no")
            {
                Console.WriteLine("Invalid input. Choose between \"simple\", \"detailed\", or \"no\")");
                consoleInput = Console.ReadLine();
            }
            return(consoleInput);
        }
Ejemplo n.º 4
0
        public void ProcreateAlone(ref Organism[,] arrOrganism, ref Logboek logboek)
        {
            //Aanpasbare kans op groei van een plant
            var chance       = 10m;
            var randomChance = random.Next(1, 101);

            if (randomChance <= chance)
            {
                //Wordt gegeven grond een plant
                var xPosition = this.Position.xPosition;
                var yPosition = this.Position.yPosition;

                arrOrganism[xPosition, yPosition] = null;
                arrOrganism[xPosition, yPosition] = new Plant(xPosition, yPosition);
                logboek.numberOfPlants           += 1;
                logboek.CreatedPlants            += 1;
            }
        }
Ejemplo n.º 5
0
        public Organism[,] NextDay(ref Organism[,] arrOrganisms, ref Logboek logboek)
        {
            // roll for disaster if turned on
            if (VolcanicEruptionTurnedOn == true)
            {
                int DisasterRoll = random.Next(100);
                if (DisasterRoll <= DisasterChance)
                {
                    int xPosition = random.Next(arrOrganisms.GetLength(0));
                    int yPosition = random.Next(arrOrganisms.GetLength(1));
                    arrOrganisms[xPosition, yPosition] = new VolcanicEruption(xPosition, yPosition, 1);
                    // voor meerdere malen te kunnen laten gebeuren
                    // VolcanicEruptionTurnedOn = false;
                }
            }

            // go through array row per row
            // first add plants
            for (int y = 0; y < arrOrganisms.GetLength(1); y++)
            {
                for (int x = 0; x < arrOrganisms.GetLength(0); x++)
                {
                    // which organism?
                    var currentOrganism = arrOrganisms[x, y];
                    // use switch on currentorganism, not possible, can't be done on an object
                    // == also can't be used? what is the difference with "is"
                    if (currentOrganism is Terrain)
                    {
                        ((Terrain)currentOrganism).ProcreateAlone(ref arrOrganisms, ref logboek);
                        currentOrganism.LastMove = OrganismMoves.Procreate;
                    }
                }
            }

            // go through array row per row
            // now check for herbivores, carnivores and humans
            //// take out check last column + double moves
            for (int y = 0; y < arrOrganisms.GetLength(1); y++)
            {
                for (int x = 0; x < arrOrganisms.GetLength(0); x++)
                {
                    var currentOrganism = arrOrganisms[x, y];

                    // check right neighbour
                    // if part of last column, check neighbours in first column
                    Organism rightNeighbourOrganism;

                    if ((x == (arrOrganisms.GetLength(0) - 1)))
                    {
                        rightNeighbourOrganism = arrOrganisms[0, y];
                    }
                    else
                    {
                        rightNeighbourOrganism = arrOrganisms[x + 1, y];
                    }

                    if (currentOrganism is Herbivore && currentOrganism.Moves != 0)
                    {
                        // different action based on type of neighbour
                        if (rightNeighbourOrganism is Carnivore || rightNeighbourOrganism is Human || rightNeighbourOrganism is Terrain || rightNeighbourOrganism is VolcanicEruption)
                        {
                            ((Animal)currentOrganism).Move(ref arrOrganisms);
                        }
                        else if (rightNeighbourOrganism is Plant)
                        {
                            ((Herbivore)currentOrganism).Eat(ref arrOrganisms, rightNeighbourOrganism);
                            logboek.EatenPlants    += 1;
                            logboek.numberOfPlants -= 1;
                        }
                        else /*rightNeighbourOrganism is Herbivore*/
                        {
                            // different sex => procreate
                            if (((Herbivore)currentOrganism).Sex != ((Herbivore)rightNeighbourOrganism).Sex)
                            {
                                ((Herbivore)currentOrganism).ProcreateTogether(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                            }
                            else
                            // same sex => move
                            {
                                ((Animal)currentOrganism).Move(ref arrOrganisms);
                            }
                        }
                    }
                    else if (currentOrganism is Carnivore && currentOrganism.Moves != 0)
                    {
                        // different action based on type of neighbour
                        if (rightNeighbourOrganism is Carnivore || rightNeighbourOrganism is Human)
                        {
                            if (rightNeighbourOrganism is Human)
                            {
                                ((Carnivore)currentOrganism).Fight(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                            }
                            else
                            // rightneighboorOrganism is Carnivore
                            {
                                // different sex => procreate
                                if (((Carnivore)currentOrganism).Sex != ((Carnivore)rightNeighbourOrganism).Sex)
                                {
                                    ((Carnivore)currentOrganism).ProcreateTogether(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                                }
                                else
                                // same sex => fight
                                {
                                    ((Carnivore)currentOrganism).Fight(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                                }
                            }
                        }
                        else if (rightNeighbourOrganism is Plant || rightNeighbourOrganism is Terrain || rightNeighbourOrganism is VolcanicEruption)
                        {
                            ((Animal)currentOrganism).Move(ref arrOrganisms);
                        }
                        else /*(rightNeighbourOrganism is Herbivore)*/
                        {
                            ((Carnivore)currentOrganism).Eat(ref arrOrganisms, rightNeighbourOrganism);
                            logboek.EatenHerbivores    += 1;
                            logboek.numberOfHerbivores -= 1;
                        }
                    }
                    else if (currentOrganism is Human && currentOrganism.Moves != 0)
                    {
                        // different action based on type of neighbour
                        if (rightNeighbourOrganism is Carnivore)
                        {
                            ((Human)currentOrganism).Fight(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                        }
                        else /*(rightNeighbourOrganism is Human || rightNeighbourOrganism is Plant || rightNeighbourOrganism is Herbivore || rightNeighbourOrganism is Terrain)*/
                        {
                            // if human of different sex => procreate
                            if (rightNeighbourOrganism is Human && ((Human)currentOrganism).Sex != ((Human)rightNeighbourOrganism).Sex)
                            {
                                ((Human)currentOrganism).ProcreateTogether(ref arrOrganisms, rightNeighbourOrganism, ref logboek);
                            }
                            else
                            // if human of same sex, or plant, herbivore or terrain
                            {
                                ((Human)currentOrganism).Move(ref arrOrganisms);
                            }
                        }
                    }
                    else if (currentOrganism is VolcanicEruption)
                    {
                        ((VolcanicEruption)currentOrganism).Spread(ref arrOrganisms);
                        ((VolcanicEruption)currentOrganism).Destroy(ref arrOrganisms);
                    }
                    else
                    {
                        // do nothing for plants and terrain
                    }
                }
            }

            foreach (Organism organism in arrOrganisms)
            {
                organism.Moves = 1;
            }

            // reduce life points of each animal with one
            // if life points is zero, kill it, and replace with ground

            foreach (Organism animal in arrOrganisms)
            {
                if (animal is Animal)
                {
                    animal.Life--;
                    if (animal.Life == 0)
                    {
                        if (animal is Carnivore)
                        {
                            logboek.numberOfCarnivores--;
                            logboek.DiedCarnivores++;
                        }
                        if (animal is Herbivore)
                        {
                            logboek.numberOfHerbivores--;
                        }
                        if (animal is Human)
                        {
                            logboek.numberOfHumans--;
                        }

                        arrOrganisms[animal.Position.xPosition, animal.Position.yPosition] = null;
                        arrOrganisms[animal.Position.xPosition, animal.Position.yPosition] =
                            new Terrain(animal.Position.xPosition, animal.Position.yPosition);
                    }
                }
            }
            this.Day++;
            return(arrOrganisms);
        }
Ejemplo n.º 6
0
        public void AskNextMove(Terrarium terrarium, Organism[,] arrTerrarium, Logboek logboek, string logbookchoice)
        {
            var input    = string.Empty;
            var skipDays = 100;

            Console.WriteLine("Press 'v' and ENTER to show the next day in the terrarium.");
            Console.WriteLine("Press 's' and ENTER to stop the program.");
            Console.WriteLine("Press 'f' and ENTER for fast forward {0} days.", skipDays);
            Console.WriteLine("Press 't' and ENTER for playing a timelapse of {0} days.", skipDays);

            //alles naar upper om zo later klein- en hoofdletter te lezen
            input = Console.ReadLine().ToUpper();

            //switch gebruiken om zo later makkelijker opties toe te voegen
            switch (input)
            {
            case "S":
                Environment.Exit(0);
                break;

            case "V":
                day++;
                DrawTitelWithLine(day);
                terrarium.NextDay(ref arrTerrarium, ref logboek);
                terrarium.Display(arrTerrarium);
                if (logbookchoice == "simple")
                {
                    terrarium.LogBook.Showlogboek();
                }
                else if (logbookchoice == "detailed")
                {
                    Console.Write(terrarium.LogBook.ShowExtensiveLogboek(arrTerrarium));
                }
                else
                {
                    // no logbook
                }
                break;

            case "F":
                for (int i = 0; i < skipDays; i++)
                {
                    day++;
                    terrarium.NextDay(ref arrTerrarium, ref logboek);
                }
                DrawTitelWithLine(day);
                terrarium.Display(arrTerrarium);
                if (logbookchoice == "simple")
                {
                    terrarium.LogBook.Showlogboek();
                }
                else if (logbookchoice == "detailed")
                {
                    Console.Write(terrarium.LogBook.ShowExtensiveLogboek(arrTerrarium));
                }
                else
                {
                    // no logbook
                }
                break;

            case "T":
                // periode van 1 seconden tussen elke dag
                var milliseconds = 1000;
                for (int i = 0; i < skipDays; i++)
                {
                    Thread.Sleep(milliseconds);
                    Console.Clear();
                    day++;
                    terrarium.NextDay(ref arrTerrarium, ref logboek);
                    DrawTitelWithLine(day);
                    terrarium.Display(arrTerrarium);
                    if (logbookchoice == "simple")
                    {
                        terrarium.LogBook.Showlogboek();
                    }
                    else if (logbookchoice == "detailed")
                    {
                        Console.Write(terrarium.LogBook.ShowExtensiveLogboek(arrTerrarium));
                    }
                    else
                    {
                        // no logbook
                    }
                }
                break;

            default:
                Console.WriteLine("Wrong input");
                break;
            }
        }
Ejemplo n.º 7
0
        public void Fight(ref Organism[,] arrOrganism, Organism opponentOrganism, ref Logboek logbook)
        {
            var xPosition = this.Position.xPosition;
            var yPosition = this.Position.yPosition;

            if (this.Life == opponentOrganism.Life)
            {
                if (opponentOrganism is Human)
                {
                    // defeat, add life to opponent
                    opponentOrganism.Life += this.Life;

                    // destroy yourself, make terrain at this location
                    arrOrganism[xPosition, yPosition] = new Terrain(xPosition, yPosition);

                    // opponent moves to this location
                    ((Animal)opponentOrganism).MoveTo(ref arrOrganism, xPosition, yPosition);
                    logbook.numberOfCarnivores--;
                    logbook.DiedCarnivores++;
                }
                // do nothing since opponent organism is carnivore
            }
            else if (this.Life > opponentOrganism.Life)
            {
                // victory
                // add opponent's life to yours
                this.Life += opponentOrganism.Life;

                // destroy opponent, make terrain at his location
                arrOrganism[opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition] = new Terrain(opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);

                // move to opponent's location
                this.MoveTo(ref arrOrganism, opponentOrganism.Position.xPosition, opponentOrganism.Position.yPosition);

                // if carnivore, adjust logbook appropriately, if human, adjust appropriately
                if (opponentOrganism is Carnivore)
                {
                    logbook.numberOfCarnivores--;
                    logbook.DiedCarnivores++;
                }
                else
                // is human
                {
                    logbook.numberOfHumans--;
                    logbook.DiedHumans++;
                }
            }
            else
            {
                // lose, add life to opponent
                opponentOrganism.Life += this.Life;

                // destroy yourself, make terrain at this location
                arrOrganism[xPosition, yPosition] = new Terrain(xPosition, yPosition);

                // opponent moves to this location
                ((Animal)opponentOrganism).MoveTo(ref arrOrganism, xPosition, yPosition);
                logbook.numberOfCarnivores--;
                logbook.DiedCarnivores++;
            }

            // reduce moves by 1 for both organisms
            // set last move to fight for both organisms
            this.LastMove             = OrganismMoves.Fight;
            opponentOrganism.LastMove = OrganismMoves.Fight;
            this.Moves--;
            opponentOrganism.Moves--;
        }
Ejemplo n.º 8
0
        // IProcreateTogether method

        public void ProcreateTogether(ref Organism[,] arrOrganism, Organism rightNeighbor, ref Logboek logboek)
        {
            //lijst maken van mogelijke plaatsen om een baby te zetten
            List <Organism> listPossibleSpaces = new List <Organism>();

            for (int y = 0; y < arrOrganism.GetLength(1); y++)
            {
                for (int x = 0; x < arrOrganism.GetLength(0); x++)
                {
                    if (arrOrganism[x, y].IsWalkable == true)
                    {
                        listPossibleSpaces.Add(arrOrganism[x, y]);
                    }
                }
            }
            if (listPossibleSpaces.Count != 0)
            {
                //een random stukje grond nemen uit de mogelijke plaatsen
                var randomPlace = random.Next(0, listPossibleSpaces.Count);

                var xPosition = listPossibleSpaces[randomPlace].Position.xPosition;
                var yPosition = listPossibleSpaces[randomPlace].Position.yPosition;

                //Nieuw organism toevoegen op random locatie
                arrOrganism[xPosition, yPosition] = null;
                if (this is Herbivore)
                {
                    arrOrganism[xPosition, yPosition] = new Herbivore(xPosition, yPosition, 0, OrganismMoves.Born);
                    logboek.BornHerbivores           += 1;
                    logboek.numberOfHerbivores       += 1;
                }
                else if (this is Carnivore)
                {
                    arrOrganism[xPosition, yPosition] = new Carnivore(xPosition, yPosition, 0, OrganismMoves.Born);
                    logboek.BornCarnivores           += 1;
                    logboek.numberOfCarnivores       += 1;
                }
                else
                // is human
                {
                    arrOrganism[xPosition, yPosition] = new Human(xPosition, yPosition, 0, OrganismMoves.Born);
                    logboek.BornHumans     += 1;
                    logboek.numberOfHumans += 1;
                }
            }
            //de acties van beide organism gaan naar 0
            this.Moves--;
            rightNeighbor.Moves--;
            // de laatste move van beide organism op procreate zetten
            this.LastMove          = OrganismMoves.Procreate;
            rightNeighbor.LastMove = OrganismMoves.Procreate;
        }