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!!
- Idag Sony stoppar även Ghost of Tsushima i länder utan PSN 56
- Igår Microsofts spelbutik för mobiler lanseras i sommar 9
- 11 / 5 Windows skärmdumpverktyg får QR‑kodläsare 4
- 11 / 5 Microsoft jobbar på ny widget-funktion i Start‑menyn 27
- 10 / 5 "Långsiktighet" är orsaken till Microsofts nedskärningar 24
- Högerbenet avlider vid körning.32
- Plats för lite gubbgnäll9872
- Windows tappar bort drivrutin till sound blaster Z vid utdragande eller återinsättande av hörlurskontakt4
- Elbilar - Tråden för intresserade23282
- Snabbkoll: Har du Windows installerat på SSD eller HDD?93
- Dubblerad batteritid för laptops med Snapdragon X-processor21
- Fanboy-quiz: Vad kan du om Sega?82
- Speldator MAX 14k med Intel processor?8
- Köpråd 5.1 ljudsystem tv/dator13
- FjällClockers140
- Säljes Skärm Samsung G9 49"
- Säljes Möss och tangentbord + diverse
- Säljes Steelseries Arena 7
- Säljes ASUS ROG STRIX GeForce GTX 1080 Ti 11GB Gaming OC, 2st Apple Airport timecapsule gen3, Nedis Dockningstation USB-C
- Säljes Rigg för ratt och skärm
- Säljes Steam Deck LCD 256GB + docka
- Säljes Samsung 980 PRO M.2 NVMe SSD 1TB Med Värmespridare
- Skänkes Låda gammalt gott och blandat
- Skänkes Rampage IV Black + i7 3960x
- Säljes Intel Core i7 12700K 3.6 GHz 25MB
- Dubblerad batteritid för laptops med Snapdragon X-processor21
- Google gör det svårare att radera lösenord av misstag4
- 3 miljoner i Norden delar streamingkonton31
- Snabbkoll: Har du Windows installerat på SSD eller HDD?93
- Forskare: AI-kloner av döda människor måste regleras29
- Sony stoppar även Ghost of Tsushima i länder utan PSN56
- Läcka: RDNA 5 ”helt ny arkitektur”72
- Asus ville ha 30 000 för trasig kontakt på 409074
- Hemmabygge slår samman 256 RISC‑V‑kretsar22
- Microsofts spelbutik för mobiler lanseras i sommar9
Externa nyheter
Spelnyheter från FZ
- Glöm Assassin's Creed Red – det heter Assassin's Creed Shadows idag
- 95 % Cyberpunk 2077-positiva på Steam senaste tiden: "Tack för den andra chansen" idag
- EA överväger reklam i spel idag
- Square Enix AAA-satsar "aggressivt" på fler plattformar framöver idag
- Hi-Fi Rush kärleksbombas på Steam efter nedläggningsbeskedet idag