Hjälp med en sista sak innan inlämning!

Permalänk

Hjälp med en sista sak innan inlämning!

Tjena! Ni har varit sjukt bra med all hjälp jag fått, utan att göra jobbet åt mig så har ni guidat mig i rätt riktning. Hoppas därför att det ska fungera lika bra denna gång. Jag gör programmering 2 på distans och har lite svårt att få den hjälp jag behöver. Därför kollar jag nu återigen in här.

Jag har gjort ett program för ett dartspel i C#, programmet är i princip helt klart men efter inlämning fick jag tillbaka att jag behöver komplettera med ytterligare en funktion som är att man ska kunna spela mot en dator. Har förstått att jag behöver använda mig av en randomerare, samt att när man skriver in "Dator" så ska poängen för denne slumpas fram utan inskrifter i programmet. Mitt problem är att jag inte får det att fungera då jag inte vet vad nästa steg är.
Endast såhär långt har jag kommit med denna funktion:

for (int i = 0; i < numberPlayers; i++) { Console.Write("Name of player " + (i + 1) + ": "); string playerName = Console.ReadLine(); AddPlayer(playerName); if (playerName == "Dator") { Random rdmr = new Random(); int dator = rdmr.Next(0, 21); } }

Permalänk
Medlem
Skrivet av PapaDiouf:

Tjena! Ni har varit sjukt bra med all hjälp jag fått, utan att göra jobbet åt mig så har ni guidat mig i rätt riktning. Hoppas därför att det ska fungera lika bra denna gång. Jag gör programmering 2 på distans och har lite svårt att få den hjälp jag behöver. Därför kollar jag nu återigen in här.

Jag har gjort ett program för ett dartspel i C#, programmet är i princip helt klart men efter inlämning fick jag tillbaka att jag behöver komplettera med ytterligare en funktion som är att man ska kunna spela mot en dator. Har förstått att jag behöver använda mig av en randomerare, samt att när man skriver in "Dator" så ska poängen för denne slumpas fram utan inskrifter i programmet. Mitt problem är att jag inte får det att fungera då jag inte vet vad nästa steg är.
Endast såhär långt har jag kommit med denna funktion:

for (int i = 0; i < numberPlayers; i++) { Console.Write("Name of player " + (i + 1) + ": "); string playerName = Console.ReadLine(); AddPlayer(playerName); if (playerName == "Dator") { Random rdmr = new Random(); int dator = rdmr.Next(0, 21); } }

Är tanken att poängen ska slumpas fram i metoden där du anger namn för din spelare?
Ska detta inte ske i själva metoden som sköter logiken för spelet? Jag vet inte hur ditt spel är uppbyggt eller hur reglerna för Dart är. Men min initiala känsla är att poängen för datorn ska slumpas per kast?

Det vill säga, spelaren gör sitt kast, poäng visas. Datorn gör sitt kast, poäng visas. Sen fortsätter det så tills att någon vinner?

Sen om 21 är högsta poängen man kan få så kommer det inte med i din Next.
Next returerar en range mellan lägsta och inte inklusive högsta, så antingen skriver du 0,22 eller (0,21) + 1. Återigen, jag kan inte reglerna i Dart eller hur poängen räknas, det kanske redan är något du tänkt på.

Sen kan jag tycka att man inte ska behöva skriva Dator för att få spela mot en dator, detta borde vara ett val i huvudmenyn då man startar spelet. Exempel:
1) Spela vs CPU
2) Spela vs Spelare

Lite likt hur det fungerar i majoriteten av spel.

Just nu är det även case sensetive, skriver man "dator" så kommer det skapa en spelare som heter dator utan att det slumpas fram någon poäng.

Permalänk

@zaibuf: Tjena! Poängen ska enbart slumpas för datorn, medans "riktiga" spelaren får skriva in sina poäng själv, vidarebefodrar koden nedan så kan du se hur det ser ut, för programmet är i princip klart redan jag behöver endast lägga till att man ska kunna spela mot datorn där datorns poäng ska slumpas fram men spelarens poäng skrivs in manuellt.
Så i princip vill jag väl ha koden som den är med undantaget att man ska kunna spela mot datorn, bra tips att man får välja 1.Spela vs CPU, det skulle man kunna utgå ifrån, sedan är jag osäker hur jag går till väga

