2016-10-17 2 views
2

версия JSFiddle не работала, поэтому я добавил codepen вместо Working CodepenКак обновить переменную с помощью кнопки с JQuery или JavaScript

Я довольно новыми для JavaScript и JQuery, так что я прошу прощения если моя формулировка не совсем правильная, или если ответ предельно очевиден, я здесь, чтобы учиться :) Итак, я создал игру с ножницами из каменной бумаги, все отлично работает, кроме кнопки «Новая игра». Я не могу понять, как обновить переменную «computerChoice». Я смог установить его так, чтобы страница обновилась, но этого я не хочу достичь. Я хочу, чтобы при нажатии кнопки «Новая игра» переменная «computerChoice» выберет новую опцию в зависимости от случайного числа, например, при обновлении страницы. Я попытался установить его на null, когда вы нажимаете «Новая игра», но затем это просто возвращает числа, когда вы идете играть в игру.

HTML:

<h1>Rock Paper Scissors</h1> 
<h2>Pick your weapon!</h2> 
<p><button id="refresh">New Game</button></p> 
<button onClick='choose("rock")' class="choices">Rock</button> 
<button onClick='choose("paper")' class="choices">Paper</button> 
<button onClick='choose("scissors")' class="choices">Scissors</button> 
<p><button onClick='compare(user, computerChoice)' class="compares">1...2...3...</button></p> 
<p><b id="you">...</b> Vs. 
<b id="computer">...</b></p> 
<p><b id="results"></b></p> 

JavaScript:

//user choices 
var user; 
var choose = function(choice) { 
user = choice; 
//document.getElementById("you").innerHTML = user; 
} 

//computer choices 
var computerChoice = Math.random(); 
if (computerChoice < 0.34) { 
    computerChoice = "rock"; 
} 
else if (computerChoice < 0.67) { 
    computerChoice = "paper"; 
} 
else { 
    computerChoice = "scissors"; 
} 

//compare user choice to computer choice 
function compare(choice1, choice2) { 
if (choice1 === choice2) { 
    document.getElementById('results').innerHTML = "How boring, you tied."; 
} 
else if (choice1 === "rock") { 
    if (choice2 === "scissors") { 
    document.getElementById('results').innerHTML = "They'll feel that in the morning."; 
} else { 
    document.getElementById('results').innerHTML = "Can you breathe? I think not."; 
} 
} 
else if (choice1 === "scissors") { 
if (choice2 === "paper") { 
    document.getElementById('results').innerHTML = "Snippitysnip, you sliced them in two."; 
} else { 
    document.getElementById('results').innerHTML = "Ouch, looking a little blunt."; 
} 
} 
else if (choice1 === "paper") { 
if (choice2 === "rock") { 
    document.getElementById('results').innerHTML = "You smothered them, eesh!" 
} else { 
    document.getElementById('results').innerHTML = "You're looking a bit like a banana split." 
} 
} 
else { 
document.getElementById('results').innerHTML = "Something's not quite right...what did you do?!" 
} 
} 

// refresh, clear and display computer choices and results. Disable, enable buttons. 
function disableButtons() { 
    $('button.choices').attr('disabled', true); 
} 

function enableButtons() { 
    $('button.choices').attr('disabled', false); 
} 

$('.choices').click(function() { 
    $('#you').html(user); // this works on codepen but not on jsfiddle? D: 
    $('#computer').html('...'); 
    disableButtons(); 
}); 
$('#refresh').click(function() { 
    $('#results').html(''); 
    $('#you, #computer').html('...'); 
    enableButtons(); 
    refreshComputer(); 
}); 
$('.compares').click(function() { 
    $('#computer').html(computerChoice); 
}); 

версия JSFiddle не работала, поэтому я добавил codepen вместо Working Codepen

+0

Где находится 'refreshComputer'? –

+2

Проверьте консоль. Ошибки происходят повсюду, и большинство или все они связаны с областью переменных или функций. –

+0

