Hjälp med en programmeringsuppgift c#

Permalänk

Hjälp med en programmeringsuppgift c#

Tjena vänner! Håller på med en uppgift där jag ska använda Windows Form i VS, har ett färdigskrivet program i konsolen som jag vill "formatera" till form, är väldigt ny inom detta och är första gången jag använder form i VS. Programmet är egentligen väldigt simpelt, har gjort en meny där användaren får välja vad som skall ske, i detta fall handlar det om en ägare och hans djurfamilj där man kan lista alla djuren, leka med djuren osv.. Mitt form program ska vara väldigt simpelt, har gjort färdigt knappar osv (ska försöka bifoga bild på hur programmet ser ut.

Till mitt form program har jag redan skapat event till knapparna och så vidare, det kluriga för mig är att veta var i koden jag skall sätta in dessa? Console.WriteLine osv ska ju bort för att där vill jag ha text i min befintliga textbox som jag har skapat, textBox1.Text = "blabla"; osv.. Har ni något tips på hur jag bör tänka här? Kan tänka mig att man gärna vill se kod osv innan, så hojta till om så är fallet! Ska försöka bifoga bilder på form design samt koden! Annars kopierar jag in det här.

Permalänk

@PapaDiouf: Nu vet jag om att det blir lite jobbigt, men skickar även koden här så har ni den om ni vill se:

namespace JOPPESHUNDAR { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void MenuButtonExitProgram_Click(object sender, EventArgs e) { } public class Petowner : Form1 { private int age { get; set; } private int name { get; set; } public List<Animal> Animal_List = new List<Animal>(); public Petowner(int age) { Age = age; Animal_List.Add(new Cat("Misse", 4, "fish")); Animal_List.Add(new Dog("Zorro", 5, "meat")); Animal_List.Add(new Puppy("Zeus", 3, "candy")); } public void AddPet() { } public int Age { get { return age; } set { age = value; } } public void MenuButtonListAnimals_Click(object sender, EventArgs e) { textBox1.Text = "Here is the animals: \r\n"; foreach (Animal animales in Animal_List) { textBox1.Text = ("\r\n" + animales); } } public void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Here is the animals: \r\n"; foreach (Animal animales in Animal_List) { textBox1.Text =("\r\n" + animales); } textBox1.Text = "Which animal do you want to play with?"; } public void MenuButtonFeedAnimals_Click(object sender, EventArgs e) { foreach (Animal animales in Animal_List) { textBox1.Text = ("\r\n" + animales); } textBox1.Text = "Which animal do you want to feed?"; } } public abstract class Animal { protected int age { get; set; } protected string name { get; set; } protected string fav_food { get; set; } protected string breed { get; set; } protected bool hungry { get; set; } public Animal(string name, int age, string fav_food) { } public virtual void Interact() { } public virtual void Eat() { } public virtual void Hungry_Animal() { } public override string ToString() { return base.ToString(); } } public class Cat : Animal { public Cat(string name, int age, string fav_food) : base(name, age, fav_food) { Name = name; Age = age; Fav_Food = fav_food; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public override void Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { Console.Write("\nJoppe is playing with {0}", Name); } if (interact == 1) { Console.Write("\n{0} is too hungry to play. . .", Name); } } public override void Hungry_Animal() { } public override void Eat() { Console.Write("\nWhat do you want to feed {0} with?\n", Name); Console.Write("\n1. Fish"); Console.Write("\n2. Chicken"); Console.Write("\n\nYour choice: "); int anwser = int.Parse(Console.ReadLine()); { if (anwser == 1) { Console.Write("\nNomnom, {0} is full after eating her favourite food {1}", Name, fav_food); } if (anwser == 2) { Console.Write("\nUrrgh, {0} doesn't like Chicken!! Misse will now go out to find food!\n", Name); Random rdmr = new Random(); int mousechans = rdmr.Next(0, 2); if (mousechans == 0) { Console.Write("\n{0} found a mouse, she is now full!", Name); } if (mousechans == 1) { Console.Write("\n{0} did not find a mouse and she is still hungry. . .", Name); } } } } public string Fav_Food { get { return fav_food; } set { fav_food = value; } } public override string ToString() { return string.Format("1. {0}", Name); } } public class Dog : Animal { public Dog(string name, int age, string fav_food) : base(name, age, fav_food) { Name = name; Age = age; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public override void Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { Console.Write("\nJoppe is playing with {0}", Name); } if (interact == 1) { Console.Write("\n{0} is too hungry to play. . .", Name); } } public override void Eat() { Console.Write("\nWhat do you want to feed {0} with?\n", Name); Console.Write("\n1. Meat"); Console.Write("\n2. Fish"); Console.Write("\n\nYour choice: "); int anwser = int.Parse(Console.ReadLine()); { if (anwser == 1) { Console.Write("\nNomnom, {0} is full after eating his favourite food {1}", Name, fav_food); } if (anwser == 2) { Console.Write("\nUrrgh, {0} doesn't like fish!!", Name); } } } public string Fav_Food { get { return fav_food; } set { fav_food = value; } } public override string ToString() { return string.Format("2. {0}", Name); } } public class Puppy : Dog { public Puppy(string name, int age, string fav_food) : base("", 0, fav_food) { Name = name; Age = age; } public override void Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { Console.Write("\nJoppe is playing with {0}", Name); } if (interact == 1) { Console.Write("\n{0} is too hungry to play. . .", Name); } } public override void Eat() { Console.Write("\nWhat do you want to feed {0} with?\n", Name); Console.Write("\n1. Candy"); Console.Write("\n2. Meat"); Console.Write("\n\nYour choice: "); int anwser = int.Parse(Console.ReadLine()); { if (anwser == 1) { Console.Write("\nNomnom, {0} is full after eating his favourite food {1}.", Name, Fav_Food); } if (anwser == 2) { Console.Write("\nUrrgh, {0} doesn't like fish!!", Name); } } } public new string Fav_Food { get { return fav_food; } set { fav_food = value; } } public override string ToString() { return string.Format("3. {0}", Name); } } } }

Permalänk
Medlem

I VS när du dubbelklickar på din button så skapas det ett event som lyssnar efter vad som händer när man trycker på knappen och där skriver du in din kod. Så dubbelklicka när du är i design vyn så tar den dig vidare.

Visa signatur

| ASUS ROG Crosshari VIII Dark Hero | AMD Ryzen 5950X | Noctua D15 Chromax | G.Skill TridentZ Royal Gold 32GB DDR4 @ 3600Mhz CL14 | PowerColor Radeon RX 9070 XT 16GB Reaper | 2x WD SN850 1TB @RAID 0 + 2x Samsung 860 EVO 1TB @RAID 0 | Corsair HX 1000W | Corsair Obsidian 1000D | LG 34GN850 |

Monitor Audio Platinum PL100 II + Marantz Cinema 60
Klipsch R-115SW
Sennheiser HD650

Permalänk
Medlem

förstår inte riktigt frågan... men för textbox i forms

1. Sätt dem multiline(om du har en textbox där alla meddelanden kommer)
2. Sätt scollbars auto på den
3. Använd Textbox1.AppendText() för att lägga till ny text utan att ta bort gammal
4. Snyggast är om du delar upp din form med hjälp av splitters och eller groupboxes och sen dockar t.ex. TextBoxen i en egen "ytan", då kommer den växa o krympa när man sizear om formen
5. Newlines gör du med "\r\n" även i forms

Lycka till!

Med vänlig hälsning Lazze

Permalänk

@Tea42BBS: Tack för info, haha förstår att du inte hänger med i frågan det gjorde inte ens jag när jag läste om den. Ställer lite frågor längs vägen istället så kanske det blir enklare. Just nu håller jag på med första knappen i menyn, ser ut såhär:

public void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Which animal do you want to play with?"; foreach (Animal animales in Animal_List) { } }

Får ett felmeddelande som säger att "The name Animal_List does not exist in the current context". Något tips på hur jag kan få tillgång till listan?

Permalänk
Medlem
Skrivet av PapaDiouf:

@Tea42BBS: Tack för info, haha förstår att du inte hänger med i frågan det gjorde inte ens jag när jag läste om den. Ställer lite frågor längs vägen istället så kanske det blir enklare. Just nu håller jag på med första knappen i menyn, ser ut såhär:

public void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Which animal do you want to play with?"; foreach (Animal animales in Animal_List) { } }

Får ett felmeddelande som säger att "The name Animal_List does not exist in the current context". Något tips på hur jag kan få tillgång till listan?

Sätt den till en privat instansvariabel i formens constructor.
Är verkligen PetOwner av typen Form1? Det säger du med ditt arv. Tror du fått det lite om bakfoten. Du ska sätta dina variabler där Form1 instansieras. Du kan däremot byta namn på Form1 till något mer passande om du vill, exempelvis PetOwnerForm.

Permalänk

@zaibuf: Fasiken nu tror jag att något trillade ner i skallen på mig, ska testa mig fram lite här under eftermiddagen, återkommer! Tack

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Fasiken nu tror jag att något trillade ner i skallen på mig, ska testa mig fram lite här under eftermiddagen, återkommer! Tack

Precis, du får se det som att Form är själva "main" klassen. Den instansieras då du öppnar formen, det kan vara första formen som visas i programmet eller en form som öppnas då du trycker på en knapp, t.ex. en pop-up.
Stänger du formen så dör alla variabler i den, som när ett kodblock tar slut eller när du sätter null värde till ett objekt.

I konstruktorn för Form1() kan du i samband med InitializeComponents instanciera det du behöver och sätta till fields. Dessa kommer att leva så länge formen är öppen och du kommer åt de i dina metoder. Metoderna kan vara vanliga metoder som du gjort i console applikationen, men även eventmetoder som du sätter på t.ex. knapptryck.

Permalänk
Medlem

@PapaDiouf: En annan sak att tänka på är att det får anses som dålig design att ha t.ex. Animal_List som publik variabel i Petowner. En stor grej med klasser är att de kan kapsla in data och tillhandahålla ett gränssnitt för att manipulera datan på ett kontrollerat sätt, så att man kan resonera kring hur datan kan förändras. Har man publika instansvariabler som vem som helst kan ändra på hur som helst så har man inte längre någon kontroll över datan som lagras.

Din Form-klass bör alltså ha en instans av Petowner som ansvarar för att lagra datan om djuren. Men istället för att Form-klassen t.ex. direkt loopar över Animal_List i Petowner-instansen när den vill ha en lista på djurens namn så borde Petowner-klassen ha en metod som returnerar en lista (eller sträng) med djurens namn som Form-klassen kan anropa. På samma sätt borde Petowner ha t.ex. en metod som klappar ett visst djur som Form-klassen kan anropa, o.s.v.

Permalänk

@zaibuf: Precis! Det slog mig när du skrev det, känns som att jag är på rätt väg nu iallafall. Ska försöka undvika att skicka så mycket kod men för enkelhetens skull så tänker jag att det är enklare för er att hänga med. Har fått till det så att jag kommer åt det jag vill komma åt. I första menyknappen som är Play vill jag att en lista med djuren samt en fråga om vilket djur man vill leka med dyker upp. I eventet för den knappen skriver jag ut texten samt loopar djuren i en foreach, dock får jag ett felmeddelande som jag inte riktigt vet hur jag ska lösa.
"Cannot implicity convert type 'PetownerForm1.Form1.Animal' to 'string'. (Notera att inte alla metoder osv är med än utan har endast lagt lite grund)
Tror jag har fetmarkerat koden jag undrar över, får se när jag skickar helt enkelt ^^

public partial class Form1 : Form { private List<Animal> Animal_List = new List<Animal>(); protected int age { get; set; } protected string name { get; set; } protected string fav_food { get; set; } protected string breed { get; set; } protected bool hungry { get; set; } public Form1() { InitializeComponent(); Animal_List.Add(new Cat("Misse", 4)); Animal_List.Add(new Dog("Zorro", 5)); Animal_List.Add(new Puppy("Zeus", 3)); } private void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Which animal do you want to play with?"; foreach (Animal animales in Animal_List) { textBox1.Text = animales; } } private void MenuButtonFeedAnimals_Click(object sender, EventArgs e) { } private void MenuButtonListAnimals_Click(object sender, EventArgs e) { } private void MenuButtonExitProgram_Click(object sender, EventArgs e) { } public class Petowner { public Petowner() { } } public abstract class Animal { public Animal(string name, int age) { } } public class Cat : Animal { public Cat(string name, int age) : base (name, age) { } } public class Dog : Animal { private int age { get; set; } private string name { get; set; } public Dog(string name, int age) : base (name, age) { Name = name; Age = age; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } } public class Puppy : Dog { public Puppy(string name, int age) : base ("", 3) { Name = name; Age = age; } } }

Permalänk

@perost: Det är helt rätt, har läst om det och så ska det såklart inte vara, höll på att mixtra lite för att se om jag kunde få till det på något sätt men det är åtgärdat, tack för input!

Permalänk
Medlem
Skrivet av Tea42BBS:

förstår inte riktigt frågan... men för textbox i forms

5. Newlines gör du med "\r\n" även i forms

Vis av erfarenhet vill jag rekommendera att istället ta för vana att använda

Environment.NewLine

Då detta tar hänsyn till vart man ska kör slutresultatet på.

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk
Medlem
Skrivet av ZecretW:

Vis av erfarenhet vill jag rekommendera att istället ta för vana att använda

Environment.NewLine

Då detta tar hänsyn till vart man ska kör slutresultatet på.

Du får ett äpple av läraren

jag är för lat för att skriva allt det där

// LZ

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Precis! Det slog mig när du skrev det, känns som att jag är på rätt väg nu iallafall. Ska försöka undvika att skicka så mycket kod men för enkelhetens skull så tänker jag att det är enklare för er att hänga med. Har fått till det så att jag kommer åt det jag vill komma åt. I första menyknappen som är Play vill jag att en lista med djuren samt en fråga om vilket djur man vill leka med dyker upp. I eventet för den knappen skriver jag ut texten samt loopar djuren i en foreach, dock får jag ett felmeddelande som jag inte riktigt vet hur jag ska lösa.
"Cannot implicity convert type 'PetownerForm1.Form1.Animal' to 'string'. (Notera att inte alla metoder osv är med än utan har endast lagt lite grund)
Tror jag har fetmarkerat koden jag undrar över, får se när jag skickar helt enkelt ^^

public partial class Form1 : Form { private List<Animal> Animal_List = new List<Animal>(); protected int age { get; set; } protected string name { get; set; } protected string fav_food { get; set; } protected string breed { get; set; } protected bool hungry { get; set; } public Form1() { InitializeComponent(); Animal_List.Add(new Cat("Misse", 4)); Animal_List.Add(new Dog("Zorro", 5)); Animal_List.Add(new Puppy("Zeus", 3)); } private void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Which animal do you want to play with?"; foreach (Animal animales in Animal_List) { textBox1.Text = animales; } } private void MenuButtonFeedAnimals_Click(object sender, EventArgs e) { } private void MenuButtonListAnimals_Click(object sender, EventArgs e) { } private void MenuButtonExitProgram_Click(object sender, EventArgs e) { } public class Petowner { public Petowner() { } } public abstract class Animal { public Animal(string name, int age) { } } public class Cat : Animal { public Cat(string name, int age) : base (name, age) { } } public class Dog : Animal { private int age { get; set; } private string name { get; set; } public Dog(string name, int age) : base (name, age) { Name = name; Age = age; } public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } } public class Puppy : Dog { public Puppy(string name, int age) : base ("", 3) { Name = name; Age = age; } } }

Precis som felmeddelandet säger så kan du inte konvertera ett objekt av typen Animal till en sträng.
Du vill förmodligen skriva ut namnen på djuren, animal.Name?

Permalänk

@zaibuf: Precis, det räcker med namn liksom. Får felmeddelandet att Form1.Animal does not contain a definition for 'name' när jag testar. Gaah blir galen. Otroligt frustrerande när man inte får det att fungera... :'D Hmm.. nånstans missar jag något.

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Precis, det räcker med namn liksom. Får felmeddelandet att Form1.Animal does not contain a definition for 'name' när jag testar. Gaah blir galen. Otroligt frustrerande när man inte får det att fungera... :'D Hmm.. nånstans missar jag något.

Om du kikar i din kod så har Animal ingen property för Name. Så ditt felmeddelande ger ju korrekt information.
Animal är abstract och tar in två parametrar i constructorn som i sin tur inte gör något, detsamma gäller Cat.
Det är bara Dog som har dessa properties. Så om du gör en explicit cast av Animal till en Dog kommer det att fungera specifikt för Dog-objekt. Däremot får du kika över koden och flytta dessa properties till basklassen Animal, då alla djur bör ha ett namn.

Passade även på att byta loop-variabelns namn till animal i singular, då varje iteration representerar ett djur inte "animales".

private void MenuButtonPlayWanimals_Click(object sender, EventArgs e) { textBox1.Text = "Which animal do you want to play with?"; foreach (Animal animal in Animal_List) { if(animal is Dog d) { textBox1.Text = d.Name; } } }

Har du lärt dig använda debuggern? Annars är det ett bra tillfälle att lära dig använda den och felsöka din kod.

Permalänk

@zaibuf: Ah! Sant, flyttade properties till basklassen istället. Nu händer det åtminstone något när jag klickar på Play knappen. Sitter och byter runt lite för att försöka förstå bättre hur det fungerar, när jag byter Dog till Cat i if satsen får jag fram kattens namn, detsamma gäller Puppy, när jag kör Dog nu får jag återigen fram puppy's namn bara. Har lagt till properties i Animal och Cat klassen.

public class Cat : Animal { public Cat(string name, int age) : base (name, age) { Name = name; Age = age; } } public class Dog : Animal { public Dog(string name, int age) : base (name, age) { Name = name; Age = age; } } public class Puppy : Dog { public Puppy(string name, int age) : base (name, age) { Name = name; Age = age; } }

Tyvärr inget förutom att jag vet vad det är och att det är ett jäkligt bra hjälpmedel, kommer sätta mig in i det mer så fort jag inte har så mycket tidspress.

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Ah! Sant, flyttade properties till basklassen istället. Nu händer det åtminstone något när jag klickar på Play knappen. Sitter och byter runt lite för att försöka förstå bättre hur det fungerar, när jag byter Dog till Cat i if satsen får jag fram kattens namn, detsamma gäller Puppy, när jag kör Dog nu får jag återigen fram puppy's namn bara. Har lagt till properties i Animal och Cat klassen.

public class Cat : Animal { public Cat(string name, int age) : base (name, age) { Name = name; Age = age; } } public class Dog : Animal { public Dog(string name, int age) : base (name, age) { Name = name; Age = age; } } public class Puppy : Dog { public Puppy(string name, int age) : base (name, age) { Name = name; Age = age; } }

Tyvärr inget förutom att jag vet vad det är och att det är ett jäkligt bra hjälpmedel, kommer sätta mig in i det mer så fort jag inte har så mycket tidspress.

Det är för att puppy ärver dog, så puppy är också en dog då du gör en cast. Vill du va specifik får du kolla om det är en puppy. Men om du flyttat allt till Animal så behöver du inte längre göra casting.

Du behöver inte sätta Name = name; i alla ärvda klasser, du gör det redan med anropet till base.

Debuggern är kortfattat: sätt en brytpunkt på raden du vill att programmet ska stanna på. Starta med F5, vänta tills det stannar. Sen kan du steppa en kodrad i taget med F10/F11 och även se värden på alla variabler.

Permalänk

@zaibuf: Ahh, såklart! Det är åtgärdat, nu kan jag se alla namnen när jag väljer djur. Nu kommer dock nästa problem som är att jag inte får till loopen, dels visas inte introtexten som är "Which animal would you like to play with" och så dyker enbart ett namn upp.
Försöker loopa dem såhär:

textBox1.Text = "Which animal do you want to play with?"; foreach(Animal animal in Animal_List) { textBox1.Text = animal.Name; }

Angående debuggern ska jag börja använda det mer och försöka lära mig det, är väl ett måste om jag ska slippa sitta här och fråga om allt xD

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Ahh, såklart! Det är åtgärdat, nu kan jag se alla namnen när jag väljer djur. Nu kommer dock nästa problem som är att jag inte får till loopen, dels visas inte introtexten som är "Which animal would you like to play with" och så dyker enbart ett namn upp.
Försöker loopa dem såhär:

textBox1.Text = "Which animal do you want to play with?"; foreach(Animal animal in Animal_List) { textBox1.Text = animal.Name; }

Angående debuggern ska jag börja använda det mer och försöka lära mig det, är väl ett måste om jag ska slippa sitta här och fråga om allt xD

Är det en textbox så får du appenda texten, nu skriver du bara över värdet vid varje iteration.
textBox1.AppendText(animal.Name);

Frågan kan du kanske ställa i en label ovanför textboxen?

Permalänk

@zaibuf: Ja det funkade ju utmärkt, tack för det. Körde även en label ovanför som dyker upp på knapptrycket, så när Play trycks loopas djuren samt att labeln syns. Ska nu hämta metoder från de olika djuren, som exempelvis en text från Cat classens metod Interact där en text skrivs ut om man nu väljer att leka med katten. I mitt tidigare konsolprogram är ju koden i Console.WriteLine, vill ju ändra den till textBox.Text, men när jag skapar en ny textBox kan jag inte nå den, tips på hur jag ska tänka här?

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Ja det funkade ju utmärkt, tack för det. Körde även en label ovanför som dyker upp på knapptrycket, så när Play trycks loopas djuren samt att labeln syns. Ska nu hämta metoder från de olika djuren, som exempelvis en text från Cat classens metod Interact där en text skrivs ut om man nu väljer att leka med katten. I mitt tidigare konsolprogram är ju koden i Console.WriteLine, vill ju ändra den till textBox.Text, men när jag skapar en ny textBox kan jag inte nå den, tips på hur jag ska tänka här?

Vad menar du med inte nå den? Är den i samma form kan du komma åt den. Är det i en ny form behöver du skicka med det valda djuret som parameter.

Permalänk

@zaibuf: Ska väl tillägga att jag inte vet hur jag når den bara, metoden Interact i Cat klassen ser ut såhär:

public override void Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { Console.Write("\n{0} is playing with Joppe. . .", Name); } if (interact == 1) { Console.Write("\n{0} is too hungry to play. . .", Name); } }

Texten vill jag ändra så att det går att skriva ut i textBox, för att sedan anropa den i en av mina buttons när någon vill leka med katten. Det är samma kod som tidigare i koden men jag har börjat lägga till metoder lite pö om pö för att jag inte ska få psykbryt när jag inte fattar, så denna metod kommer jag även att lägga till i Dog klassen och Puppy klassen men tänker att kan jag få till den här så bör jag kunna lösa resten själv. Jag försökte ändra till textBox1.Text osv men gissar på att det är fel väg att gå

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Ska väl tillägga att jag inte vet hur jag når den bara, metoden Interact i Cat klassen ser ut såhär:

public override void Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { Console.Write("\n{0} is playing with Joppe. . .", Name); } if (interact == 1) { Console.Write("\n{0} is too hungry to play. . .", Name); } }

Texten vill jag ändra så att det går att skriva ut i textBox, för att sedan anropa den i en av mina buttons när någon vill leka med katten. Det är samma kod som tidigare i koden men jag har börjat lägga till metoder lite pö om pö för att jag inte ska få psykbryt när jag inte fattar, så denna metod kommer jag även att lägga till i Dog klassen och Puppy klassen men tänker att kan jag få till den här så bör jag kunna lösa resten själv. Jag försökte ändra till textBox1.Text osv men gissar på att det är fel väg att gå

Istället för Console.WriteLine får metoden returera en sträng istället för void.
Så kan du i din form med valda djur,

TextBox1.Text = cat.Interact();

Vad är det för skillnad på interact mellan dog, cat och puppy? Om bara Name används så kan metoden lika gärna ligga i basklassen.

Permalänk

@zaibuf: Testade och det fungerar ish, jag får ut texten jag vill när jag trycker på knappen. Men har bara en känsla av att jag kanske kan göra det enklare, eller att det finns något småfel här(?):

public override string Interact() { string play = "Joppe is playing with Misse. . ."; string hungry = "Misse is too hungry to play. . ."; Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { return play; } if (interact == 1) { return hungry; } return play + hungry; }

Men får iallafall till det som jag tänker nu!

Permalänk
Medlem

@PapaDiouf: Random.Next(0, 2) kommer returnera antingen 0 eller 1, eftersom intervallet som slumptalet dras från exkluderar den övre gränsen. Din sista return är alltså död kod (kod som aldrig kommer köras) eftersom en av if-satserna alltid kommer matcha.

Jag antar att du faktiskt vill slumpa fram endast 0 eller 1, eftersom det verkar som att det är en "antingen eller"-situation. D.v.s. antingen är djuret för hungrigt för att leka, eller så leker "Joppe" med det. I så fall kan du förenkla allt efter den tredje raden i metoden till:

return rdmr.Next(0, 2) == 0 ? play : hungry;

Om du inte sett ?-operatorn tidigare så har den syntaxen villkor ? sant_uttryck : falskt_uttryck, och returnerar helt enkelt ett av uttrycken beroende på om villkoret är sant eller falskt. ?-operatorn bör användas med försiktighet eftersom koden lätt kan bli helt obegriplig om man t.ex. börjar nästla ?-uttryck, men används väldigt ofta när man vill returnera ett av två värden.

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Testade och det fungerar ish, jag får ut texten jag vill när jag trycker på knappen. Men har bara en känsla av att jag kanske kan göra det enklare, eller att det finns något småfel här(?):

public override string Interact() { string play = "Joppe is playing with Misse. . ."; string hungry = "Misse is too hungry to play. . ."; Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { return play; } if (interact == 1) { return hungry; } return play + hungry; }

Men får iallafall till det som jag tänker nu!

Fungerar det så fungerar det, refaktorera kan du göra senare (GEMO - Good enough move on) om du har tid.
Nedersta return kommer aldrig att exekvera, men det kanske inte är tanken heller? Jag hade nog skrivit det såhär.

public override string Interact() { string message = string.Empty; Random rdmr = new Random(); int interact = rdmr.Next(0, 2); if (interact == 0) { message = "Joppe is playing with Misse. . ."; } else { message = "Misse is too hungry to play. . ."; } return message; }

Det är för att jag föredrar att en metod endast har en return, blir enklare att läsa och jobba med.

Då du enbart har en return så kan du även förminska koden ytterligare med en turnary, vilket är perfekt om man bara har en if/else.

public override string Interact() { Random rdmr = new Random(); int interact = rdmr.Next(0, 2); return interact == 0 ? "Joppe is playing with Misse. . ." : "Misse is too hungry to play. . ."; }

Interact state hade jag också bytt ut från ints till Enums för tydlighet om vad siffrorna betyder, men det är överkurs just nu.

Permalänk

@perost: Har faktiskt inte kommit till ? operatorn än men den var ju sjukt smidig i detta fall, blir jäkligt lite kod och det passar mig som har en tendens att snurra till det med all kod! Precis den ska bara slumpa antingen eller, om Cat vill leka eller är för hungrig liksom, tack för det!

Permalänk

@zaibuf: Jag tog endast med den sista raden där med return play + hungry för att jag fick ett felmeddelande om jag inte hade den med, men när jag ser dina exempel blir det tydligt varför och jag föredrar också en return, vilket blir skitbra med båda exempel, ? operatorn har jag inte hört om innan men den var ju jäkligt smidig alltså, tack för hjälp! Nu tror jag att jag har hyfsad koll på hur jag ska lösa resten av metoderna också, ska åtminstone testa några timmar och se hur det går

Permalänk

Nu har jag suttit hela kvällen och är i princip helt färdig med själva programmet, tack för all hjälp det hade inte gått utan er!
Min absolut sista fråga kring den här uppgiften är, när man klickar runt på knapparna i menyn, säg exempelvis att man väljer Play with animals, då dyker en till ruta och knappar upp för att fortsätta där, men väljer man sedan knapp nummer två i menyraden så ligger allt från playtrycken kvar, finns det något sätt att rensa upp de gamla knapptrycken när man väljer ett nytt alternativ för att det nya skall kunna ses bättre? Exempelvis någon typ av Console.Clear eller något jag kan använda för att rensa upp lite.