class Program { static void Main(string[] args) { var MyGame = new Game(); MyGame.PlayGame(); } } class Game //Klassen Game { private List<Player> nameList = new List<Player>(); public void AddPlayer(string name) { Player players = new Player(name); // nameList.Add(players); } public void PlayGame()//Metod PlayGame { int arrow1; int arrow2; int arrow3; int total = 0; int winner = 301; Console.WriteLine("\n\nWelcome to Dart of the year!"); Console.Write("-------------------------------------"); Console.Write("\nSet the amount of players: "); int numberPlayers = int.Parse(Console.ReadLine()); for (int i = 0; i < numberPlayers; i++) { Console.Write("Name of player " + (i + 1) + ": "); string playerName = Console.ReadLine(); AddPlayer(playerName); } do { foreach (var player in nameList) { Console.WriteLine("\nIt is {0}'s turn. Type the score for your three darts, 0-20: ", player); arrow1 = int.Parse(Console.ReadLine()); if (arrow1 > 20 || arrow1 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow1; } arrow2 = int.Parse(Console.ReadLine()); if (arrow2 > 20 || arrow2 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow2; } arrow3 = int.Parse(Console.ReadLine()); if (arrow3 > 20 || arrow3 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow3; } player.AddThrows(arrow1, arrow2, arrow3); total = player.CalculatePoints(); } } while (total <= winner); foreach (var player in nameList) { player.PrintTurns(); } } class Player { private string name { get; set; } private List<Turns> throwList = new List<Turns>(); public Player(string _name) { name = _name; } private string Name { get; set; } public void AddThrows(int throw1, int throw2, int throw3) { throwList.Add(new Turns(throw1, throw2, throw3)); } public int CalculatePoints() { int score = 0; foreach (var turns in throwList) { score = score + turns.GetScore(); } return score; } public void PrintTurns() { Console.WriteLine("Stats for player: {0}", name); Console.WriteLine("----------------------------------------------"); foreach (var turns in throwList) { Console.WriteLine(turns); } Console.WriteLine("----------------------------------------------"); Console.WriteLine("Total score for player: {1} {0}\n", CalculatePoints(), name); Console.Write("\nWe have a winner!\n\n\n"); } public override string ToString() { return name; } } class Turns//Klassen Turns { private int throwOne; private int throwTwo; private int throwThree; public Turns(int throw1, int throw2, int throw3) { throwOne = throw1; throwTwo = throw2; throwThree = throw3; } public int GetScore() { int totalt = throwOne + throwTwo + throwThree; return totalt; } public override string ToString() { return string.Format("Dart one: {0}, Dart two: {1}, Dart three: {2} ", throwOne, throwTwo, throwThree); } } }

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Tjena! Poängen ska enbart slumpas för datorn, medans "riktiga" spelaren får skriva in sina poäng själv, vidarebefodrar koden nedan så kan du se hur det ser ut, för programmet är i princip klart redan jag behöver endast lägga till att man ska kunna spela mot datorn där datorns poäng ska slumpas fram men spelarens poäng skrivs in manuellt.
Så i princip vill jag väl ha koden som den är med undantaget att man ska kunna spela mot datorn, bra tips att man får välja 1.Spela vs CPU, det skulle man kunna utgå ifrån, sedan är jag osäker hur jag går till väga

