EndeavourOS: Your Search for Best Arch Distro Ends Here
7800X3D » RX6950XT » G.SKILL 32GB
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);
}
}
Ä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.
@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);
}
}
}
@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
@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.
@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.
}
@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();
}
@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);
}
@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.
@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...
EndeavourOS: Your Search for Best Arch Distro Ends Here
7800X3D » RX6950XT » G.SKILL 32GB
@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!!
- Igår AMD lanserar prisbantade AM5-processorer utan grafikdel 16
- 13 / 5 Dubblerad batteritid för laptops med Snapdragon X-processor 37
- 13 / 5 Läcka: RDNA 5 ”helt ny arkitektur” 108
- 12 / 5 Asus ville ha 30 000 för trasig kontakt på 4090 77
- 11 / 5 Fullproppat uppdateringspaket på gång till Steam Deck 21
- Igår Nordiska TV-branschen enas i kampanj mot olagliga tv-tjänster 126
- Igår Så ska bankerna ta hårdare tag mot bedragare 39
- 13 / 5 Google gör det svårare att radera lösenord av misstag 4
- 13 / 5 3 miljoner användare delar streamingkonton i Norden 36
- 13 / 5 Snabbkoll: Har du Windows installerat på SSD eller HDD? 114
- Automatisera IKEAs MITTLED i köket med HA2
- Dagens fynd (bara tips, ingen diskussion) — Läs första inlägget först!18497
- 1080p Gaming Dator 12-13k budget0
- Asus 2080ti - Dålig kylning0
- Hur formatera (Ubuntu)USB-minne i Ubuntu?19
- Streaming tjänst2
- Framtidssäker gamingdator för WoW Classic4
- Google I/O 202430
- Krönika: Hur mycket får ett spel kosta?116
- Ge bort spelnycklar! (Läs trådreglerna först!)4078
- Köpes S22 ultra möjligtvis S23 ultra
- Säljes Fightbox arcade hitbox controller
- Köpes Elsparkcykel köpes/skänkes
- Säljes 12900k+DDR5 uppgraderingspaket
- Säljes Projektor Epson 9300 och 108” motordriven
- Säljes Ghost S1, L12 ghost + noctua fläktar
- Säljes Ryzen 3800x och Sapphire Rx5700xt Nitro+ Oc Special Edition
- Säljes ASUS ROG Strix Helios Midi Tower
- Säljes Nvidia 3080 KFA2
- Säljes GeForce RTX 3090 Founders Edition
- AMD lanserar prisbantade AM5-processorer utan grafikdel16
- Nordiska TV-branschen enas i kampanj mot olagliga tv-tjänster126
- Så ska bankerna ta hårdare tag mot bedragare39
- Nu kan du spela N64-spel med ray tracing22
- Microsoft börjar göra reklam för Game Pass i Windows27
- Utvecklare kör Windows 11 på Nintendo Switch8
- Dubblerad batteritid för laptops med Snapdragon X-processor37
- Google gör det svårare att radera lösenord av misstag4
- 3 miljoner användare delar streamingkonton i Norden36
- Snabbkoll: Har du Windows installerat på SSD eller HDD?114
Externa nyheter
Spelnyheter från FZ
- Rykte: Assassin's Creed Shadows släpps 15 november igår
- Remake av Resident Evil-remake ryktas vara på gång igår
- Epic bötfällda för Fortnite-försäljning riktad till barn igår
- Hades 2-patch påbörjad – resursjakt och rörelser trimmas igår
- PS5-försäljningen krymper – men Helldivers 2 slår säljrekord på PS5 igår