Lägga till datorspelare till Dartspelet

Permalänk

Lägga till datorspelare till Dartspelet

Hej

Jag håller på med dart-spelet som flera andra har postat om.
Hade missat att en npc/dator-player skulle vara med (trodde det var ett alternativ för högre betyg).
Är komplett nybörjare och behöver tips om hur jag ska lägga till datorn på enklast vis, gissar att datorn skall in under class Player?

(Använder Virtual Basic och gjorde classer ute till höger, om in klippningen nedan skulle bli helt galen)

namespace Dart_v4 { class Game { private readonly List<Player> nameList = new List<Player>(); public void AddPlayer(string name) { Player players = new Player(name); nameList.Add(players); } public void PlayGame() { int[] darts = new int[3]; bool hasWinner = false; int numberPlayers = 0; int totalScore = 0; int winningScore = 65; Console.WriteLine("\nWelcome to Dart by Winlöf!"); Console.Write("-------------------------------------"); Console.Write("\nHow many players are you? : "); try { numberPlayers = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Only numbers"); throw; } 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) { for (int i = 0; i < darts.Length; i++) { int dart = 0; Console.WriteLine("\nIt is {0}'s turn. Type the score for dart number {1}, score between 0-20: ", player, i+1); try { dart = int.Parse(Console.ReadLine()); if (player.checkDart(dart)) { darts[i] = dart; } else { i--; Console.WriteLine("Only numbers between 0-20"); } } catch (Exception) { i--; Console.WriteLine("Only numbers between 0-20"); } } player.Add_turn(darts[0], darts[1], darts[2]); totalScore = player.CalculatePoints(); if (totalScore >= winningScore) { hasWinner = true; break; } player.PrintTurns(); } } while (!hasWinner); Console.Write("\nWe have a winner!\n\n\n"); foreach (var player in nameList) { player.PrintTurns(); } } } } { class Player { private string name { get; set; } private List<Turns> dartList = new List<Turns>(); public Player(string _name) { name = _name; } public void Add_turn(int _dartOne, int _dartTwo, int _dartThree) { dartList.Add(new Turns(_dartOne, _dartTwo, _dartThree)); } public bool checkDart(int dart) { return dart <= 20 && dart >= 0; } public int CalculatePoints() { int score = 0; foreach (var turns in dartList) { score += turns.GetScore(); } return score; } public void PrintTurns() { Console.WriteLine("Stats for player: {0}", name); Console.WriteLine("----------------------------------------------"); foreach (var turns in dartList) { Console.WriteLine(turns); } Console.WriteLine("----------------------------------------------"); Console.WriteLine("Total score for player: {1} {0}\n", CalculatePoints(), name); } public override string ToString() { return name; } } } { class Program { static void Main(string[] args) { var MyGame = new Game(); try { MyGame.PlayGame(); } catch (Exception) { Main(args); } Console.WriteLine("Press any key continue.."); Console.ReadKey(); } } } { class Turns { private int dartOne; private int dartTwo; private int dartThree; public Turns(int _dartOne, int _dartTwo, int _dartThree) { dartOne = _dartOne; dartTwo = _dartTwo; dartThree = _dartThree; } public int GetScore() { return dartOne + dartTwo + dartThree; } public override string ToString() { return string.Format("Dart one: {0}, Dart two: {1}, Dart three: {2} ", dartOne, dartTwo, dartThree); } } }

Permalänk
Medlem

Vad gör en datorspelare? Får den ett slumpmässigt antal poäng varje runda?

Permalänk
Skrivet av lydell:

Vad gör en datorspelare? Får den ett slumpmässigt antal poäng varje runda?

Sorry, ibland glömmer man bort att uppdragsbeskrivningen inte är tillgänglig för alla
Varje spelare skriver manuellt in sina poäng, en pil i taget, totalt 3st per runda/turn.
Datorn ska alltså kasta tre pilar en i sänder, med en poäng mellan 0-20 varje gång.

Räkna ihop total poäng och liknande borde nuvarande metoder kunna användas för.

Random rnd = new Random(); int dart = rnd.Next(0, 21);

Blir koden för varje pil.
Men vad är det jag behöver lägga till för funktion, för att skapa spelaren och låta den göra det här före eller efter att man skrivit in spelarnas siffror manuellt?

Permalänk
Medlem

Jag skulle testa att skapa datorspelaren i början av PlayGame: Player bot = new Player("DartBot 9000");.

Efter din foreach (var player in nameList)-loop skulle jag printa att det är datorspelarens tur och anropa player.Add_turn med 3 random-scores (som du visade hur man slumpar fram).

Jag skulle flytta ut logiken för att kolla om någon har vunnit till efter att datorspelaren har gjort sitt. Då får alla spelare en chans att göra klart rundan och slåss om andraplatsen. När du flyttar och ändrar på vinst-logiken kan du passa på att lägga in att kontrollera bot:s poäng också.

Alternativt kan du testa att lägga in din bot i nameList. Då behöver du något sätt att kunna se skillnad på en mänsklig spelare och en datorspelare (du kan till exempel göra en Bot-klass som ärver från Player, eller lägga till någon flagga på Player). I for (int i = 0; i < darts.Length; i++)-loopen får du då behålla nuvarande beteende (prompta efter ett tal) för mänskliga spelare, och lägga till att istället skapa ett slumpmässigt tal för datorspelare. Den här approachen låter dig ha fler än en datorspelare om du vill på ett smidigt sätt.

Permalänk
Skrivet av lydell:

Jag skulle testa att skapa datorspelaren i början av PlayGame: Player bot = new Player("DartBot 9000");.

Efter din foreach (var player in nameList)-loop skulle jag printa att det är datorspelarens tur och anropa player.Add_turn med 3 random-scores (som du visade hur man slumpar fram).

Jag skulle flytta ut logiken för att kolla om någon har vunnit till efter att datorspelaren har gjort sitt. Då får alla spelare en chans att göra klart rundan och slåss om andraplatsen. När du flyttar och ändrar på vinst-logiken kan du passa på att lägga in att kontrollera bot:s poäng också.

Alternativt kan du testa att lägga in din bot i nameList. Då behöver du något sätt att kunna se skillnad på en mänsklig spelare och en datorspelare (du kan till exempel göra en Bot-klass som ärver från Player, eller lägga till någon flagga på Player). I for (int i = 0; i < darts.Length; i++)-loopen får du då behålla nuvarande beteende (prompta efter ett tal) för mänskliga spelare, och lägga till att istället skapa ett slumpmässigt tal för datorspelare. Den här approachen låter dig ha fler än en datorspelare om du vill på ett smidigt sätt.

Logiken ska vara som den är efter hur jag förstått det. Därför scoren kollas efter varje player istället för efter varje turn.

PlayGame[/cmd]: [cmd]Player bot = new Player("DartBot 9000");

.
Det gör att jag får en extra spelare varje gång med tex namnet Dartbot.
Men hur menar du i foreach loopen? Du får gärna förklara som om jag helt rudis (det är inte så långt ifrån sanningen).

En NPC behöver skapas, den behöver kasta sin tre pilar med random resultat varje turn.
Men står helt stil om hur jag ska få in den i koden?
Funderat på att lägga in den via nameList som du skriver, men då vet jag inte hur jag ska skriva för att få programmet att NPC är en dator och dennes pilar ska kastas per automatik och inte följa vanliga loppen?
Någon form av regel i början av loopen eftersom jag vet vad den playern heter?
(I teorin skulle den buga ur om någon döper sin spelare till exakt samma namn)

Permalänk
Medlem

Jag vet inte hur jag ska förklara det bättre. Kanske någon annan på forumet kan hjälpa till.

Permalänk
Medlem

Jag sökte på ”Dart” i forumet nu. Övriga trådar har inte samma kod som du. Så jag utgår ifrån att det ingår i uppgiften att skriva koden från scratch.

Skrivet av Inter_1908:

Du får gärna förklara som om jag helt rudis (det är inte så långt ifrån sanningen).

Koden är lite för bra för att vara skriven av en helt nybörjare, tycker jag. Vad är sanningen?