Tävla och vinn värstingdator!
Permalänk
Medlem

Problem med kortspel

Jag har gjort en kortlek som ska spela spelet 21. Den fungerar så att den gör en kortlek på slumpvalda postioner i ett stringfält. Vet någon hur man gör för att knyta en viss poäng till ett visst kort? T.ex. skulle spader 8 vara värt 8 poäng och ett ess vara värt antingen 1 eller 11. Hur gör man detta? Är extremt tacksam för svar.:)

Permalänk
Medlem

Förstår inte riktigt hur du gjort din kortlek... men bäst är väl att göra en Card-klass som innehåller valör och färg så har du poängen där.

Om varje kort är en sträng (typ "Spader 8") skulle du kunna göra en hashmap...

Visa signatur

:€

Permalänk
Medlem

som eighty sa.. en card klass där valör = poäng. Det är iaf så jag hade gjort.

Visa signatur
Permalänk
Medlem

en fördel är kanske att säga vilket språk?

Visa signatur

Ehhh...
...öhhhh

Permalänk
Medlem

Tack för hjälpen, fattar dock inte riktigt vad ni menar då jag precis börjat med detta.:rolleyes: Kanske blir enklare om jag visar lite av hur programmet ser ut.

Edit: Glömde skriva att det vara Java jag höll på med.

Kortleken:

//Kortdata String[] kortlek = new String[52]; String[] farg = {"Hjärter", "Spader", "Ruter", "Klöver",}; String[] valor = {"Ess", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Knekt", "Dam", "Kung"}; //Spelvariablar boolean nyttkort = true; int knr=0; char val2; int poang=0; //Skapa kortlek for(int i=0; i<13; i++) { kortlek [i] = Kort(farg[0], valor[i]); } for(int i=13; i<26; i++) { kortlek [i] = Kort(farg[1], valor[i-13]); } for(int i=26; i<39; i++) { kortlek [i] = Kort(farg[2], valor[i-26]); } for(int i=39; i<52; i++) { kortlek [i] = Kort(farg[3], valor[i-39]); }

Mer kortlek:

//Kortleksfunktion static String Kort(String x, String y) { String kort; kort = x + " " + y; return kort; }

Blanda:

for (int i=0; i<1000; i++) { int bland = (int) (Math.random() *52); int bland2 = (int) (Math.random() *52); String temp1 = kortlek[bland]; String temp2 = kortlek[bland2]; kortlek[bland] = temp2; kortlek[bland2] = temp1; }

Permalänk
Medlem

Om du absolut måste använda strängar rekommenderar jag att du skapar en array till, typ

int [] kortlekPoang = new int[52];

och fyller den med rätt poäng för varje kort...

Men jag insisterar på att du gör en Card-klass istället:

class Card { const int HEARTS = 0; const int SPADES = 1; const int CLUBS = 2; const int DIAMONDS = 3; int _value; int _suit; Card(int value, int suit) { _value = value; _suit = suit; } }

// Skapa kortleken Card [] deck = new Deck[52]; for (int suit = 0; suit < 4; suit++) for (int value = 1; value <= 13; value++) deck[i] = new Card(value, suit);

edit: ändrade ett fel i konstruktorn

Visa signatur

:€

Permalänk
Medlem

bugfix

Ändra

_suit = _suit;

till

_suit = suit;

i konstruktorn för Card.

Permalänk
Medlem

personligen skulle jag byta namn på _value och _suit till bara value/suit och sen köra

this.value = value;

Permalänk
Medlem

Tack för all hjälp. Jag har ändrat endel i programmet och jag kan kompilera det och allt men det fungerar ändå. Skulle någon kunna säga vad som är fel?

