C ++ Kortspel, behöver en knuff i rätt riktning!

Trädvy Permalänk
Medlem
Registrerad
Jul 2019

C ++ Kortspel, behöver en knuff i rätt riktning!

Hejsan!
Jag håller på att skapa ett kortspel som går ut på att två spelare ska kunna köra mot varandra.
Det är en "vanlig" kortlek, och den spelare som får högst kort vinner.
Det jag har fastnat på är att om personerna drar ett kort av samma värde, som typ 7 of hearts och 7 of clubs, så ska den suit som har högst värde läggas in som extra. Alltså i mitt fall är värdet på suits: Clubs, Diamonds, Heart, Spades där Spades har det högsta värdet.
Jag har problem att hitta en lösning där kortets värde och suits värde inte räknas ihop fören det behövs .

Här är min kod:

#include <iostream> //Needed to run COUT #include <ctime> //Needed to randomise #include <string> //Needed to create strings #include <cmath> #include <sstream> #include <cstdlib> #include <stdlib.h> //Needed to run CLS using namespace std; const string values[13] = //Creates an array of cards { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" }; const string suits[4] = //Creates an array of suits { "Clubs", "Diamonds", "Hearts", "Spades" }; string card(unsigned int card) //Assigns suits to values { if (card >= 52) { return "Invalid"; } return values[card % 13] + " of " + suits[card / 13]; // where card ranges from 0 to 51. } int main() { string player1; //Creates string string player2; //Creates string cout << "Hello there! " << "\n" << endl; //Writing text cout << "This is a cardgame where you win by chance, you pull a card out of the deck and if you get the highest card you win the round." << "\n" << endl; //Writing text cout << "If you are lucky enought to be the first to win 3 rounds, you win the game!!! Sounds like fun!" << "\n" << endl; //Writing text cout << "Let's start with getting to know eachother a bit better, what's the name of player 1? Type it down below and press enter!" << "\n" << endl; //Writing text cin >> player1; //Player 1 input cout << " " << endl; //Writing space cout << "That's a great name! What's the name of player 2? Type it down below and press enter!" << "\n" << endl; //Writing text cin >> player2; //Player 2 input cout << " " << endl; //Writing space cout << "Well, isn't that awesome." << "\n" << endl; //Writing text cout << "Welcome to the most epic cardgame you have ever played, " << player1 << "and" << player1 << "!" << endl << endl; //Writing text cout << "So the card you will get is totally random. The person with the highest card wins and it's first to 3 won rounds to win the game, got it?" << "\n" << endl << endl; //Writing text cout << "Great! Let's get going. :)" << "\n" << endl; //Writing text cout << "Press any key to draw a card, " << player1 << "!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text bool loop = true; //Creates loop int winsPlayer1 = 0; //Creates a counter int winsPlayer2 = 0; //Creates a counter int lossesPlayer1 = 0; //Creates a counter int lossesPlayer2 = 0; //Creates a counter bool anotherround = true; //Creates a boolean for playing another round int roundswonPlayer1 = 0; //Creates a counter int roundswonPlayer2 = 0; //Creates a counter int gameswonPlayer1 = 0; //Creates a counter int gameswonPlayer2 = 0; //Creates a counter while (loop == true) //While the loop is active { bool loop3 = true; //Creates loop while (loop3) //While the loop is active { srand(time(NULL)); int randomise = rand() % 52; int randomise2 = rand() % 52; int HighestCardPlayer1; int HighestCardPlayer2; HighestCardPlayer1 = randomise; HighestCardPlayer2 = randomise2; cout << player1 << " draws the card: " << card(randomise) << endl; cout << " " << endl; //Writing space cout << "So, your card is " << card(HighestCardPlayer1) << ", let's see what " << player2 << " gets! Press any key to draw a card, " << player2 << "!" << endl; //Presents drawn card cout << " " << endl; //Writing space system("pause > nul"); //Press any button to continue... but the nul removes the text cout << player2 << " draws the card: " << card(randomise2) << endl; cout << " " << endl; //Writing space cout << "Just to be clear, " << player2 << "'s card is " << card(HighestCardPlayer2) << ", let's see who won the round! Press any key to continue." << endl; //Presents drawn card cout << " " << endl; //Writing space system("pause > nul"); //Press any button to continue... but the nul removes the text if (card(HighestCardPlayer1) > card(HighestCardPlayer2)) //If player 1 has the highest card { cout << player1 << ", you won this round! Wohoo!!" << endl; //Writing text cout << " " << endl; //Writing space winsPlayer1++; //Adds value to selected int lossesPlayer2++; //Adds value to selected int roundswonPlayer1++; //Adds value to selected int cout << player1 << ", your total rounds won are: " << winsPlayer1 << ", your total round lost are: " << lossesPlayer1 << "" << endl; //Writes results cout << player2 << ", your total rounds won are: " << winsPlayer2 << ", your total round lost are: " << lossesPlayer2 << "" << endl; //Writes results cout << "Press any key to draw another card!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text } else if (card(HighestCardPlayer1) < card(HighestCardPlayer2)) //If player 2 has the highest card { cout << player2 << ", you won this round! Wohoo!!" << endl; //Writing text cout << " " << endl; //Writing space winsPlayer2++; //Adds value to selected int lossesPlayer1++; //Adds value to selected int roundswonPlayer2++; //Adds value to selected int cout << player1 << ", your total rounds won are: " << winsPlayer1 << ", your total round lost are: " << lossesPlayer1 << "" << endl; //Writes results cout << player2 << ", your total rounds won are: " << winsPlayer2 << ", your total round lost are: " << lossesPlayer2 << "" << endl; //Writes results cout << "Press any key to draw another card!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text } else if (card(HighestCardPlayer1) == card(HighestCardPlayer2)) //If player 1 and 2 has the same value cards { { } system("pause > nul"); //Press any button to continue... but the nul removes the text } if (roundswonPlayer1 == 3) //If player 1 has won 3 rounds { gameswonPlayer1++; cout << player1 << ", congratulations!! You've won the game!! "; //Writing text cout << player1 << ", your total games won are: " << gameswonPlayer1 << ", your total games lost are: " << gameswonPlayer2 << "" << "\n" << endl; //Writes results cout << player2 << ", your total games won are: " << gameswonPlayer2 << ", your total games lost are: " << gameswonPlayer1 << "" << "\n" << endl; //Writes results cout << "Press any key to continue!" << "\n" << endl; //Writing text cout << " " << endl; //Writing space roundswonPlayer1 = 0; //Brings int value back to 0 roundswonPlayer2 = 0; //Brings int value back to 0 } if (roundswonPlayer2 == 3) //If player 2 has won 3 rounds { gameswonPlayer2++; cout << player1 << ", sadly you lost the game this time, better luck next time!" << "\n" << endl; //Writing text cout << player1 << ", your total games won are: " << gameswonPlayer1 << ", your total games lost are: " << gameswonPlayer2 << "" << "\n" << endl; //Writes results cout << player2 << ", your total games won are: " << gameswonPlayer2 << ", your total games lost are: " << gameswonPlayer1 << "" << "\n" << endl; //Writes results cout << "Press any key to continue!" << "\n" << endl; //Writing text cout << " " << endl; //Writing space roundswonPlayer1 = 0; //Brings int value back to 0 roundswonPlayer2 = 0; //Brings int value back to 0 } } bool loop2 = true; while (loop2) { char anotherround; //Creates a character cout << "Do you want to play another game? If you answer no, the game will end. Enter y for yes and n for no." << "\n" << endl; //Asks the player if it wants to play again or end game cin >> anotherround; //Player input if (anotherround == 'y') //If the player types y { loop2 = false; //Cancels loop continue; //Continues } else if (anotherround == 'n') //If the player types n { cout << "Thank you for playing the most epic cardgame there is!" << endl; //Writing text return 0; //Resets game } } } }

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004

