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); } }
// 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--; }
// 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); }
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; } }
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); }
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; } }
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--; }
// 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; }