public class Tjugoett { class spelkort { String kort; int varde; }; //Spelet public static void main (String[] args) { //Kortdata spelkort[] kortlek = new spelkort[52]; //Kortleken String[] farg = {"Hjärter", "Spader", "Ruter", "Klöver",}; //Innhåller färg String[] valor = {"Ess", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Knekt", "Dam", "Kung"}; //Valörer int[] varde = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10}; //Poäng int poang=0; //Spelarens poäng int [] kortlekPoang = new int[52]; //Spelvariablar boolean nyttkort = true; //Sålänge som sant dras nytt kort int knr=0; //Kortnummer, håller reda på vilket som är nästa kort. char val2; //Om J/j så dras nytt kort //Skapa kortlek //Skapar Hjärter for(int i=0; i<13; i++) { kortlek[i].kort = Kort(farg[0], valor[i]); kortlek[i].varde = varde[i]; } //Skapar Spader for(int i=13; i<26; i++) { kortlek[i].kort = Kort(farg[1], valor[i-13]); kortlek[i].varde = i; } //Skapar Ruter for(int i=26; i<39; i++) { kortlek[i].kort = Kort(farg[2], valor[i-26]); kortlek[i].varde = i; } //Skapar Klöver for(int i=39; i<52; i++) { kortlek[i].kort = Kort(farg[3], valor[i-39]); kortlek[i].varde = i; } //Blanda for (int i=0; i<1000; i++) { int bland = (int) (Math.random() *52); int bland2 = (int) (Math.random() *52); spelkort temp1 = kortlek[bland]; spelkort temp2 = kortlek[bland2]; kortlek[bland] = temp2; kortlek[bland2] = temp1; } //Spelet char val;//Om J/j nytt = sant boolean nytt = true; //Om sant - nytt spel System.out.println("Tjugoett!"); while(nytt) { System.out.println("Vill du spela en omgang? (j/n)"); val = Keyboard.readChar(); knr=0;//Tömmer kortnummer efter varje spel så fältets kapacitet ej överskrids if (val == 'j'|| val == 'J') { do { System.out.println("Vill du dra ett nytt kort? (j/n)"); val2 = Keyboard.readChar(); if(val2 == 'j'|| val2 == 'J') { System.out.println("Du drog " + kortlek[knr] + " och har " + poang + " poang."); knr = knr+1; } else { nyttkort=false; } } while(nyttkort && poang<=21); } else { nytt = false; } } //Skriv ut kortlek for(int i=0; i<52; i++) { System.out.println(kortlek[i]); } } //Kortleksfunktion static String Kort(String x, String y) { String kort; kort = x + " " + y; return kort; } }

Permalänk
Medlem

Det vore bra om du sade vad det är som inte funkar eller vad/var du får för fel.

Får du NullPointerException? Du initialiserar aldrig elementen i kortlek[], men försöker använda dem ändå. Dessutom har du inte gjort någon konstruktor till kort-klassen. Kolla på mitt exempel.

papabear: Ja, det är bättre.

Visa signatur

:€

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av eighty
Det vore bra om du sade vad det är som inte funkar eller vad/var du får för fel.

Får du NullPointerException? Du initialiserar aldrig elementen i kortlek[], men försöker använda dem ändå. Dessutom har du inte gjort någon konstruktor till kort-klassen. Kolla på mitt exempel.

papabear: Ja, det är bättre.

Jepp, jag fick det felet. Hur löser jag det? Sorry om jag verkar dum men jag är helt ny på det här så jag har inte lärt mig konstruktorer och grejs än.

Permalänk
3dfx Fanboy
Citat:

Ursprungligen inskrivet av XerXes
Jepp, jag fick det felet. Hur löser jag det? Sorry om jag verkar dum men jag är helt ny på det här så jag har inte lärt mig konstruktorer och grejs än.

felet ligger i:

kortlek[i].kort = Kort(farg[0], valor[i]); kortlek[i].varde = varde[i];

du försöker stoppa in saker i ett objekt som inte finns.. det du ska göra är:

kortlek[i] = new spelKort(Kort(farg[0], valor[i]), varde[i]);

eller ännu hellre..

kortlek[i] = new SpelKort(arg[0] + " " + valor[i], varde[i]);

för att slippa den fullständigt meningslösa static String Kort... och börja namnet på din klass med ett stort "S"..

se bara till att SpelKort har den självklara konstruktorn:

public SpelKort(String name, int value){ this.name = name; this.value = value; }

Visa signatur

Runnin with a pump pump
no bluffin we buck buck

Permalänk
Medlem

Tackar så mycket för det Misko. Men det gav mig ett problem till som jag inte förstår (suprise):rolleyes: Nu står det:

G:\Xerxes\Java\tjugoett3\Tjugoett.java:29: non-static variable this cannot be referenced from a static context
kortlek[i] = new Spelkort(Kort(farg[0], valor[i]), varde[i]);

Antar att det bara är nåt litet fel, men jag har inte hittat någon bra lösning.

Permalänk
Medlem

sätt 'static' framför kortlek[] när du deklarerar den.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av papabear
sätt 'static' framför kortlek[] när du deklarerar den.

Det fungerar tyvärr inte.:(

Permalänk
Medlem

Var har du lagt raden? Deklarera kortlek utanför main().

Visa signatur

:€

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av eighty
Var har du lagt raden? Deklarera kortlek utanför main().

Givetvis, glömde säga det.

Om du postar den aktuella koden så blir det lättare att hitta en lösning.

Permalänk
Medlem

Så här ser det ut just nu:
Och det ger felet.
"G:\Xerxes\Java\tjugoett3\Tjugoett.java:27: non-static variable this cannot be referenced from a static context
kortlek[i] = new Spelkort(Kort(farg[0], valor[i]), varde[i]);"

public class Tjugoett { //Spelet public static void main (String[] args) { Spelkort[] kortlek = new Spelkort[52]; //Kortleken //Kortdata String[] farg = {"Hjärter", "Spader", "Ruter", "Klöver",}; //Innhåller färg String[] valor = {"Ess", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Knekt", "Dam", "Kung"}; //Valörer int[] varde = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10}; //Poäng int poang=0; //Spelarens poäng //Spelvariablar boolean nyttkort = true; //Sålänge som sant dras nytt kort int knr=0; //Kortnummer, håller reda på vilket som är nästa kort. char val2; //Om J/j så dras nytt kort //Skapa kortlek //Skapar Hjärter for(int i=0; i<13; i++) { kortlek[i] = new Spelkort(Kort(farg[0], valor[i]), varde[i]); } //Skapar Spader for(int i=13; i<26; i++) { kortlek[i] = new Spelkort(Kort(farg[1], valor[i]), varde[i]); } //Skapar Ruter for(int i=26; i<39; i++) { kortlek[i] = new Spelkort(Kort(farg[2], valor[i]), varde[i]); } //Skapar Klöver for(int i=39; i<52; i++) { kortlek[i] = new Spelkort(Kort(farg[3], valor[i]), varde[i]); } //Blanda for (int i=0; i<1000; i++) { int bland = (int) (Math.random() *52); int bland2 = (int) (Math.random() *52); Spelkort temp1 = kortlek[bland]; Spelkort temp2 = kortlek[bland2]; kortlek[bland] = temp2; kortlek[bland2] = temp1; } //Spelet char val;//Om J/j nytt = sant boolean nytt = true; //Om sant - nytt spel System.out.println("Tjugoett!"); while(nytt) { System.out.println("Vill du spela en omgang? (j/n)"); val = Keyboard.readChar(); knr=0;//Tömmer kortnummer efter varje spel så fältets kapacitet ej överskrids if (val == 'j'|| val == 'J') { do { System.out.println("Vill du dra ett nytt kort? (j/n)"); val2 = Keyboard.readChar(); if(val2 == 'j'|| val2 == 'J') { System.out.println("Du drog " + kortlek[knr] + " och har " + poang + " poang."); knr = knr+1; } else { nyttkort=false; } } while(nyttkort && poang<=21); } else { nytt = false; } } //Skriv ut kortlek for(int i=0; i<52; i++) { System.out.println(kortlek[i]); } } //Spelkortsklassen class Spelkort { public String kort; public int varde; }; //Kortleksfunktion static String Kort(String x, String y) { String kort; kort = x + " " + y; return kort; } }

Edit: Jag har fåt för mig att felet breor på att klassen inte är statisk men vet inte hur jag ska åtgärda detta.

Permalänk
3dfx Fanboy

alltså.. varför envisas du med den meningslösa static Kort???

kör programmet precis som vanligt i main-metoden... och skapa SpelKort enligt de förslag jag har gett dig innan... det är onödigt att ha den som en inner-class dessutom..

Visa signatur

Runnin with a pump pump
no bluffin we buck buck

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av misko
alltså.. varför envisas du med den meningslösa static Kort???

kör programmet precis som vanligt i main-metoden... och skapa SpelKort enligt de förslag jag har gett dig innan... det är onödigt att ha den som en inner-class dessutom..

Tack så hemskt mycket för hjälpen, det fungerade när jag använde en konstruktor istället och skrotade kort som du sa.

Permalänk
Medlem

Hej. Har problem med dubbelkort i spelkort. Jag skulle ha trumfkort tex. 7 spader. och 5 spelare hade 10 kort. där fanns ett kort loksom som trumfkort likana. Men ska inte göra så. Hur undviker jag både lika. ska inte ha dubbelkort.
Så här
const numPlayers = 5;
const suits = ['♥️', '♦️', '♣️', '♠️']; // Hjärta, Ruter, Klöver, Spader
const ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Kn', 'D', 'K', 'E']; // Kortens rang
let players = [];
let currentRound = 10; // Antal kort per spelare
let table = [];
let hasPlayed = new Array(numPlayers).fill(false); // Håller reda på om spelare har lagt ett kort
let trumpCard = null; // Trumfkortet
let currentSuit = null; // Färgen som spelas
let scores = new Array(numPlayers).fill(0); // Håller reda på poäng för varje spelare
let currentPlayerIndex = 0; // Håller reda på vilken spelare som ska spela
let lastRoundWinnerIndex = -1; // Håller reda på vinnaren av den senaste omgången

// Skapa en fullständig kortlek med möjlighet till dubbla kort
function createDeck() {
const deck = [];
for (const suit of suits) {
for (const rank of ranks) {
deck.push({ name: `${rank} ${suit}`, color: suit === '♥️' || suit === '♦️' ? 'red' : 'black', suit: suit, rank: rank });
}
}
return deck;
} Hoppas någon vet vad det är fel på och ändrar på denna? Mvh Huxxe,

Permalänk