Permalänk

Får inte till sort i kortspelet

Hej!

detta är min kod

let values = ["Hjärter", "Spader", "Klöver", "Ruter"]; let suits = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]; let deck = []; function createDeck() { values.forEach(value => { suits.forEach(suit => { deck.push({ color: value, ranks: suit }); }); }); return deck; } console.log(createDeck()); function shuffle() { let current = deck.length; let index, temp; while (current > 0) { index = Math.floor(Math.random() * current); current--; temp = deck[current]; deck[current] = deck[index]; deck[index] = temp; } } shuffle(); console.log(deck); function kupera() { let half = deck.splice(0, 26); let ne = deck.concat(half); deck = ne; } kupera(); console.log(deck); let player1 = []; let player2 = []; let hands = [ { name: "Laca", hand: player1 }, { name: "Auba", hand: player2 } ]; function playersHand() { for (let i = 0; i < 2; i++) { for (let j = 0; j < 2; j++) { if (j % 2 === 0) { player1.push(deck.pop()); } else { player2.push(deck.pop()); } } } return [player1, player2]; } playersHand(); console.log(hands[0]); console.log(hands[1]); hands.sort((a, b) => { return a.hand.ranks - b.hand.ranks; }); console.log(hands);

Problemet här är att jag försöker sortera i hands, vill alltså få ut så dom två spelarnas händer sorteras efter color och ranks.

försöker därför gå in i hands, in till hand till ranks, men går inte, det står [object] [object] bara, är det något fel i if satsen i playerHand som gör att det inte fungerar, gör två spelare med två tomma arrayer, men det är bra när det handlar om kortspel till varje spelare antar jag?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

Jag förstår inte riktigt vad du menar, sortera på deras händer på färg? Du vill sortera korten spelarna håller i?
Kör jag programmet så får spelarna två kort var som är olika för varje gång programmet körs, så den funktionen verkar ju fungera?

Jag kan heller inte se något [object][object] i console.log då jag kör din kod som du angivit, så vet inte vart du menar att du får det ifrån? Kan du specificera vart det är du menar och vad som du vill ska ske?

Tips: Då jag gjorde ett BlackJack så använde jag klasser och skapade instancer av Deck, Game och Player. På så vis kan du hålla logiken inkapslad och det gör det lättare att arbeta med, här skapas det spelare, sorteras och dealas kort huller om buller, något som tyvärr är en av nackdelarna med JavaScript om man inte kommer från ett OOP-språk.

Permalänk

Plocka ett kort, vilket som helst JS

Hej! Har en liten övning i skolan, men får inte till en uppgift nu.

min kod

let values = ["Hjärter", "Spader", "Klöver", "Ruter"]; let suits = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]; let deck = []; let players = []; function createDeck() { values.forEach(value => { suits.forEach(suit => { deck.push({ color: value, ranks: suit }); }); }); return deck; } console.log(createDeck()); function shuffle() { let current = deck.length; let index, temp; while (current > 0) { index = Math.floor(Math.random() * current); current--; temp = deck[current]; deck[current] = deck[index]; deck[index] = temp; } } shuffle(); console.log(deck); function kupera() { let half = deck.splice(0, 26); let ne = deck.concat(half); deck = ne; } kupera(); console.log(deck); function createPlayers(antal) { for (let i = 1; i <= antal; i++) { let hand = []; let player = { Name: "Player" + i, Hand: hand }; players.push(player); } } createPlayers(5); function dealHands() { for (let i = 0; i < 2; i++) { for (let o = 0; o < players.length; o++) { let card = deck.pop(); players[o].Hand.push(card); } } } dealHands(); console.log(players); players.sort(function(a, b) { let x = suits.indexOf(a.Hand[0].ranks); let y = suits.indexOf(b.Hand[0].ranks); return x - y; }); console.log(players); function drawCard() { players.forEach(function(player) { player.Hand.pop(); }); let tCard = players.Hand; console.log(tCard); } drawCard(); console.log(players);

uppiten är: Skriv en funktion som plockar ett av spelarens kort. Funktionen ska ta ett argument i form av ett
nummer, alltså vilket av korten som ska dras.

Jag har skrivit en funktion och i funktionen så har jag gjort en foreach för att loopa igenom att players för att sedan använda pop för att ta ut sista i varje spelare.

Men som ni ser så ska man ha en funktion som ska ta ett argument i form av ett nummer, alltså vilket av korten som ska dras står det. Och det har jag inte fått till, hur kan man lösa detta på bästa sätt?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

Hej! Har en liten övning i skolan, men får inte till en uppgift nu.

min kod