Det är lite svårläst testa code brackets sedan se var du kan återanvända kod, för just problemet med suit, du delar den på 13, det borde väl vara på 4?

Skickades från m.sweclockers.com

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Avstängd
Registrerad
Okt 2016

Skriv kod i taggar.

Varför inte bara slumpa 52 tal?
Det enda du behöver klura ut då är utskrifter.

Stax 353xbk | Stax L300Le + L700 Arc + Custom Pads
SMSL AD18 | Kef Q300

Trädvy Permalänk
Medlem
Registrerad
Jul 2019

@Ferrat @Sinery
Sorry, missade taggen!

Ferrat, delar jag det på 4 så visas inte suitsen på alla kort, lustigt nog, så det funkar inte, om jag inte har 13.

Sinery, slumpa 52 tal? Tror inte det är det som är felet, problemet är att jag inte behöver värdet på suits fören de två spelarna har fått samma värde, typ spader 7 och klöver 7, då är det själva suiten som ska avgöra vem som vinner.
Alltså är värdena på suitsen klöver, ruter, hjärter, spader där spader har det högsta värdet.

Förlåt om jag inte är helt klar med min förklaring, är lite trött vid det här laget och har stirrat mig blind på koden!

Trädvy Permalänk
Avstängd
Registrerad
Okt 2016
Skrivet av biivil:

