Я работаю над личным проектом / смотрю уроки, чтобы развлечься, создавая игру для школы. В конце концов, это военная карточная игра, в которую я играл в детстве - побеждает наибольшее число. Я пытаюсь рандомизировать свой массив карточек, у меня есть 52 объекта, которые хранятся так, как я хочу, но теперь я столкнулся с этим препятствием.
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>
War Cards!
</title>
</head>
<body>
<div id = "wrapper">
<div id = "start"></div>
<div id = "message"></div>
<div id = "board">
<div id = "player1" class = "players">
<div class = "score"></div>
<div class = "hand"></div>
</div>
<div id = "player2">
<div class = "score"></div>
<div class = "hand"></div>
</div>
</div>
<div id = "action">
<button id = "btnBattle" type = "button" class = "btn">
Fight!
</button>
</div>
</div>
<script src = "js/jquery-3.3.1.min.js">
</script>
<script>
$('document').ready(function() {
var suits = ["spades", "hearts", "clubs", "diams"];
var cardFace = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
var cards = [];
var players = [[], []];
var firstRun = true;
var fightButton = document.querySelector("#btnBattle");
fightButton.addEventListener('click', battle);
function battle()
{
if (firstRun)
{
firstRun = false;
buildCards();
shuffleArray();
}
console.info('Works');
}
function buildCards()
{
cards = [];
for (s in suits)
{
var suitNew = suits[s][0].toUpperCase();
for(n in cardFace)
{
var card = {
suit:suits[s],
num:cardFace[n],
cardValue:parseInt(n) +2,
icon:suitNew
}
cards.push(card);
}
}
console.info(cards);
}
function shuffleArray(array)
{
for(var x = array.length -1; x > 0; x--)
{
var ii = Math.floor(Math.random() * (x + 1))
var temp = array[x];
console.info(temp)
}
return array;
}
});
</script>
</body>
</html>
Не забудьте объявить переменные s
и n
внутри функции buildCards
...
Избегайте добавления всего в глобальную область видимости. Ниже я возвращаю карты из buildCards()
и передаю карты в shuffleArray()
(который я скопировал из здесь, поскольку ваша исходная функция shuffleArray
фактически не перемещала какие-либо элементы):
var suits = ["spades", "hearts", "clubs", "diams"];
var cardFace = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
var players = [[], []];
var firstRun = true;
function battle()
{
if (firstRun)
{
firstRun = false;
var cards = buildCards();
var randomized = shuffleArray(cards);
console.info(randomized);
}
console.info('Works');
}
function buildCards()
{
var cards = [];
for (s in suits)
{
var suitNew = suits[s][0].toUpperCase();
for(n in cardFace)
{
var card = {
suit:suits[s],
num:cardFace[n],
cardValue:parseInt(n) +2,
icon:suitNew
}
cards.push(card);
}
}
return cards;
}
function shuffleArray(array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
battle();
Это работает! Я понимаю все, что вы делали, вплоть до функции shuffleArray, не могли бы вы объяснить эту часть немного подробнее? У меня всего 4 недели в классе javascript, ха-ха
Что вы хотите знать о функции shuffleArray? Я просто искал в Google "fisher-yates shuffle javascript", нашел первый метод и скопировал его отсюда: bost.ocks.org/mike/shuffle
@FrankerZ, эта конкретная функция перемешивания уничтожает свой входной массив как часть своей логики реализации .. Ой!
@ traktor53 Как ни странно, я должен был прочитать весь пост. Лучшая реализация была в конце (в результате я обновил свой пост)
Кажется, существует проблема с различием между формальными и фактическими аргументами при объявлении и вызове функций.
Формальные аргументы
Когда вы объявляете функцию, вы даете ее аргументам имена параметров формальный, чтобы вы могли ссылаться на них внутри функции. У них нет фактического значения до вызова функции. НАПРИМЕР. в объявлении функции перемешивания
function shuffle( array) {....
array
- формальный аргумент.
Фактические аргументы
Формальные аргументы заменяются фактическими аргументами при вызове функции.
НАПРИМЕР. чтобы перемешать массив cards
, вы бы назвали shuffle
как
shuffle( cards);
предоставление cards
в качестве аргумента действительный.
Обратите внимание, что функция перемешивания, похоже, реализует алгоритм Фишера-Йейтса, но в ней отсутствуют две строки, которые меняют местами записи массива x
и ii
.
Вот копия функции перемешивания с отсутствующими строками:
function shuffle( a) { // fisher yates algorithm ;
for( var i = a.length; --i;) {
var j = Math.floor( Math.random() * (i+1));
var temp = a[i]; // swap entries at i and j
a[i] = a[j];
a[j] = temp;
}
}
Вы можете изменить формальное имя параметра a
и ссылки на него в теле функции на array
, если хотите.
Обратите внимание, что элементы массива перемешиваются «на месте», поэтому нет необходимости возвращать значение параметра массива, поскольку оно не изменилось.
См. Перемешивание Фишера-Йетса. Это довольно просто реализовать.