#javascript #html #jquery
#javascript #HTML #jquery
Вопрос:
Я создаю игру в войну между игроком и компьютером. Когда я нажимаю кнопку раздачи, массив перетасовывается для каждого игрока. При нажатии кнопки воспроизведения массив карт отображается в div в виде изображений. Проблема, с которой я сталкиваюсь, заключается в том, что карты повторяются, и мне нужна помощь в том, как сделать так, чтобы они не повторялись. Вот мой JS:
$(document).ready(function() {
document.getElementById('play').disabled = true;
function card(name, suit, value, trump) {
this.name = name;
this.suit = suit;
this.value = value;
this.trump = trump;
}
var deck = [
new card('Ace', 'Hearts', 11, 142),
new card('Two', 'Hearts', 2, 22),
new card('Three', 'Hearts', 3, 32),
new card('Four', 'Hearts', 4, 42),
new card('Five', 'Hearts', 5, 52),
new card('Six', 'Hearts', 6, 62),
new card('Seven', 'Hearts', 7, 72),
new card('Eight', 'Hearts', 8, 82),
new card('Nine', 'Hearts', 9, 92),
new card('Ten', 'Hearts', 10, 102),
new card('Jack', 'Hearts', 10, 112),
new card('Queen', 'Hearts', 10, 122),
new card('King', 'Hearts', 10, 132),
new card('Ace', 'Diamonds', 11, 141),
new card('Two', 'Diamonds', 2, 21),
new card('Three', 'Diamonds', 3, 31),
new card('Four', 'Diamonds', 4, 41),
new card('Five', 'Diamonds', 5, 51),
new card('Six', 'Diamonds', 6, 61),
new card('Seven', 'Diamonds', 7, 71),
new card('Eight', 'Diamonds', 8, 81),
new card('Nine', 'Diamonds', 9, 91),
new card('Ten', 'Diamonds', 10, 101),
new card('Jack', 'Diamonds', 10, 111),
new card('Queen', 'Diamonds', 10, 121),
new card('King', 'Diamonds', 10, 131),
new card('Ace', 'Clubs', 11, 143),
new card('Two', 'Clubs', 2, 23),
new card('Three', 'Clubs', 3, 33),
new card('Four', 'Clubs', 4, 43),
new card('Five', 'Clubs', 5, 53),
new card('Six', 'Clubs', 6, 63),
new card('Seven', 'Clubs', 7, 73),
new card('Eight', 'Clubs', 8, 83),
new card('Nine', 'Clubs', 9, 93),
new card('Ten', 'Clubs', 10, 103),
new card('Jack', 'Clubs', 10, 113),
new card('Queen', 'Clubs', 10, 123),
new card('King', 'Clubs', 10, 133),
new card('Ace', 'Spades', 11, 144),
new card('Two', 'Spades', 2, 24),
new card('Three', 'Spades', 3, 34),
new card('Four', 'Spades', 4, 44),
new card('Five', 'Spades', 5, 54),
new card('Six', 'Spades', 6, 64),
new card('Seven', 'Spades', 7, 74),
new card('Eight', 'Spades', 8, 84),
new card('Nine', 'Spades', 9, 94),
new card('Ten', 'Spades', 10, 104),
new card('Jack', 'Spades', 10, 114),
new card('Queen', 'Spades', 10, 124),
new card('King', 'Spades', 10, 134)
];
// var test = '!$.inArray(index, used_cards) > -1';
// console.log('test ' test);
var used_cards = new Array();
// var pTotal = 0;
// pTotal = pTotal deck[num1].value deck[num2].value;
function getRandom(num) {
var my_num = Math.floor(Math.random() *num);
return my_num;
}
function playerHit() {
var good_player_card = false;
do{
var index = getRandom(52);
if ( !$.inArray(index, used_cards) > -1) {
good_player_card = true;
var c = deck[index];
used_cards[used_cards.length] = index;
$("<img>")
.attr('src', 'images/' c.suit '/' c.name '.jpg')
.appendTo('#pHand')
.fadeIn('1000');
}
}while (!good_player_card);
good_player_card = false;
}
function slickHit() {
var good_slick_card = false;
do{
var index = getRandom(52);
if ( !$.inArray(index, used_cards) > -1) {
good_slick_card = true;
var c = deck[index];
used_cards[used_cards.length] = index;
$("<img>")
.attr('src', 'images/' c.suit '/' c.name '.jpg')
.appendTo('#cHand')
.fadeIn('1500');
}
}while (!good_slick_card);
good_slick_card = false;
}
/* function slickHit() {
var index = getRandom)(52)
$.inArray(index)
} */
$('#deal').one('click', function(){
var player = prompt("Please enter your name.")
if (player != null) {
document.getElementsByClassName("pName")[0].innerHTML = player;
document.getElementsByClassName("pName")[1].innerHTML = player;
}
document.getElementById('play').disabled = false;
let card_count = 26;
$('#cardCount').innerHTML = card_count;
});
$('#play').click(function(){
$('img').remove();
playerHit();
slickHit();
});
$("#newPlayer").click(function(){
var newPlayer = prompt("Please enter your name.")
if (newPlayer != null) {
document.getElementsByClassName("pName")[0].innerHTML = newPlayer;
document.getElementsByClassName("pName")[1].innerHTML = newPlayer;
}
playerHit();
slickHit();
$('img').remove();
});
});
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Card Game</title>
<link href="styles/normalilze.css" rel="stylesheet">
<link href="styles/my_style.css" rel="stylesheet">
</head>
<body>
<div id="main">
<h1> Card Game </h1>
<div id="left">
<div id="pHand">
<br />
<!-- Using JavaScript replace the word 'Player' with the name of
the person playing the game-->
<h2 class="pName">Player</h2>
</div>
<div id="cHand">
<h2>Slick</h2>
</div>
<div id="but">
<button id="newPlayer">New player</button>
<button id="deal">Deal</button>
<button id="play">Play</button>
</div>
</div>
<div id='right'>
<h2>Card Count:</h2>
<!-- Using JavaSCript enter the number of remaining cards in the 'Players' hand
in the p tag below-->
<p id="cardCount"></p>
<br />
<!-- Using JavaSCript replace the word 'Player' with the name of
the person playing the game-->
<h2 class="pName">Player</h2>
<h2 id="pName2">:</h2>
<!-- Using jQuery insert the current 'Player' score in the p tag
below -->
<p id="pScore"></p>
<br />
<h2 id="cName">Slick:</h2>
<!-- Using jQuery insert the current 'Slick' score in the p tag
below -->
<p id="cScore"></p>
<!-- add and style winning message in the
following div -->
<div id="win"> </div>
</div>
</div>
<script src="scripts/jquery-3.2.1.min.js"></script>
<script src="scripts/jQ-War.js"></script>
</body>
</html>
Помощь приветствуется!
Комментарии:
1. Не создавайте 52 случайных индекса в своей колоде карт. Просто пройдите по массиву карт и поменяйте каждую из них на другую, выбранную случайным образом.
2. Как бы это выглядело? Я довольно новичок в массивах.
3. ваша
deck
переменная представляет собой массив. Я опубликую пример.
Ответ №1:
"use strict";
window.addEventListener('load', onLoaded, false);
function onLoaded(evt)
{
method1();
console.log('----------');
method2();
}
class cardT
{
constructor(name, suit, value, trump)
{
this.name = name;
this.suit = suit;
this.value = value;
this.trump = trump;
}
}
function method1()
{
// Method 1, yours
var cards = [
new cardT('Ace', 'Hearts', 11, 142),
new cardT('Two', 'Hearts', 2, 22),
new cardT('Three', 'Hearts', 3, 32),
new cardT('Four', 'Hearts', 4, 42),
new cardT('Five', 'Hearts', 5, 52),
new cardT('Six', 'Hearts', 6, 62),
new cardT('Seven', 'Hearts', 7, 72),
new cardT('Eight', 'Hearts', 8, 82),
new cardT('Nine', 'Hearts', 9, 92),
new cardT('Ten', 'Hearts', 10, 102),
];
// keep record of the randomly chosen indices
var indices = [];
for (var i=0; i<cards.length; i )
{
let curIndex = Math.floor(Math.random()*cards.length);
indices.push(curIndex);
console.log( cards[curIndex].name, cards[curIndex].suit );
}
console.log(indices);
}
function method2()
{
var cards = [
new cardT('Ace', 'Hearts', 11, 142),
new cardT('Two', 'Hearts', 2, 22),
new cardT('Three', 'Hearts', 3, 32),
new cardT('Four', 'Hearts', 4, 42),
new cardT('Five', 'Hearts', 5, 52),
new cardT('Six', 'Hearts', 6, 62),
new cardT('Seven', 'Hearts', 7, 72),
new cardT('Eight', 'Hearts', 8, 82),
new cardT('Nine', 'Hearts', 9, 92),
new cardT('Ten', 'Hearts', 10, 102),
];
for (var index=0; index<cards.length; index )
{
// pick a position at random
var randIndex = Math.floor(Math.random()*cards.length);
// swap the current card with the randomly chosen one
var tmp = cards[index];
cards[index] = cards[randIndex];
cards[randIndex] = tmp;
}
// display them all
for (var i=0; i<cards.length; i )
{
console.log(cards[i].name, cards[i].suit);
}
}