@Ferrat @Sinery
Sorry, missade taggen!

Sinery, slumpa 52 tal? Tror inte det är det som är felet, problemet är att jag inte behöver värdet på suits fören de två spelarna har fått samma värde, typ spader 7 och klöver 7, då är det själva suiten som ska avgöra vem som vinner.
Alltså är värdena på suitsen klöver, ruter, hjärter, spader där spader har det högsta värdet.

Förlåt om jag inte är helt klar med min förklaring, är lite trött vid det här laget och har stirrat mig blind på koden!

Problemet är att du har en komplicerad lösning till ett enkelt program.

Sedan visst fungerar logiken att slumpa 13 tal för att sedan slumpa 4 tal, men då korrelerar chansen inte med verkligheten och du kommer fortfarande behöva implementera så att dom inte kan slumpa samma av dom 4 talen.

Bespara dig själv och slumpa 52 tal, klura ut ett system för att få korrekt utskrift från siffervärdet.

Stax 353xbk | Stax L300Le + L700 Arc + Custom Pads
SMSL AD18 | Kef Q300

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004

@biivil: Ja du delar ser jag nu, var på mobilen igår, det ska ju vara modulo %4 för suit för annars har du ju 13 färger? Dock är Sinerys lösning bättre i helhet.

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

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

@biivil: Problemet du har just nu är att card-funktionen returnerar en sträng som t.ex. "4 of Hearts", som du sen försöker använda för att jämföra korten. Det betyder att ordningen för korten blir 10 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < Ace < Jack < King < Queen eftersom strängarna jämförs bokstav för bokstav med deras ASCII-värden.

Vad du borde göra istället är att skriva två funktioner, en som returnerar värdet på ett kort (0-12) och en som returnerar värdet på ett korts färg (0-3). Du beräknar redan de värdena i card-funktionen, men det är bra att lägga sån funktionalitet i separata funktioner med tydliga namn. Sen kan du använda de funktionerna för att jämföra korten istället.

Trädvy Permalänk
Moderator
Registrerad
Jul 2017

Bara FYI: Slumpa 52 tal och sedan konvertera denna till kort är inte samma sak som att få fram en blandad kortlek. Om man bara slumpar 52 tal finns ingen garanti att man får samma tal exakt en gång. (I ditt fall har du inte en kortlek, men du har fortfarande 1/52 chans att båda spelarna får exakt samma kort...)

Korrekt är att först fylla en array med alla kort som ska vara med i leken och sedan göra en Fisher-Yates shuffle på arrayen.

Jag hade gjort en klass (med oföränderliga fält) som beskriver ett kort, lagt in alla möjliga kort i en array, och sedan blandat dem med Fisher-Yates. Då har du en kortlek. Sedan kan du ha funktioner som jämför kort med varandra.

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Buggar i nuvarande program:

Båda spelarna kan råka dra samma kort. Inte korrekt!
srand(time(NULL)) bör bara köras en enda gång. Typ allra först i main().

Ett par tankar/knuffar:

Kortleken kan vara en array med 52 heltal:

int kortlek[52];

Denna array fylls i en loop med heltal 0-51.

Därefter blandas korten. Detta genom att i tur och ordning kortet på varje position byts parvis (swap) ett kort på en slumpad position.

Du kan sedan få fram färg genom heltalsdivision med 13.

valor = kortlek[n] / 13; // 0 = "klöver", 3 = "hjärter".

Du kan få fram valör genom rest vid heltalsdivion med 13. Modulooperatorn %.

farg = kortlek[n] % 13; // 0 = "två", 12 = "ess"

Du kan först jämföra valör och sedan, om det behövs färg.

Linux och Android

Trädvy Permalänk
Medlem
Registrerad
Okt 2008

@biivil: Som påpekats innan så finns det en hel hög med problem att hantera. Du borde egentligen göra en omkonstruktion i grunden.

