Simple number picking game (jQuery)
-
27-06-2021 - |
Question
First, hello. Great forum/site here :)
I have been working on my personal site for whole weekend and now I'm stuck with this "game" idea which I would like to add my site. I know HTML and CSS pretty well but I'm quite new with JS/jQuery.
Let me try to explain from user experience what (s)he should be able to do with the "game".
There is 10 numbers from where users selects 3 numbers and also 2 extra numbers from new numbers list (11-15). These selected numbers then go to another div (or something). From this point I can do my stuff with PHP. But I'm completly stuck with this part. I know, I know its quite simple but braing must be frozen from coding my site for 48hours :D
Select 5 numbers from these: 1-2-3-4-5-6-7-8-9-10 Select 2 additional numbers from there: 11-12-13-14-15
And those selected numbers should be shown with jQuery in div like this: Normal: 2-3-6-7-8 Extra: 12-14
User can also clear selected numbers (if (s)he wants to select different numbers all together) and/or remove one number and select new one. When the 5/2 numbers are selected all the other numbers should somehow disable so user cannot select more than 5/2 numbers.
Also it would be cool if user could randomly select the numbers (clicking some button and it automatically selects 5+2 numbers). But I have no clue how this could be done?
Now numbers selecting probably could be done with something like this?
//5 numbers
$("#mainNumbers div").click(function) {
var selectedNumber = $(this).text().clone();
$("#selectedMainNumbers").append("<div>"+selectedNumber+"</div>");
}
//2 extra numbers
$("#extraNumbers div").click(function) {
var selectedNumber = $(this).text().clone();
$("#selectedExtraNumbers").append("<div>"+selectedNumber+"</div>");
}
Clearing selection maybe like this?
$("#clearNumbers").click(function) {
$("#selectedMainNumbers, #selectedExtraNumbers").empty();
}
Do those look ok? Or could those done better somehow.
And now the part that I have no idea. How numbers sorting should be done? Use Arrays? For example, user first clicks number 5 and that is added to the #selectedMainNumbers div and then he selects 2 and its added to #selectedMainNumbers div aswell, and it looks like 8-3 now, but I would like to have numbers is numeric order always, so the numbers should be 3-8 format.
Also how the random number picking should be done? What about the disabling number selecting if user has already selected the needed 5 numbers?
Phew this is long post. Sorry about that. And hopefully you can give me some hint.. since my brain isnt working atm :/ Thank you. Ask if something isnt clear.
Solution
jsBin demo
HTML:
<div id="mainNumbers"></div>
<div id="extraNumbers"></div>
<div id="selected_mainNumbers"></div>
<div id="selected_extraNumbers"></div>
<br /> <button id="generateNumbers">Generate random numbers</button>
<br /> <button id="clearNumbers">Clear selected</button>
CSS:
#mainNumbers, #extraNumbers{
margin:5px;
padding:16px;
background:#345;
}
#mainNumbers div,
#extraNumbers div,
#selected_mainNumbers div,
#selected_extraNumbers div
{
cursor:pointer;
display:inline;
background:#eee;
padding:5px 10px;
border-radius:10px;
margin:3px;
}
#selected_mainNumbers, #selected_extraNumbers{
margin-top:5px;
padding:16px;
height:20px;
background:#789;
}
.selectedNum{
opacity:0.5;
}
#selected_mainNumbers div,
#selected_extraNumbers div{
opacity:1;
background:gold;
}
jQuery:
// generate buttons with numbers
for(i=1;i<=15;i++){
var appendWhile= i<=10 ?
$('#mainNumbers').append('<div>'+ i +'</div>') :
$('#extraNumbers').append('<div>'+ i +'</div>') ;
}
// create arrays for selected numbers
var mainNumbers=[], extraNumbers=[];
// function print array ///
function printArray(name, arrName){
$('#selected_'+name).empty();
for(a=0;a<arrName.length;a++){
$('#selected_'+name).append('<div>'+ arrName[a]+'</div>');
}
}
// select function ////////
function selectNum(clickedElement, name, len){
var arrName = window[name]; // convert string to var
var num = parseInt( $(clickedElement).text(), 10 );
if( arrName.length < len && $.inArray(num,arrName) == -1 ) {
arrName.push(num);
arrName.sort(function(a,b){return a-b;}); // sort numerically
printArray(name, arrName);
$(clickedElement).addClass('selectedNum');
}else{
$(clickedElement).parent().fadeTo(0,0.3).fadeTo(400,1); // visually alert array is full
}
}
// remove function ///////////
function removeFromArr(clickedElement,arrName){
var num = parseInt( $(clickedElement).text(), 10 );
for(i=0;i<arrName.length;i++){
if(arrName[i]==num){
arrName.splice(i,1);
$(clickedElement).remove();
}
}
}
// clear function
function clearAll(){
mainNumbers=[], extraNumbers=[]; // reset arrays
$('#selected_mainNumbers, #selected_extraNumbers').empty(); // remove selected buttons
$('.selectedNum').removeClass(); // reset 'selected' states
}
// clicks ////////////////////
$('#mainNumbers, #extraNumbers').on('click','div',function(){
var len = $(this).parent().attr('id')=='mainNumbers' ? 5 : 2;
selectNum( $(this), $(this).parent().attr('id'), len );
});
$('#selected_mainNumbers, #selected_extraNumbers').on('click','div',function(){
var arrName = $(this).parent().attr('id').split('selected_')[1];
$('#'+arrName).find('div:contains('+$(this).text()+')').removeClass('selectedNum');
removeFromArr( $(this), window[arrName] );
});
// clear all /////////////////
$('#clearNumbers').click(function(){
clearAll();
});
// generate random ///////////
$('#generateNumbers').click(function(){
clearAll();
for(r=0;r<5;r++){
var n = Math.ceil(Math.random() * 10);
while ($.inArray(n, mainNumbers) > -1){ // loop until no match found
n = Math.ceil(Math.random() * 10);
}
mainNumbers[r] = n;
$('#mainNumbers div').eq(n-1).addClass('selectedNum');
}
for(rr=0;rr<2;rr++){
var nn = Math.ceil(Math.random() * (15-10)+10);
while ($.inArray(nn, extraNumbers) > -1){
nn = Math.ceil(Math.random() * (15-10)+10);
}
extraNumbers[rr] = nn;
$('#extraNumbers div').eq(nn-10-1).addClass('selectedNum');
}
mainNumbers.sort(function(a,b){return a-b;}); // sort array
extraNumbers.sort(function(a,b){return a-b;}); // sort array
printArray( 'mainNumbers', mainNumbers );
printArray('extraNumbers', extraNumbers);
});
OTHER TIPS
What about this: http://jsfiddle.net/ABetK/ ?
And if you want to send it to the server, use a form: http://jsfiddle.net/ABetK/1/
Edit:
It seems I didn't read all the question, so my jsfiddle doesn't do all that user1610229 wants.
Dan Barzilay finished my code: http://jsfiddle.net/Crn45/