let values = ["Hjärter", "Spader", "Klöver", "Ruter"]; let suits = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]; let deck = []; let players = []; function createDeck() { values.forEach(value => { suits.forEach(suit => { deck.push({ color: value, ranks: suit }); }); }); return deck; } console.log(createDeck()); function shuffle() { let current = deck.length; let index, temp; while (current > 0) { index = Math.floor(Math.random() * current); current--; temp = deck[current]; deck[current] = deck[index]; deck[index] = temp; } } shuffle(); console.log(deck); function kupera() { let half = deck.splice(0, 26); let ne = deck.concat(half); deck = ne; } kupera(); console.log(deck); function createPlayers(antal) { for (let i = 1; i <= antal; i++) { let hand = []; let player = { Name: "Player" + i, Hand: hand }; players.push(player); } } createPlayers(5); function dealHands() { for (let i = 0; i < 2; i++) { for (let o = 0; o < players.length; o++) { let card = deck.pop(); players[o].Hand.push(card); } } } dealHands(); console.log(players); players.sort(function(a, b) { let x = suits.indexOf(a.Hand[0].ranks); let y = suits.indexOf(b.Hand[0].ranks); return x - y; }); console.log(players); function drawCard() { players.forEach(function(player) { player.Hand.pop(); }); let tCard = players.Hand; console.log(tCard); } drawCard(); console.log(players);

uppiten är: Skriv en funktion som plockar ett av spelarens kort. Funktionen ska ta ett argument i form av ett
nummer, alltså vilket av korten som ska dras.

Jag har skrivit en funktion och i funktionen så har jag gjort en foreach för att loopa igenom att players för att sedan använda pop för att ta ut sista i varje spelare.

Men som ni ser så ska man ha en funktion som ska ta ett argument i form av ett nummer, alltså vilket av korten som ska dras står det. Och det har jag inte fått till, hur kan man lösa detta på bästa sätt?

Funktionen splice finns

Sen är frågan om läraren tillåter det eller om hen vill att ni hittar på något själva

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Medlem

@Howardtheory:

Man kanske vill kunna skicka in vilken spelare vars kort som ska tas bort? Isf kan man skicka in index utav player objektet i players array.

Detta tar bort kort efter index, det tar alltså inte hänsyn till viken typ utav kort det är.

function removePlayerCardAtIndex(index, playerIndex) { players[playerIndex].Hand.splice(index, 1) }

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer...

Om man vill ha en funktion som ska ta bort ett specifikt kort utav ett visst värde, kanske det kan se ut så här.

function removePlayerCardByValue(playerIndex, value, suit) { players[playerIndex].Hand.filter(card => card.color !== value && card.ranks !== suit) }

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer...

Permalänk

@BrutalSwede:

så istället för player.Hand.pop() så ska jag använda mig av player.Hand.splice(0,1) exempelvis?

tänkte på att man ska skicka in ett argument står det med, måste man inte skicka in ett argument i functionen då? alltså jag menar, function drawCard (något här) {}

eller tänker jag fel?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

@Naxos: Tack för svaret. Är ny inom detta med JS med.

menar du kanske liknande detta?

function drawCard(index) { players.forEach(function(player) { player.Hand.splice(index, 1); }); } drawCard(0); console.log(players);

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

@Howardtheory: Ja om man nu vill bara ta bort ett kort, i detta fallet första kortet i handen/arrayen hos alla players.

Permalänk

@Naxos:

kanon, då var det som jag tänkte då.

Problemet är nu efter, med denna uppgift

Jämför två kort
Skriv en funktion som tar ett kort från varje spelare och jämför värdet (rank) och avgör vilken spelare
som har högst kort. Fundera lite på var de två korten ska placeras när du jämför dem?
Utveckla föregående funktion genom att med en parameter bestämma om även färg (color) ska
räknas, dvs spelare 2 måste ha samma färg som spelare 1 för att det ska göras en jämförelse.

jämföra två kort, kan man göra ungefär likadant som innan när man tar ut ett kort?

Men hur kan man jämföra de korten man tar ut, med värdet rank som jag satt till 1 till ess(14) ska det vara.

Får inte till det i mitt huvud hur man ska kunna koda så man kan jämföra dessa kort.

en sortering med indexOf kanske?

likt

players.sort(function(a, b) { let x = suits.indexOf(a.Hand[0].ranks); let y = suits.indexOf(b.Hand[0].ranks); return x - y; }); console.log(players);

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

@Howardtheory: Du har en "suits" array, där alla värden är redan sorterade rätt. Dvs lågt -> högt.
Då kan du skapa en funktion som tar in två kort, som kollar vilket index i "suits" array dess värde har.
Högsta index = högsta värde/rank.