Men för det dilemma du beskriver, att inte kunna separera mellan hjärt 7 och spader 7, har du redan lösningen på plats (för den kod som du skrivit). Allt som behövs är att du lägger suits i ordning så att den lägst värderade har lägst värden. Sedan kan du göra jämförelsen direkt.

if (card(highestCardPlayer1) == card(highestCardPlayer2)) { if (highestCardPlayer1 > highestCardPlayer2) {

Trädvy Permalänk
Medlem
Plats
Stockholm / Vendelsö
Registrerad
Mar 2010

Ju mer jag tänker på detta - så kommer jag fram till att det enda rätta för att få en sann slump av korten är att först skapa kortleken, dvs 52 kort i en array. Dessa kort "blandas" antingen vid skapande eller efteråt. Man kan tänka sig en lista

Enum färger = Spader, Hjärter, Ruter, Klöver;

Lista Kortlek
{
Kortvärde, FärgNrEnum
5, Spader
11, hjärter
etc etc
}

Sen slumpar man ett tal mellan 1-52 o kollar vilket kort som ligger där i "leken"(Listan). Då du har både kortvärde o färg på samma ställe så blir det lätt att kolla vem som vann.

Mellan varje spel så blandar man leken så att t.ex. kort 5 inte är samma kort mellan spelen.

// LZ

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

Utan att blanda in klasser och liknande samt fortsätta använda din representation av kort med ett heltal borde kan man strukturera det hela så här får att komma igång:

#include <algorithm> #include <chrono> #include <iostream> #include <random> #include <string> #include <vector> #define NUM_RANKS 52 using namespace std; typedef unsigned int rank_t; typedef vector<rank_t> deck_t; string valueNameGet(rank_t rank) { static const string values[13] = { "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" }; return values[rank >> 2]; } string suitNameGet(rank_t rank) { static const string suits[4] = { "Clubs", "Diamonds", "Hearts", "Spades" }; return suits[rank & 0x3]; } string cardNameGet(rank_t rank) { return valueNameGet(rank) + " of " + suitNameGet(rank); } deck_t deckNew() { deck_t deck(NUM_RANKS); generate(begin(deck), end(deck), [rank=0] () mutable { return rank++; }); return deck; } void deckShuffle(deck_t &deck) { auto seed = chrono::system_clock::now().time_since_epoch().count(); shuffle(begin(deck), end(deck), default_random_engine(seed)); } rank_t cardDraw(deck_t &deck) { auto card = deck.back(); deck.pop_back(); return card; } int main() { auto deck = deckNew(); deckShuffle(deck); cout << cardNameGet(cardDraw(deck)) << endl; cout << cardNameGet(cardDraw(deck)) << endl; }

Du får fundera exakt på vilken färg som ska ha högst rank för ditt fall, ändra suiteNameGet() på önskat sätt. "Tricket" här är att använda en heltal för varje kort som gör att du direkt kan jämföra det heltalet för att avgöra vem som drog det högsta kortet (d.v.s. bara jämföra två värden man får från två anrop till cardDraw()).

Att blanda korten använder här en standardfunktion i C++. Bättre att använda dessa än försöka koka ihop något själv, om man nu inte har väldigt speciella krav!

Gör samma sak med resten av din kod, d.v.s. bryt upp den i små uppgifter som du löser i en separat funktion.

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005

Använd decimaltal, det blir enklare. typ 7.1 är klöver och 7.4 är hjärter. Då får du automatiskt alla kort i rätt värdeordning. Och lätt att identifiera, heltal är värdet och decimalen är färgen.

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Plats
Stockholm / Vendelsö
Registrerad
Mar 2010

så här tänkte jag

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HighCardGame { public class Deck { public enum suits {Spader, Hjärter, Ruter, Klöver }; public class Card { public int Value { get; set; } public suits Suit { get; set; } public Card(int value, suits suit) { Value = value; Suit = suit; } public override string ToString() { string cardName = string.Empty; string värde=string.Empty; switch (Value) { case 2: värde = "två"; break; case 3: värde = "tre"; break; case 4: värde = "fyra"; break; case 5: värde = "fem"; break; case 6: värde = "sex"; break; case 7: värde = "sju"; break; case 8: värde = "åtta"; break; case 9: värde = "nio"; break; case 10: värde = "tio"; break; case 11: värde = "knekt"; break; case 12: värde = "dam"; break; case 13: värde = "kung"; break; case 14: värde = "ess"; break; } cardName = Suit + " " + värde; return cardName; } } public void Shuffle() { bool bFound = false; for (int i = 1; i < 53; i++) { bFound = false; while (bFound != true) { int slump = new Random().Next(0, 52); Card c = CardDeckTemplate[slump]; if (!CardDeck.Contains(c)) { CardDeck.Add(c); bFound = true; } } } } public List<Card> CardDeckTemplate = new List<Card>(); public List<Card> CardDeck = new List<Card>(); public Deck() { CreateTemplate(); Shuffle(); } private void CreateTemplate() { foreach (suits s in Enum.GetValues(typeof(suits))) { for (int x = 2; x <= 14; x++) { CardDeckTemplate.Add(new Card(x, s)); } } } } }

Det är c# för jag orkar inte med C++ längre

Skulle bli effektivare med en länkad lista som CardDeck - med 2 int:ar - men denna version känns mer "redig" då den gör en blandad kortlek...

// Lazze

Trädvy Permalänk
Medlem
Registrerad
Jul 2019

@Sinery , @Ferrat , @perost , @pv2b , @Adoby , @Fey , @Tea42BBS , @Yoshman , @ZekretW

Jag har suttit och klurat med era förslag och knuffar, har fått en massa idéer och uppskattar alla era svar som kom så snabbt!
Lyckades lösa mina buggar och problem med alla knuffar, men lösningen på mitt problem blev typ så här:

if ((HighestCardPlayer1 % 13) == (HighestCardPlayer2 % 13)) //If player 1 and 2 has the same number cards compare suits { if ((HighestCardPlayer1 / 13) > (HighestCardPlayer2 / 13)) //Checks value of suits {}

Samt att jag fick lägga in en randomiser ifall att båda spelare får samma kort så tvingas en spelare att dra ett nytt kort (in private)
för att lösa att det tekniskt sätt inte är en kortlek som jag skapat.

srand(time(NULL)); //For shuffeling the cards int randomise = rand() % 52; //Creates randomiser int randomise2 = rand() % 52; //Creates randomiser while (randomise == randomise2) //If the cards turn out to be the exact same card { randomise2 = rand() % 52; //Player 2 gets to roll another card (without knowing) }

Det blev lättare då jag inte har många dagar på mig att skriva om min kod så fick lösa det bäst utifrån era knuffar och den kod jag har.

Så i princip är denna tråd löst Tack för knuffarna!

Trädvy Permalänk
Medlem
Plats
Stockholm / Vendelsö
Registrerad
Mar 2010
Skrivet av biivil:

@Sinery , @Ferrat , @perost , @pv2b , @Adoby , @Fey , @Tea42BBS , @Yoshman , @ZekretW

Jag har suttit och klurat med era förslag och knuffar, har fått en massa idéer och uppskattar alla era svar som kom så snabbt!
Lyckades lösa mina buggar och problem med alla knuffar, men lösningen på mitt problem blev typ så här:

if ((HighestCardPlayer1 % 13) == (HighestCardPlayer2 % 13)) //If player 1 and 2 has the same number cards compare suits { if ((HighestCardPlayer1 / 13) > (HighestCardPlayer2 / 13)) //Checks value of suits {}

Samt att jag fick lägga in en randomiser ifall att båda spelare får samma kort så tvingas en spelare att dra ett nytt kort (in private)
för att lösa att det tekniskt sätt inte är en kortlek som jag skapat.

srand(time(NULL)); //For shuffeling the cards int randomise = rand() % 52; //Creates randomiser int randomise2 = rand() % 52; //Creates randomiser while (randomise == randomise2) //If the cards turn out to be the exact same card { randomise2 = rand() % 52; //Player 2 gets to roll another card (without knowing) }

Det blev lättare då jag inte har många dagar på mig att skriva om min kod så fick lösa det bäst utifrån era knuffar och den kod jag har.

Så i princip är denna tråd löst Tack för knuffarna!

jag rekommenderar dig att kolla lite på men lösning, med kortlek o blandning

// LZ

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
Skrivet av ZecretW:

Använd decimaltal, det blir enklare. typ 7.1 är klöver och 7.4 är hjärter. Då får du automatiskt alla kort i rätt värdeordning. Och lätt att identifiera, heltal är värdet och decimalen är färgen.

Jag är helt mållös. Det är väldigt kreativt men aldrig något jag hade gjort. Känns väldigt ologiskt.
Du måste ju också separera heltal och decimalvärdet om du vill veta färg.

Varför inte bara ha en strukt med hetal och enum för färg. Bättre att sikta på läsbarhet och förståelse.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2009
Skrivet av Shimonu:

Jag är helt mållös. Det är väldigt kreativt men aldrig något jag hade gjort. Känns väldigt ologiskt.
Du måste ju också separera heltal och decimalvärdet om du vill veta färg.

Varför inte bara ha en strukt med hetal och enum för färg. Bättre att sikta på läsbarhet och förståelse.

Heh, jag har sett roligare hack än så när jag pluggade

Jag skulle också kört på en struct (vilket är samma som en class i c++, fast med public members by default, om jag inte minns fel?...). Går ju att implementera '<'-operatorn samt '=='-operatorn på några rader kod bara så kan man använda stdlib-funktioner sen.

Folk här har säkert generellt god koll på floats, men skriver följande varning ändå:

Att använda floating point för att spara data på det föreslagna kreativa sättet kan straffa sig senare om/när man börjar lite mer komplicerade operationer, pga avrundingsfel. Spelar iof egentligen inte någon större roll om man vill lösa en skoluppgift på ett hackigt sätt, men jag skulle svära högt om någon gjorde det i kod som ska köras i prodmiljöer (eller ja... om det fanns en fet kommentar som förklarade nyttan med att spara data på det sättet så skulle jag ha överseende ).

Exempel nedan (dock java, men spelar ingen roll) för att visa på hazards med att spara saker på kluriga sätt i floats som bygger på att man har exakt sparade värden.

class Main { public static void main(String[] args) { double offset = 21.13; double x = 1.1 + offset; x -= offset; double y = 1.1; System.out.println(x); System.out.println(y); System.out.printf("X equals Y? : %s\n", x == y); } }

Output:

1.1000000000000014 1.1 X equals Y? : false

Trädvy Permalänk
Medlem
Plats
Skåneland
Registrerad
Mar 2005
Skrivet av Shimonu:

Du måste ju också separera heltal och decimalvärdet om du vill veta färg.

Varför inte bara ha en strukt med hetal och enum för färg. Bättre att sikta på läsbarhet och förståelse.

Att jämför om ett kort är bättre än ett annat är "if (kortlek[index1] > kortlek[index2])" då heltalet alltid vinner men om det är samma heltal så kommer decimaldelen att avgöra vems färg är bäst.
Detta var ju allt denna lösningen behöver åstadkomma.

Skrivet av biivil:

Det är en "vanlig" kortlek, och den spelare som får högst kort vinner.
Det jag har fastnat på är att om personerna drar ett kort av samma värde, som typ 7 of hearts och 7 of clubs, så ska den suit som har högst värde läggas in som extra. Alltså i mitt fall är värdet på suits:

Vill du få ut mer info:
Färg är "int(frac(kortlek[index])*10)"
Värdet är "int(kortlek[index])"
Dessa kan ju sedan anropa en strängarray där du lagrat "Error, Two, Three...Ace" och en strängarray där du har "Error, Clubs...Spades"

Läsbarheten ligger i dokumentationen.
Jag kommer från en tid när minne är dyrt och inget man slösar med. Då hade kortleken bara behövt vara 52 bytes. 2 lägsta bitarna hade varit färgen och nästa 4 hade varit värdet. Då hade du haft 2 bitar över som flaggor för tex valt eller använt kort.

Skrivet av osmig:

Att använda floating point för att spara data på det föreslagna kreativa sättet är en dålig vana som kan straffa sig senare om/när man börjar lite mer komplicerade operationer,
Exempel nedan (dock java, men spelar ingen roll) för att visa på hazards med att spara saker på kluriga sätt i floats som bygger på att man har exakt sparade värden.

Jag köper ditt argument utan tvekan men det var bara en enkel uppgift att lösa. Allt måste inte kodas i tre dagar för att bli bra och snyggt. Man måste kunna tjäna pengar på det med.

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Trädvy Permalänk
Medlem
Plats
Skövde
Registrerad
Jun 2009
Skrivet av biivil:

Hejsan!
Jag håller på att skapa ett kortspel som går ut på att två spelare ska kunna köra mot varandra.
Det är en "vanlig" kortlek, och den spelare som får högst kort vinner.
Det jag har fastnat på är att om personerna drar ett kort av samma värde, som typ 7 of hearts och 7 of clubs, så ska den suit som har högst värde läggas in som extra. Alltså i mitt fall är värdet på suits: Clubs, Diamonds, Heart, Spades där Spades har det högsta värdet.
Jag har problem att hitta en lösning där kortets värde och suits värde inte räknas ihop fören det behövs .

Här är min kod:

#include <iostream> //Needed to run COUT #include <ctime> //Needed to randomise #include <string> //Needed to create strings #include <cmath> #include <sstream> #include <cstdlib> #include <stdlib.h> //Needed to run CLS using namespace std; const string values[13] = //Creates an array of cards { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" }; const string suits[4] = //Creates an array of suits { "Clubs", "Diamonds", "Hearts", "Spades" }; string card(unsigned int card) //Assigns suits to values { if (card >= 52) { return "Invalid"; } return values[card % 13] + " of " + suits[card / 13]; // where card ranges from 0 to 51. } int main() { string player1; //Creates string string player2; //Creates string cout << "Hello there! " << "\n" << endl; //Writing text cout << "This is a cardgame where you win by chance, you pull a card out of the deck and if you get the highest card you win the round." << "\n" << endl; //Writing text cout << "If you are lucky enought to be the first to win 3 rounds, you win the game!!! Sounds like fun!" << "\n" << endl; //Writing text cout << "Let's start with getting to know eachother a bit better, what's the name of player 1? Type it down below and press enter!" << "\n" << endl; //Writing text cin >> player1; //Player 1 input cout << " " << endl; //Writing space cout << "That's a great name! What's the name of player 2? Type it down below and press enter!" << "\n" << endl; //Writing text cin >> player2; //Player 2 input cout << " " << endl; //Writing space cout << "Well, isn't that awesome." << "\n" << endl; //Writing text cout << "Welcome to the most epic cardgame you have ever played, " << player1 << "and" << player1 << "!" << endl << endl; //Writing text cout << "So the card you will get is totally random. The person with the highest card wins and it's first to 3 won rounds to win the game, got it?" << "\n" << endl << endl; //Writing text cout << "Great! Let's get going. :)" << "\n" << endl; //Writing text cout << "Press any key to draw a card, " << player1 << "!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text bool loop = true; //Creates loop int winsPlayer1 = 0; //Creates a counter int winsPlayer2 = 0; //Creates a counter int lossesPlayer1 = 0; //Creates a counter int lossesPlayer2 = 0; //Creates a counter bool anotherround = true; //Creates a boolean for playing another round int roundswonPlayer1 = 0; //Creates a counter int roundswonPlayer2 = 0; //Creates a counter int gameswonPlayer1 = 0; //Creates a counter int gameswonPlayer2 = 0; //Creates a counter while (loop == true) //While the loop is active { bool loop3 = true; //Creates loop while (loop3) //While the loop is active { srand(time(NULL)); int randomise = rand() % 52; int randomise2 = rand() % 52; int HighestCardPlayer1; int HighestCardPlayer2; HighestCardPlayer1 = randomise; HighestCardPlayer2 = randomise2; cout << player1 << " draws the card: " << card(randomise) << endl; cout << " " << endl; //Writing space cout << "So, your card is " << card(HighestCardPlayer1) << ", let's see what " << player2 << " gets! Press any key to draw a card, " << player2 << "!" << endl; //Presents drawn card cout << " " << endl; //Writing space system("pause > nul"); //Press any button to continue... but the nul removes the text cout << player2 << " draws the card: " << card(randomise2) << endl; cout << " " << endl; //Writing space cout << "Just to be clear, " << player2 << "'s card is " << card(HighestCardPlayer2) << ", let's see who won the round! Press any key to continue." << endl; //Presents drawn card cout << " " << endl; //Writing space system("pause > nul"); //Press any button to continue... but the nul removes the text if (card(HighestCardPlayer1) > card(HighestCardPlayer2)) //If player 1 has the highest card { cout << player1 << ", you won this round! Wohoo!!" << endl; //Writing text cout << " " << endl; //Writing space winsPlayer1++; //Adds value to selected int lossesPlayer2++; //Adds value to selected int roundswonPlayer1++; //Adds value to selected int cout << player1 << ", your total rounds won are: " << winsPlayer1 << ", your total round lost are: " << lossesPlayer1 << "" << endl; //Writes results cout << player2 << ", your total rounds won are: " << winsPlayer2 << ", your total round lost are: " << lossesPlayer2 << "" << endl; //Writes results cout << "Press any key to draw another card!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text } else if (card(HighestCardPlayer1) < card(HighestCardPlayer2)) //If player 2 has the highest card { cout << player2 << ", you won this round! Wohoo!!" << endl; //Writing text cout << " " << endl; //Writing space winsPlayer2++; //Adds value to selected int lossesPlayer1++; //Adds value to selected int roundswonPlayer2++; //Adds value to selected int cout << player1 << ", your total rounds won are: " << winsPlayer1 << ", your total round lost are: " << lossesPlayer1 << "" << endl; //Writes results cout << player2 << ", your total rounds won are: " << winsPlayer2 << ", your total round lost are: " << lossesPlayer2 << "" << endl; //Writes results cout << "Press any key to draw another card!" << "\n" << endl; //Writing text system("pause > nul"); //Press any button to continue... but the nul removes the text } else if (card(HighestCardPlayer1) == card(HighestCardPlayer2)) //If player 1 and 2 has the same value cards { { } system("pause > nul"); //Press any button to continue... but the nul removes the text } if (roundswonPlayer1 == 3) //If player 1 has won 3 rounds { gameswonPlayer1++; cout << player1 << ", congratulations!! You've won the game!! "; //Writing text cout << player1 << ", your total games won are: " << gameswonPlayer1 << ", your total games lost are: " << gameswonPlayer2 << "" << "\n" << endl; //Writes results cout << player2 << ", your total games won are: " << gameswonPlayer2 << ", your total games lost are: " << gameswonPlayer1 << "" << "\n" << endl; //Writes results cout << "Press any key to continue!" << "\n" << endl; //Writing text cout << " " << endl; //Writing space roundswonPlayer1 = 0; //Brings int value back to 0 roundswonPlayer2 = 0; //Brings int value back to 0 } if (roundswonPlayer2 == 3) //If player 2 has won 3 rounds { gameswonPlayer2++; cout << player1 << ", sadly you lost the game this time, better luck next time!" << "\n" << endl; //Writing text cout << player1 << ", your total games won are: " << gameswonPlayer1 << ", your total games lost are: " << gameswonPlayer2 << "" << "\n" << endl; //Writes results cout << player2 << ", your total games won are: " << gameswonPlayer2 << ", your total games lost are: " << gameswonPlayer1 << "" << "\n" << endl; //Writes results cout << "Press any key to continue!" << "\n" << endl; //Writing text cout << " " << endl; //Writing space roundswonPlayer1 = 0; //Brings int value back to 0 roundswonPlayer2 = 0; //Brings int value back to 0 } } bool loop2 = true; while (loop2) { char anotherround; //Creates a character cout << "Do you want to play another game? If you answer no, the game will end. Enter y for yes and n for no." << "\n" << endl; //Asks the player if it wants to play again or end game cin >> anotherround; //Player input if (anotherround == 'y') //If the player types y { loop2 = false; //Cancels loop continue; //Continues } else if (anotherround == 'n') //If the player types n { cout << "Thank you for playing the most epic cardgame there is!" << endl; //Writing text return 0; //Resets game } } } }

Vad står det att du ska göra i uppgiften? Tycker att problemet löses bäst med hjälp av klasser.

Citera för svar

Asus Prime X370-Pro | AMD Ryzen 7 1800X | G.Skill Flare X AMD Series 16GB 3200MHz DDR4 | Asus GeForce GTX 1060 Dual OC | Samsung 840 Pro 256GB | Samsung 850 EVO 500GB | Corsair RM750X 750W | Fractal Design Define R6

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2009
Skrivet av ZecretW:

Jag köper ditt argument utan tvekan men det var bara en enkel uppgift att lösa. Allt måste inte kodas i tre dagar för att bli bra och snyggt. Man måste kunna tjäna pengar på det med.

Sure. Tycker dock personligen det är både enklare att skriva och läsa om man använder 2 separata tal i en struct, så därför såg jag ingen anledning till att "floatfiddla" ens i en skoluppgift. Jag har bränt mig på liknande genvägar förr när jag gjorde skoluppgifter/tävlingsprogrammering (speciellt innan jag hade en bra förståelse av flyttal).

Men det är nog tycke och smak, man vet själv vad man skriver snabbast