Permalänk

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!

Permalänk
Medlem

@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.

Permalänk

@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; }

Permalänk
Medlem

@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.

Permalänk

@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?

Permalänk
Medlem

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

Permalänk
Medlem
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?

Permalänk

@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.

Permalänk

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

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

Permalänk
Medlem

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

Permalänk

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?

Permalänk
Medlem
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.

Permalänk

@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!

Permalänk
Medlem

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.

Permalänk

@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.

Permalänk

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

Permalänk

@Texaco:

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?

Permalänk
Medlem
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.

Permalänk
Medlem

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; }

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
99:e percentilen
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.

Visa signatur

Skrivet med hjälp av Better SweClockers