Permalänk
Medlem

P.S: Du har termerna fel väg, "suit" på engelska betyder färg/svit/land, d.v.s hjärter, ruter, klöver och spader.

Permalänk

blackjack JS

Hej! Ber om ursäkt för fler inlägg så skapar en tråd här nu där jag tänkte att man kanske kan skriva om man behöver hjälp med ett blackjack spel som vi gör i skolan nu.

Jag har ett litet problem nu, när det delas ut AA alltså ess och ess så blir det null. Vet inte riktigt hur jag löser så att den räknar så ena A blir 11 och det andra blir 1 så totalen blir 12 liksom.

// Globala variabler let deck = []; let suits = ["hearts", "clubs", "diamonds", "spades"]; let ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"]; let players = []; // Skapar en kortlek function CreateDeck() { suits.forEach(suit => { ranks.forEach(rank => { deck.push({ suit: suit, rank: rank }); }); }); } //Shufflar kortleken random function shuffle(deck) { for (let i = deck.length - 1; i > 0; i--) { let j = Math.floor(Math.random() * (i + 1)); [deck[i], deck[j]] = [deck[j], deck[i]]; } } //skapar antal spelare function createPlayers(antal) { for (let i = 0; i <= antal; i++) { players.push({ namn: "player " + i, hand: [], total: null }); players[0].namn = "Dealer"; } } // delar ut 2 kort till varje spelare function dealCards(antal) { for (let i = 0; i < antal; i++) { players.forEach(player => { player.hand.push(deck.pop()); }); } } function sumCards() { players.forEach(player => { player.total = null; player.hand.forEach(kort => { if (ranks.indexOf(kort.rank) > 8 && ranks.indexOf(kort.rank) < 12) { player.total += 10; } else if (ranks.indexOf(kort.ranks) == 12) { if (player.total < 11) { player.total += 11; } else { player.total += 1; } } else { player.total += kort.rank; } }); }); } function compare() { for (let i = 1; i < players.length; i++) { if (players[0].total < players[i].total) { console.log(players[i].namn + " Har vunnit över dealern"); } else if (players[0].total === players[i].total) { console.log(players[i].namn + " har spelat lika mot dealern"); } else if (players[0].total > players[i].total) { console.log(players[i].namn + " har fölorat mot dealern"); } } } CreateDeck(); shuffle(deck); createPlayers(2); dealCards(2); sumCards(); compare(); console.log(players);

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Hedersmedlem

Hej!

Du kanske kan lägga till lite exempel på utdata från en körning av programmet där det blev fel?

Annars, jag regerar på denna:

let ranks = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];

Det är lite vanskligt att blanda olika datatyper i samma lista på det här sättet. Det gör att om jag skriver kod som använder t.ex. ranks[i] så kan jag inte veta vad jag får för datatyp, ibland blir det en sträng, ibland ett heltal. Bättre hade vart att istället göra så här:

let ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];

I sumCards skriver du även detta:

player.total = null;

Varför det? Du bör ju istället börja en summa på 0, inte null?

Permalänk
Medlem

Vilken console.log är det som resulterar i [object][object]?

Jag håller med föregående talare om att försöka använda objekt istället. Det är värt det lilla extra då det kommer bli en klarare logik.

Permalänk
Medlem

Det jag gjorde var att sätta en property för Weight på mina kortobjekt. Klädda kort väger 10 och Ess väger 1,11.
När du sedan kalkylerar poängen via en loop, så sätter du en tillfällig property för antal ess.
Om kortet är ett ess, räkna det som 11 och addera 1 till antal ess. Kommer ett till ess, och antal ess är större eller lika med 1, räkna det som 1.

Denna kod är nästan 1 år gammal, så får ursäkta röran. Men hoppas du får ut något tips åtminstone
Det är en metod i min Deck class som skapar kortleken innan den blandas.