Для более сложных вопросов, подобных этому, было бы лучше всего бросить его в [JSFiddle] (https://jsfiddle.net/) или [CodePen] (https://codepen.io/), заставить его работать там, тогда становится намного легче найти решение, которое помогает. – samanime

ответ

1

Ваш код выглядит хорошо, но, похоже, вы пытались смешивать javascript с jQuery с jQuery и добавляли некоторые (ненужные) обработчики внутри вашего html, возможно, как часть тестирования ваших различных параметров.

Я просто немного переработал ваш код, чтобы он обновлял выбор компьютеров при каждом нажатии кнопки «1..2..3» и что он использует JQuery для всех функций, где вы, кажется, используя его так или иначе (например, установив html через JQuery или с помощью опции innerHTML, которая является вашим собственным предпочтением, просто приятно иметь 1 кодовую базу, где весь код использует аналогичный способ делать вещи.

Btw, codepen или jsfiddle is хорошо, но этот сайт имеет совершенно правильный редактор сниппета, где вы можете также показать, как это выглядит, как после этого;)

$(function() { 
 
    // click function for choices 
 
    $('.choices').on('click', function(e) { 
 
    var choice = $(e.target).text(); 
 
    $('#you').html(choice); 
 
    disableButtons(); 
 
    }); 
 
    
 
    // click function for refresh 
 
    $('#refresh').click(function() { 
 
    $('#results').html(''); 
 
    $('#you, #computer').html('...'); 
 
    enableButtons(); 
 
    }); 
 
    
 
    // click function for 1..2..3 
 
    $('#compares').click(function() { 
 
    var computerChoice = getComputerChoice(), user = getUserChoice(); 
 
    $('#computer').html(computerChoice); 
 
    compare(user.toLowerCase(), computerChoice.toLowerCase()); 
 
    }); 
 
    
 
    // gets the previously stored userChoice 
 
    function getUserChoice() { 
 
    return $('#you').text(); 
 
    } 
 

 
    // gets a generated computer choice 
 
    function getComputerChoice() { 
 
    var computerChoice = Math.random(); 
 
    if (computerChoice < 0.34) { 
 
     computerChoice = "rock"; 
 
    } else if (computerChoice < 0.67) { 
 
     computerChoice = "paper"; 
 
    } else { 
 
     computerChoice = "scissors"; 
 
    } 
 
    return computerChoice; 
 
    } 
 

 
    //compare user choice to computer choice 
 
    function compare(choice1, choice2) { 
 
    var result; 
 
    if (choice1 === choice2) { 
 
     result = "How boring, you tied."; 
 
    } else if (choice1 === "rock") { 
 
     if (choice2 === "scissors") { 
 
     result = "They'll feel that in the morning."; 
 
     } else { 
 
     result = "Can you breathe? I think not."; 
 
     } 
 
    } else if (choice1 === "scissors") { 
 
     if (choice2 === "paper") { 
 
     result = "Snippitysnip, you sliced them in two."; 
 
     } else { 
 
     result = "Ouch, looking a little blunt."; 
 
     } 
 
    } else if (choice1 === "paper") { 
 
     if (choice2 === "rock") { 
 
     result = "You smothered them, eesh!" 
 
     } else { 
 
     result = "You're looking a bit like a banana split." 
 
     } 
 
    } else { 
 
     result = "Something's not quite right...what did you do?!" 
 
    } 
 
    $('#results').html(result); 
 
    } 
 

 
    // refresh, clear and display computer choices and results. Disable, enable buttons. 
 
    function disableButtons() { 
 
    $('button.choices').attr('disabled', true); 
 
    } 
 

 
    function enableButtons() { 
 
    $('button.choices').attr('disabled', false); 
 
    } 
 
});
body { 
 
    text-align: center; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h1>Rock Paper Scissors</h1> 
 
<h2>Pick your weapon!</h2> 
 
<p> 
 
    <button id="refresh">New Game</button> 
 
</p> 
 
<button class="choices">Rock</button> 
 
<button class="choices">Paper</button> 
 
<button class="choices">Scissors</button> 
 
<p> 
 
    <button id="compares">1...2...3...</button> 
 
</p> 
 
<p><b id="you">...</b> Vs. 
 
    <b id="computer">...</b> 
 
</p> 
 
<p><b id="results"></b> 
 
</p>

+0

Большое вам спасибо! Мне нужно сесть позже, чтобы понять все это: D – lmutton

+0

Вы могли бы объяснить эту строку для меня, var computerChoice = getComputerChoice(), user = getUserChoice(); – lmutton

+0

@lmutton Да, он объявляет 2 переменные, которые получают свои значения из соответствующих методов. 'getComputerChoice()' получает каждый раз новое сгенерированное значение, 'getUserChoice()' получает текст, который ранее был установлен, нажав кнопки из html. Эти два значения затем отправляются как параметр функции 'compare'. Есть ли другая часть этого заявления, которое вы хотите объяснить? – Icepickle

0

Почему бы вам не создать функции newgame и дать значение computerChoice там. Объявите переменную перед функцией

var computerChoice = 0 

function newgame(){ 
computerChoice = Math.Random() 
} 

и вызвать эту функцию по нажатию кнопки на NewGame.

<button onclick="newgame()">New Game</button> 

Позвольте мне знать, если вы хотите что-то другое, и я буду обновлять мой ответ

+0

. Кажется, это не работает, я просто вернусь вместо рок-бумаги или ножниц. – lmutton

+0

@lmutton Я немного обновил свой ответ, вы также можете отладить код, чтобы проверить, где именно вы получаете 0 после запуска с обновленным кодом. –

0

Прежде всего, чтобы ответить на ваш вопрос:

Вы можете «обновить» (изменить значение) продукта в виде переменную путем преобразования ее в вычисленную переменную (или, другими словами, сделать функцию, которая каждый раз, когда она выполняется, генерирует новое случайное число и возвращает его.) Посмотрите мой код ниже и функцию computerChoice.

Продолжая более подробно: вы делаете (по крайней мере) две вещи неправильно:

  1. смесительные jQuery's click method с родным (инлайн) onClick event handler.
  2. используя встроенные обработчики нажмите
  3. смесительных getElementByID с выбором JQuery элементов

В общем, добавляя большую библиотеку в проекте, а не с помощью методов и инструментов, не имеют никакого смысла.

Если вам нужен jQuery в вашем проекте (возможно, не для таких простых программ), лучше пойдите с the .on() method, который даст вам немного больше возможностей сделать что-то, что называется event delegation.

Вы должны удалить свои встроенные обработчики кликов, это определенность:

<button class="js-choices">Rock</button> 
<button class="js-choices">Paper</button> 
<button class="js-choices">Scissors</button> 

затем присоединить обработчик событий на js-choices элемент, используя делегирование событий:

$('body').on('click', '.js-choices', function() { 
    choose($(this).text()); 
}); 

function choose(choice) { 
    user = choice; 
} 

Я прошел через свой код и заставил его работать. Я видел следующие дополнительные проблемы:

  1. вы используете слишком много if S: что почти всегда является хорошим кандидатом для switch statements
  2. вы имели логические дыры в ваших условиях (при сравнении по значению Math.random ())

отрезала ниже не является совершенным, но это, безусловно, улучшение:

var user; 
 

 
$('body').on('click', '.js-choices', function() { 
 
    user = $(this).text(); 
 
    $('#you').html(user); 
 
    $('#computer').html('...'); 
 
    disableButtons(); 
 
}); 
 

 

 
//computer choices 
 
function computerChoice() { 
 
    var temp = Math.random(); 
 
    if (temp < 0.34) { 
 
    return "rock"; 
 
    } 
 
    if (temp >= 0.34 && temp < 0.67) { 
 
    return "paper"; 
 
    } else { 
 
    return "scissors"; 
 
    } 
 
} 
 

 
//compare user choice to computer choice 
 

 
// cache your results element to only access it 1 time and improve performance 
 
// the naming convention says, use a variable with a '$' in front if its 
 
// a jquery object 
 

 
var $results = $('#results'); 
 

 
function compare(user, computer) { 
 
    if (user === computer) { 
 
    $results.text("How boring, you tied."); 
 
    } else if (user === "rock") { 
 
    if (computer === "scissors") { 
 
     $results.text("They'll feel that in the morning."); 
 
    } else { 
 
     $results.text("Can you breathe? I think not."); 
 
    } 
 
    } else if (user === "scissors") { 
 
    if (computer === "paper") { 
 
     $results.text("Snippitysnip, you sliced them in two."); 
 
    } else { 
 
     $results.text("Ouch, looking a little blunt."); 
 
    } 
 
    } else if (user === "paper") { 
 
    if (computer === "rock") { 
 
     $results.text("You smothered them, eesh!"); 
 
    } else { 
 
     $results.text("You're looking a bit like a banana split."); 
 
    } 
 
    } else { 
 
    $results.text("Something's not quite right...what did you do?!"); 
 
    } 
 
} 
 

 
// refresh, clear and display computer choices and results. Disable, enable buttons. 
 
function disableButtons() { 
 
    $('.js-choices').attr('disabled', true); 
 
} 
 

 
function enableButtons() { 
 
    $('.js-choices').attr('disabled', false); 
 
} 
 

 
$('#refresh').click(function() { 
 
    $('#results').html(''); 
 
    $('#you, #computer').html('...'); 
 
    computerChoice(); 
 
    enableButtons(); 
 
}); 
 
$('.js-play').click(function() { 
 
    compare(user, computerChoice()); 
 
    $('#computer').html(computerChoice); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<h1>Rock Paper Scissors</h1> 
 
<h2>Pick your weapon!</h2> 
 
<p> 
 
    <button id="refresh">New Game</button> 
 
</p> 
 
<button class="js-choices">rock</button> 
 
<button class="js-choices">paper</button> 
 
<button class="js-choices">scissors</button> 
 
<p> 
 
    <button class="js-play">1...2...3...</button> 
 
</p> 
 
<p><b id="you">...</b> Vs. 
 
    <b id="computer">...</b></p> 
 
<p><b id="results"></b></p>

+0

Я бы согласился с большинством ваших рефакторингов, но вы вызываете функцию сравнения без аргументов, которые связывают игру при каждой попытке (хотя я думаю, что это был надзор с вашей стороны;)). – Icepickle

+0

действительно :) Я просто поправлял вещи. Функция compare() вообще беспорядок ... Вложенные ifs .. –

+0

Это не плохо для первой попытки, блокировки областей, устойчивое использование точки с запятой, конечно, ее можно улучшить, но, честно говоря, я делаю помните и у вас есть старый код, где я тоже думаю, ouch;) Кстати, не было бы полезно установить результат сразу после всех ifs? :) Повторяя заявление так часто, дает возможность исключить его и устанавливать только один раз :) – Icepickle

Смежные вопросы