Trädvy Permalänk
Medlem
Registrerad
Nov 2017

C++ Skriva ut en vinnare

Hej!

Jag har en uppgift där man ska skapa ett spel med två spelare, koden ska generera ett random nummer och varje omgång ska en spelare ta en eller två stickor. Vinnaren blir den som tar den sista stickan. Det problemet jag står inför nu är att jag inte vet hur jag ska skriva ut vinnarens namn i slutet av koden.

Jag har en spelare1 och spelare2 men hur gör jag för att skapa en vinnare och spara den i en variabel som jag sedan kan skriva ut?

Är tacksam för all hjälp kan få!

Tack i förväg!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Apr 2008

@BlackCookie: Vad är det som du behöver hjälp med? Att förstå vem som vann, att ta in/skriva ut namn på vinnare? Jag tror du behöver posta din kod.

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@lntg: Förlåt, jag kanske va lite otydlig. Men det är att ta in och skriva ut namnet på vinnaren. Jag har en kod som funkar som den ska, förutom då att den inte skriver ut namnet på vinnaren.

Här är min kod:

do{ if(currentPlayer == playerOne) //spelare ett-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << "How many matches do you want to take, " << playerOne << ", 1 or 2? "; std::cin >> remaining; matches = matches - remaining; std::cout << "Now there are " << matches << " matches remaining. "; system ("PAUSE"); //spelare måste trycka på en tangent för att fortsätta system("CLS"); currentPlayer = playerTwo; } else if(currentPlayer == playerTwo) //spelare två-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << playerTwo << ", how many do you want to take? 1 or 2? "; std::cin >> remaining; matches = matches - remaining; system ("PAUSE"); system("CLS"); currentPlayer = playerOne; } }while(matches >= 1); //när det är mer än eller lika med 1 så kommer loopen att fortsätta std::cout << "Congratulations, " << //sätt in vinnarens namn??? HUR? << "you won!" << flush; system ("PAUSE"); return 0; }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@BlackCookie: Jag antar att currentPlayer är en sträng? Fundera i så fall på vilken spelares namn den variabeln kommer innehålla efter att spelet är över, och vad du behöver göra för att se till att variabeln innehåller vinnarens namn.

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@perost: om man sätter dit currentplayer i avslutet, så nämner den nästa spelaren som vinnare istället för den som tar den/dom sista stickorna. Hur ska man få den rätta vinnaren att skrivas ut?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2006

Gör en if sats vid "currentPlayer = playerOne;" som kollar; if matches>0
Är det mindre än 1 så behöver den inte byta spelare

EDIT:: Samma sak i 2a loopen

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av BlackCookie:

@perost: om man sätter dit currentplayer i avslutet, så nämner den nästa spelaren som vinnare istället för den som tar den/dom sista stickorna.

Ja, men vem är egentligen nästa spelare i det läget?

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@perost: t.ex. om spelare1 tar dom två sista stickorna är det spelare1 som ska anses som vinnare men som koden är nu säger den att i detta läget då, att spelare2 är vinnaren.

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@Quelor: Menar du såhär med if-satsen?

if(currentPlayer == playerOne) //spelare ett-loop { if(matches > 0) { currentPlayer = playerOne; }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2011

@BlackCookie om stickorna är fler än 0 vill du ju byta spelare

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Okt 2004

Nu kan jag inte programmeringsbiten, men logiken är det som intresserar mig.

Och borde det inte att gå att skriva som om det är spelare x:s tur och det är 1 sticka kvar så har ju spelare Y, vunnit?

för den som drar sista stickan förlorar?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av BlackCookie:

@perost: t.ex. om spelare1 tar dom två sista stickorna är det spelare1 som ska anses som vinnare men som koden är nu säger den att i detta läget då, att spelare2 är vinnaren.

Ja, vad jag var ute efter är att currentPlayer alltid kommer innehålla förlorarens namn efter att loopen avslutats. Så det finns massor av sätt du kan lösa problemet på, t.ex. kan du helt enkelt byta spelare en gång till innan du skriver ut vem som vann så att currentPlayer innehåller vinnaren istället.

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@Bonden_88: Det är den som drar den sista stickan som vinner.
Ex.
Det finns 2 stickor kvar
Spelare1, vill du ta 1 eller 2 stickor? 2
Spelare1 vann!

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Apr 2009

Jag drog ihop detta spel lite snabbt fast i C#. Jag körde på din variant av det förutom att jag valde do-while(matches > 0).

Det betyder alltså att den sista spelaren behöver spela ut spelet och göra det förlorande draget istället för att det sker automatiskt. När förloraren har spelat färdigt så kommer currentPlayer bytas till vinnaren (precis enligt din kod).

Det betyder att currentPlayer alltid kommer vara vinnaren (så långt har jag hunnit tänka iaf).

Edit: My god, jag trodde den som drog sista stickan förlorade, haha! =D

Hur som helst, då kommer det att resultera i att currentPlayer alltid är förloraren istället. Ett snabbt sätt att fixa det är att bara byta currentPlayer till den andre.

Chassi: Fractal Design Define R3, Titanium CPU: Intel Core i7 7700K 4.8 GHz
MoBo: Gigabyte GA-Z270-Gaming K3 GPU: EVGA GTX 970 4 GB
RAM: Corsair LPX 16GB CL15 3000Mhz VENGEANCE SSD: Samsung 750 EVO 500GB
HDD: 500GB Seagate Barracuda 7200rpm PSU: LEPA B1000-MB

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@perost: Hur byter jag spelare? Har provat att använda en if-sats till där jag byter men det funkar inte, antingen gör den samma som innan och utser fel vinnare eller så loopar spelare1 hela tiden istället för att gå vidare till nästa spelare.

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@L.Forsgren: För att byta, menar du då genom ytterligare loop, där om (currenPlayer == playerOne) byter till currentPlayer = playerTwo och tvärtom?

Trädvy Permalänk
Medlem
Registrerad
Nov 2017

@casperj_94:

else if(currentPlayer == playerTwo) //spelare två-loop { if(matches > 0) { currentPlayer = playerOne; }

Detta gör exakt samma som innan, är det något fel på loopen?

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Apr 2009
Skrivet av BlackCookie:

@L.Forsgren: För att byta, menar du då genom ytterligare loop, där om (currenPlayer == playerOne) byter till currentPlayer = playerTwo och tvärtom?

Ja, det löser ditt problem. Sedan om det är snyggt eller inte är en annan sak.

Chassi: Fractal Design Define R3, Titanium CPU: Intel Core i7 7700K 4.8 GHz
MoBo: Gigabyte GA-Z270-Gaming K3 GPU: EVGA GTX 970 4 GB
RAM: Corsair LPX 16GB CL15 3000Mhz VENGEANCE SSD: Samsung 750 EVO 500GB
HDD: 500GB Seagate Barracuda 7200rpm PSU: LEPA B1000-MB

Trädvy Permalänk
Medlem
Plats
/dev/null
Registrerad
Aug 2008

Då de två if-satserna är nästintill identiska så kan/bör du skriva koden så att skillnaderna förs in via variabler. Kodduplicering bör i möjligaste mån undvikas.

if(currentPlayer == playerOne) //spelare ett-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << "How many matches do you want to take, " << playerOne << ", 1 or 2? "; std::cin >> remaining; matches = matches - remaining; std::cout << "Now there are " << matches << " matches remaining. "; system ("PAUSE"); //spelare måste trycka på en tangent för att fortsätta system("CLS"); currentPlayer = playerTwo; } else if(currentPlayer == playerTwo) //spelare två-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << playerTwo << ", how many do you want to take? 1 or 2? "; std::cin >> remaining; matches = matches - remaining; system ("PAUSE"); system("CLS"); currentPlayer = playerOne; }

skrivs med fördel som

std::cout << "There are " << matches << " to choose from." << '\n'; // Använd currentPlayer, inte playerOne/playerTwo på nästa rad std::cout << "How many matches do you want to take, " << currentPlayer << ", 1 or 2? "; std::cin >> remaining; matches = matches - remaining; std::cout << "Now there are " << matches << " matches remaining. "; system ("PAUSE"); //spelare måste trycka på en tangent för att fortsätta system("CLS"); // Byt spelare vid draget if(currentPlayer == playerOne) { currentPlayer = playerTwo; } else { currentPlayer = playerOne; }

NUC: Intel i5-4250U | 8GB RAM | 250GB SSD
Laptop: MacBook Air 13"

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av PeCe:

Då de två if-satserna är nästintill identiska så kan/bör du skriva koden så att skillnaderna förs in via variabler. Kodduplicering bör i möjligaste mån undvikas.

if(currentPlayer == playerOne) //spelare ett-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << "How many matches do you want to take, " << playerOne << ", 1 or 2? "; std::cin >> remaining; matches = matches - remaining; std::cout << "Now there are " << matches << " matches remaining. "; system ("PAUSE"); //spelare måste trycka på en tangent för att fortsätta system("CLS"); currentPlayer = playerTwo; } else if(currentPlayer == playerTwo) //spelare två-loop { std::cout << "There are " << matches << " to chose from." << '\n'; std::cout << playerTwo << ", how many do you want to take? 1 or 2? "; std::cin >> remaining; matches = matches - remaining; system ("PAUSE"); system("CLS"); currentPlayer = playerOne; }

skrivs med fördel som

std::cout << "There are " << matches << " to choose from." << '\n'; // Använd currentPlayer, inte playerOne/playerTwo på nästa rad std::cout << "How many matches do you want to take, " << currentPlayer << ", 1 or 2? "; std::cin >> remaining; matches = matches - remaining; std::cout << "Now there are " << matches << " matches remaining. "; system ("PAUSE"); //spelare måste trycka på en tangent för att fortsätta system("CLS"); // Byt spelare vid draget if(currentPlayer == playerOne) { currentPlayer = playerTwo; } else { currentPlayer = playerOne; }

Bra att du belyser det! @BlackCookie kan med fördel läsa mer om DRY.

Skrivet med hjälp av Better SweClockers