create() { const deck = []; const suits = ['Diamonds', 'Clubs', 'Hearts', 'Spades']; const values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']; for (const suit in suits) { for (const value in values) { const card = { suit: suits[suit], value: values[value], weight() { switch (this.value) { case "J": case "Q": case "K": return 10; case "A": return [1, 11]; default: return this.value; } } }; deck.push(card); } this.deck = deck; }

Detta ger dig då en kortlek med 52 kort där varje kort-objekt har en property för Suit, Value och en function för Weight().
Så kan du kontrollera vid poängräkningen, t.ex.

function calculateScore()... let acesInHand = 0; // loopa spelarens hand if(card.value === 'A') { if(acesInHand >= 1){ card.weight()[0] // 1 }else{ card.weight()[1] // 11 } acesInHand++; }

Permalänk
Hedersmedlem

@Howardtheory: Eftersom dina frågor behandlar olika delar av samma uppgift har jag sammanfogat dina trådar. Du behöver inte en ny tråd för varje delfråga och det hindrar andras frågor från att synas i forumet.

Permalänk

Hej!

behöver hjälp med en sak, vi har börjat med DOM nu med och vi har fått en uppgift att ta bort postnummret.

<footer> <div> Gnejsprodukter AB <p> Granitgatan 11a<br /> 377 62 ALFTA </p> </div></footer>

har provat detta

let adress = document.querySelector("footer div p"); let text = adress.innerHTML; let arr = text.indexOf("3"); text.slice(arr, 3);

men fungerar inte.

uppgiften är :
Gör så att postnumret i adressen försvinner när du klickar på den div som
innehåller den.

hur man kan lösa detta på bästa sätt?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem

@Howardtheory: Lägg en span runt postnummret och ett click-event på diven.
När eventet triggas så kör du .remove() på span:en

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem
Skrivet av Howardtheory:

Hej!

behöver hjälp med en sak, vi har börjat med DOM nu med och vi har fått en uppgift att ta bort postnummret.

<footer> <div> Gnejsprodukter AB <p> Granitgatan 11a<br /> 377 62 ALFTA </p> </div></footer>

har provat detta

let adress = document.querySelector("footer div p"); let text = adress.innerHTML; let arr = text.indexOf("3"); text.slice(arr, 3);

men fungerar inte.

uppgiften är :
Gör så att postnumret i adressen försvinner när du klickar på den div som
innehåller den.

hur man kan lösa detta på bästa sätt?

Om du inte får redigera HTML direkt genom att lägga in en span runt postnumret (som är den enklaste och smidigaste lösningen) så kan du använda Regex för att targeta postnumret.

adress.innerHTML.replace(/\d{3}\s\d{2}/gm, '');

\d{3} matchar alla siffror (0-9) som är 3 stycken irad.
\s matchar ett mellanslag eller tab.
\d{2} matchar alla siffror (0-9) som är 2 stycken irad.

Permalänk

@zaibuf: Tack, nä vi fick inte använda en span, tack för tipset om regex (Y)

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

får dock inte den att fungera, försöker med ett click event.

let adress = document.getElementsByTagName("footer div p"); adress.addEventListener("click", () => { adress.innerHTML.replace(/\d{3}\s\d{2}/gm, ""); });

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

@zaibuf: Tack, nä vi fick inte använda en span, tack för tipset om regex (Y)

Kan rekommendera regex101.com där du kan testa skriva regex och matcha mot text och även få förklaringar vad varje tecken gör.

let adress = document.getElementsByTagName("footer div p"); adress.addEventListener("click", () => { adress.innerHTML.replace(/\d{3}\s\d{2}/gm, ""); });

getElementByTagName kan inte ta nästade värden, det är bättre att använda querySelector.
Sen replace() returerar en ny sträng i detta fall, som du inte gör något med.
Så du måste sätta att innerHTML ska vara lika med nya värdet.

let adress = document.querySelector("footer > div > p"); adress.addEventListener("click", () => { adress.innerHTML = adress.innerHTML.replace(/\d{3}\s\d{2}/gm, ""); });

fiddle

Nu sätter du eventListenern på p taggen och uppgiften skrev att det skulle vara på diven.

Permalänk

@zaibuf: tack (Y)

verkar som jag får rött på backslash, vet inte varför direkt.

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

@zaibuf: tack (Y)

verkar som jag får rött på backslash, vet inte varför direkt.

Gör det för att påvisa att det är ett Regex. Regex skrivs inom / / istället för " " eller ' ' som är strängar.
Färgen beror på vilket tema du använder i din IDE.

Permalänk
Skrivet av zaibuf:

Kan rekommendera regex101.com där du kan testa skriva regex och matcha mot text och även få förklaringar vad varje tecken gör.

let adress = document.getElementsByTagName("footer div p"); adress.addEventListener("click", () => { adress.innerHTML.replace(/\d{3}\s\d{2}/gm, ""); });

getElementByTagName kan inte ta nästade värden, det är bättre att använda querySelector.
Sen replace() returerar en ny sträng i detta fall, som du inte gör något med.
Så du måste sätta att innerHTML ska vara lika med nya värdet.

let adress = document.querySelector("footer > div > p"); adress.addEventListener("click", () => { adress.innerHTML = adress.innerHTML.replace(/\d{3}\s\d{2}/gm, ""); });

fiddle

Nu sätter du eventListenern på p taggen och uppgiften skrev att det skulle vara på diven.

Tack för tipset.

Men hur hade du gjort annorlunda om du hade gjort detta själv?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

Tack för tipset.

Men hur hade du gjort annorlunda om du hade gjort detta själv?

Jag hade nog kört med regex, dock kanske du vill sätta eventlistenern på diven.
Så det blir en till querySelector för att plocka ut den. Då uppgiften sa att det var specifikt diven

Permalänk

har en uppgift i skolan nu som jag inte får till

Skriv kod som simulerar en webbshop (enbart i webbläsarens consol).
Genom att jag som användare skriver funktionsanropen nedan ska följande utföras:
• getCart()
Visar en lista på alla produkter
• getCart(2)
Visar information om produkten i listan som har ID = 2.

Hur hade ni skapat detta?

Skapade en funktion som heter getCart med en variabel butik med en array i med 5 olika sorters prylar.

fungerar när man skriver ut getCart()

men hur ska man få till getCart(2)

så man får tag på id=2 liksom?

kanske en function cunstroctor eller hur bör man göra?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk

provade liknande detta

let products = [ { id: 1, productName: "Skor", price: 2500 }, { id: 2, productName: "Jacka", price: 4500 }, { id: 3, productName: "Tröja", price: 1200 }, { id: 4, productName: "Byxor", price: 1600 } ]; let varukorg = []; function getProducts() { products.forEach(product => { console.log(product); if (product.id === 2) { console.log(products[1]); } }); } getProducts(2);

får ut både butik och id 2 nu, men tror inte det är på rätt sätt detta.

Hur kan man göra, en constructor function eller?

Visa signatur

Big Bang Theory
Howard Wolowitz

Permalänk
Medlem
Skrivet av Howardtheory:

har en uppgift i skolan nu som jag inte får till

Skriv kod som simulerar en webbshop (enbart i webbläsarens consol).
Genom att jag som användare skriver funktionsanropen nedan ska följande utföras:
• getCart()
Visar en lista på alla produkter
• getCart(2)
Visar information om produkten i listan som har ID = 2.

Hur hade ni skapat detta?

Skapade en funktion som heter getCart med en variabel butik med en array i med 5 olika sorters prylar.

fungerar när man skriver ut getCart()

men hur ska man få till getCart(2)

så man får tag på id=2 liksom?

kanske en function cunstroctor eller hur bör man göra?

Skrivet av Howardtheory:

provade liknande detta

let products = [ { id: 1, productName: "Skor", price: 2500 }, { id: 2, productName: "Jacka", price: 4500 }, { id: 3, productName: "Tröja", price: 1200 }, { id: 4, productName: "Byxor", price: 1600 } ]; let varukorg = []; function getProducts() { products.forEach(product => { console.log(product); if (product.id === 2) { console.log(products[1]); } }); } getProducts(2);

får ut både butik och id 2 nu, men tror inte det är på rätt sätt detta.

Hur kan man göra, en constructor function eller?

Du kanske ska skapa en egen tråd istället för att "hijacka" en annan tråd? Då din fråga inte relaterar till TS.

Hur som helst så kan jag svara på din fråga,
Konstigt att det beskrivs som getCart då Cart är en kundvagn. Men hen vill att den ska skriva ut alla produkter.
Är det då alla produkter i kundvagnen och med getCart(2) får du produkten i din kundvagn med id 2?
Eller har hen bara skrivit fel och menar produktlistan?
Du bör kunna ta exemplet nedan och applicera det i vilket fall

Du ta en inparameter till din function och med en simpel if-sats returera korrekt data.

const products = [ { id: 1, productName: "Skor", price: 2500 }, { id: 2, productName: "Jacka", price: 4500 }, { id: 3, productName: "Tröja", price: 1200 }, { id: 4, productName: "Byxor", price: 1600 } ]; function getCart(productId){ if(productId === undefined){ return products; } else { return products.find(({id}) => id === productId); } } console.log(getCart()); console.log(getCart(2));

Fiddle

Permalänk

@zaibuf: Tack för svaret!

Exakt, ska skapa en liten webshop liknande typ.
Där han ska få ut butikens innehåll (prodcuts) och få ut id2 med getCart(2).

Detta är min tråd, bara att jag skapade fler trådar, och admin ändrade detta till en och samma tråd med allt innehåll som jag har behövt hjälp med. Så blir lite nytt nu när man kommit vidare och längre fram i skolan.

Visa signatur

Big Bang Theory
Howard Wolowitz