class Program { static void Main(string[] args) { var MyGame = new Game(); MyGame.PlayGame(); } } class Game //Klassen Game { private List<Player> nameList = new List<Player>(); public void AddPlayer(string name) { Player players = new Player(name); // nameList.Add(players); } public void PlayGame()//Metod PlayGame { int arrow1; int arrow2; int arrow3; int total = 0; int winner = 301; Console.WriteLine("\n\nWelcome to Dart of the year!"); Console.Write("-------------------------------------"); Console.Write("\nSet the amount of players: "); int numberPlayers = int.Parse(Console.ReadLine()); for (int i = 0; i < numberPlayers; i++) { Console.Write("Name of player " + (i + 1) + ": "); string playerName = Console.ReadLine(); AddPlayer(playerName); } do { foreach (var player in nameList) { Console.WriteLine("\nIt is {0}'s turn. Type the score for your three darts, 0-20: ", player); arrow1 = int.Parse(Console.ReadLine()); if (arrow1 > 20 || arrow1 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow1; } arrow2 = int.Parse(Console.ReadLine()); if (arrow2 > 20 || arrow2 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow2; } arrow3 = int.Parse(Console.ReadLine()); if (arrow3 > 20 || arrow3 < 0) { Console.WriteLine("Only numbers between 0-20: "); --arrow3; } player.AddThrows(arrow1, arrow2, arrow3); total = player.CalculatePoints(); } } while (total <= winner); foreach (var player in nameList) { player.PrintTurns(); } } class Player { private string name { get; set; } private List<Turns> throwList = new List<Turns>(); public Player(string _name) { name = _name; } private string Name { get; set; } public void AddThrows(int throw1, int throw2, int throw3) { throwList.Add(new Turns(throw1, throw2, throw3)); } public int CalculatePoints() { int score = 0; foreach (var turns in throwList) { score = score + turns.GetScore(); } return score; } public void PrintTurns() { Console.WriteLine("Stats for player: {0}", name); Console.WriteLine("----------------------------------------------"); foreach (var turns in throwList) { Console.WriteLine(turns); } Console.WriteLine("----------------------------------------------"); Console.WriteLine("Total score for player: {1} {0}\n", CalculatePoints(), name); Console.Write("\nWe have a winner!\n\n\n"); } public override string ToString() { return name; } } class Turns//Klassen Turns { private int throwOne; private int throwTwo; private int throwThree; public Turns(int throw1, int throw2, int throw3) { throwOne = throw1; throwTwo = throw2; throwThree = throw3; } public int GetScore() { int totalt = throwOne + throwTwo + throwThree; return totalt; } public override string ToString() { return string.Format("Dart one: {0}, Dart two: {1}, Dart three: {2} ", throwOne, throwTwo, throwThree); } } }

Du har ju redan en Player klass, är väl bara att återanvända den för datorn fast datorns kast slumpas medan dina anges manuellt?
Känns lite flummigt att få ange poängen manuellt dock, kan man ju ge sig själv maxpoäng hela tiden

Jag hade nog gjort såhär. Där du loopar dina spelare och de kastar pilarna, flytta in den logiken till en metod på player.

foreach(var player in nameList) { player.ThrowDart(); }

Sedan i ThrowDart kan du ha en kontroll om spelaren är en Dator eller en spelare.
IF Dator Random.Next(0,21)
ELSE Ange ditt kast

Permalänk

@zaibuf: Haha jag håller med, dock följer jag bara arbetsbeskrivningen xD Nu har jag som sagt missat att få med datorn vilket tydligen är ett måste för att få betyg på uppgiften, har suttit ett tag med detta så just nu känns allt bara helt konstigt i huvet, programmet gick ju bra att skriva men nu står det bara tvärstill i skallen.. zzz

1. Man börjar med att lägga till alla spelare som ska vara med genom att ange deras namn.
2. Spelarna kastar i tur och ordning. När det är en spelares tur att kasta står hans namn på
skärmen.
3. Spelaren kastar 3 pilar som kan ge 0-20 poäng per pil. (max 60p per runda) Varje kast läggs
manuellt in i datorn förutom om Dator spelar.
4. Därefter är det nästa spelares tur.
5. Den spelare vars totala summa på alla kast är över 301 poäng först vinner.

Permalänk
Medlem
Skrivet av PapaDiouf:

@zaibuf: Haha jag håller med, dock följer jag bara arbetsbeskrivningen xD Nu har jag som sagt missat att få med datorn vilket tydligen är ett måste för att få betyg på uppgiften, har suttit ett tag med detta så just nu känns allt bara helt konstigt i huvet, programmet gick ju bra att skriva men nu står det bara tvärstill i skallen.. zzz

1. Man börjar med att lägga till alla spelare som ska vara med genom att ange deras namn.
2. Spelarna kastar i tur och ordning. När det är en spelares tur att kasta står hans namn på
skärmen.
3. Spelaren kastar 3 pilar som kan ge 0-20 poäng per pil. (max 60p per runda) Varje kast läggs
manuellt in i datorn förutom om Dator spelar.
4. Därefter är det nästa spelares tur.
5. Den spelare vars totala summa på alla kast är över 301 poäng först vinner.

Ja precis, så datorn får slumpat 3 gånger, 1 per kast. Så turas ni om varannan gång att kasta tills att någon når över 301.
Så det är bara att göra som jag skrev ovan, du håller ju redan track på spelarens score i Player klassen. Så då är det bara att flytta in kast-logiken dit också och låta datorn använda samma men datorns slumpas.

Typ något åt det här hållet

//... class Player public void ThrowDarts() { int arrow1; int arrow2; int arrow3; if(_name == "Dator") { // arrow 1 = random next // ... } else { // Gör som du gör i Main } // Lägg till i listan etc. }

Permalänk

@zaibuf: Snyggt, testar lite här, tack för hjälp!

Permalänk

@PapaDiouf: Tjena igen grabbar och tjejer! Har ett färdigt program som jag behöver lite sista hjälp med, har en loop där jag slumpar fram lite tal, problemet är att loopen går ju så fort så alla talen blir samma, hade behövt sega ner loopen lite, har sett att man kan använda System.Threading.Threading(); någonting, mina försök ger dock inte rätt utfall ändå. Något tips?

do foreach//Dessa looparna ligger i koden ifall det hjälper if (playerName == "Dator") { Random dator = new Random(); int slumptal = dator.Next(0, 21); Console.WriteLine("\nDator's score is: "); arrow1 = slumptal; arrow2 = slumptal; arrow3 = slumptal; Console.WriteLine(arrow1 + ", " + arrow2 + ", " + arrow3); Console.WriteLine("\nIt is players turn, score for three darts: "); arrow1 = int.Parse(Console.ReadLine()); arrow2 = int.Parse(Console.ReadLine()); arrow3 = int.Parse(Console.ReadLine()); player.AddThrows(arrow1, arrow2, arrow3); total = player.CalculatePoints(); }

Permalänk
Medlem

@PapaDiouf:
Pröva detta, siffrorna inom parentes är tiden i ms, så 1000ms == 1 sekund

using System.Threading; .. .. foreach (var item in collection) { Thread.Sleep(1000); }

Dold text
Läste fel
Visa signatur

AMD Ryzen 7 7800X3D • ASUS TUF Gaming B650-Plus WiFi • Noctua NH-D15
XFX Radeon RX 6950 XT Speedster MERC 319 • MSI Optix MAG271CQR • Dell UltraSharp U2515H
G.Skill 32GB DDR5 6000MHz CL30 • WD Black SN750 NVMe SSD 1 TB • Crucial P3 Plus NVMe SSD 1 TB
Phanteks P600S • ASUS TUF Gaming 850W Gold • Logitech Craft Keyboard • Logitech MX Master 3

Permalänk
Medlem

@PapaDiouf: Är det inte bättre att använda Random rätt istället? Random är en pseudo-slumpgenerator, vilket innebär att den använder en algoritm för att räkna fram tal som ser slumpmässiga ut. För att starta den processen används ett slumpfrö, i det här fallet systemklockan.

Om du skapar flera Random-instanser inom en kort tid så kommer alla få samma slumpfrö och ge samma följd av tal, eftersom klockan har en begränsad upplösning. Lösningen är att skapa en enda Random-instans utanför loopen och använda den inne i loopen, istället för att skapa en ny instans i varje iteration.

Permalänk
Medlem

@perost: Bra poäng där, jag läste frågan för fort o tolkade det som att han ville att programmet skulle gå lite långsammare mellan kasten.
@PapaDiouf: Bortse från mitt tidigare svar...

Visa signatur

AMD Ryzen 7 7800X3D • ASUS TUF Gaming B650-Plus WiFi • Noctua NH-D15
XFX Radeon RX 6950 XT Speedster MERC 319 • MSI Optix MAG271CQR • Dell UltraSharp U2515H
G.Skill 32GB DDR5 6000MHz CL30 • WD Black SN750 NVMe SSD 1 TB • Crucial P3 Plus NVMe SSD 1 TB
Phanteks P600S • ASUS TUF Gaming 850W Gold • Logitech Craft Keyboard • Logitech MX Master 3

Permalänk

@perost: Ibland är jag som loopen, lite väl snabb, att be om råd innan jag testat allt, men såg det inte förrän direkt efter att det blev fel med Random, det är iallafall åtgärdat och kan nu titulera mig som färdig med programmering 2, till väldigt stor del tack vare er med alla bra och hjälpsamma svar utan att skriva ut svaren, uppskattas för en som försöker lära sig detta, hands down!!