2010-11-16 5 views
0

J'ai un jeu jquery que mes membres continuent de trouver des façons de gagner. C'est le jeu des nombres ici link text.désactiver cliquez sur hover

J'ai fait le jeu donc vous ne pouvez pas le jouer sur firefox, je ne sais pas si les autres navigateurs ont les mêmes outils de triche que firefox.

Le premier problème que j'avais, c'était que les joueurs pouvaient garder leur souris sur une case jusqu'à ce que leur numéro apparaisse, puis ils cliquaient dessus. Pour résoudre ce problème (avec l'aide d'un génie sur stackoverflow), nous l'avons fait pour que vous ne puissiez pas cliquer deux fois de suite sur la même case. Mais maintenant c'est le même problème, ils vont simplement se déplacer dans une autre boîte et garder leur souris jusqu'à ce qu'ils voient leur numéro. Alors maintenant je dois faire en sorte que si ils sur une boîte pendant plus de x nombre de secondes, ils ne seront pas en mesure de cliquer sur cette case. Un compte à rebours peut simplement faire l'affaire et éliminer le script Hover. S'il vous plaît, aidez avec qui vous pouvez. Voici le script.

var hitCount = 0, 
missCount = 0; 

function IsNumeric(n) { 
return !isNaN(n); 
} 

$("#getit").click(function() { 
var hitCount = 0, 
missCount = 0; 
$('#misscount').text(0); 
$('#hitcount').text(0); 
$('#message').hide(100);   
$('#randomnumber').empty(); 
$('#randomnumber').show(300);  
var li = [], 
    intervals = 0, 
    n = parseInt($('#MyNumber').val()); 

if (IsNumeric(n)) { 
    intervalId= setInterval(function() { 
     li[intervals++ % li.length].text(Math.random() > .1 ? Math.floor(Math.random() * (10 + n) + (n/2)) : n).attr('class', '') ; 
    }, <?php echo $time ?>); 
} 

$('#randomnumber').empty(); 

for (var i = 0; i < 7; i++) { 
    li.push($('<li />').one('click', function() { 
     BoxClick.call(this, n); 
    }).appendTo('#randomnumber')); 
} 


function BoxClick(n) { 
var $this = $(this); 
$('#randomnumber li').unbind().one('click', function() { 
     BoxClick.call(this,n); 
}); 
$this.unbind(); 

if (!$this.hasClass('clicked')) { 
    if (parseInt($this.text(), 10) === n) { 
     $this.addClass('correct'); 
     $('#hitcount').text(++hitCount); 
    } else { 
     $this.addClass('wrong'); 
     $('#misscount').text(++missCount); 
    } 
} 
      if(missCount==<?php echo $limit ?>){ 
       clearInterval(intervalId); 
       $('#randomnumber').hide(300); 

       $.ajax({ 
type : 'POST', 
url : 'FBhighscore_hwnd.php', 
dataType : 'json', 
data: { 
tgameid: $('#tgameid').val(),MyNumber: $('#MyNumber').val(),totalHits: hitCount 
}, 
success : function(data){ 
$('#waiting').hide(500); 
$('#message').removeClass().addClass((data.error === true) ? 'error' : 'success') 
.text(data.msg).show(500); 
if (data.error === true) 
$('#loginForm').show(500); 
else 
$('#send').hide(500);  
}, 
error : function(XMLHttpRequest, textStatus, errorThrown) { 
$('#waiting').hide(500); 
$('#message').removeClass().addClass('error') 
.text('There was an error.').show(500); 
$('#loginForm').show(500); 
} 
}); 

      } 


$this.addClass('clicked'); 
} 
return false; 
}); 
+4

* "J'ai créé le jeu de sorte que vous ne pouvez pas le lire sur Firefox, je ne sais pas si les autres navigateurs ont les mêmes outils de triche que Firefox." * Oui. ** Rien ** côté client ne peut faire confiance, il peut ** tout ** être truqué. Tout ce que vous recevez du client, vous devez valider sur le serveur. –

Répondre

2

Vous pouvez facilement vous rappeler quand ils ont regardé en vol stationnaire. En utilisant un exemple simplifié d'une travée avec l'ID « conteneur » contenant travées l'utilisateur cliquait sur:

jQuery(function($) { 

    var container, n; 
    var HOVER_THRESHOLD = 1000; // Milliseconds 

    // Build the grid 
    container = $('#container'); 
    for (n = 0; n < 16; ++n) { 
    $("<span>0</span>").appendTo(container).data("hoverStart", 0); 
    } 

    // Watch for hovers and clicks on the elements 
    container.find('span') 
    .hover(startHover, stopHover) 
    .click(handleClick); 

    // At hover start, remember when we started 
    function startHover() { 
    $(this).data("hoverStart", new Date().getTime()); 
    } 

    // At hover end, clear the hover thingy 
    function stopHover() { 
    $(this).data("hoverStart", 0); 
    } 

    // On click, check how long they've been hovering 
    function handleClick() { 
    var $this, startHover; 

    $this = $(this); 
    startHover = $this.data("hoverStart"); 

    // Hovering too long? 
    if (startHover != 0 
     && (new Date().getTime() - startHover) > HOVER_THRESHOLD) { 
     // Yes 
     $this.css("color", "red"); 
     setTimeout(function() { 
     $this.css("color", ""); 
     }, 500); 
    } 
    else { 
     // No, allow click 
     $this.html(parseInt($this.html(), 10) + 1); 
    } 
    } 
});​ 

Live example

Ou vous pouvez faire la chose plus complexe (mais proactive) avec des minuteries:

jQuery(function($) { 

    var container, n; 
    var HOVER_THRESHOLD = 1000; // Milliseconds 

    // Build the grid 
    container = $('#container'); 
    for (n = 0; n < 16; ++n) { 
    $("<span>0</span>").appendTo(container).data("hoverTimer", 0); 
    } 

    // Watch for hovers and clicks on the elements 
    container.find('span') 
    .hover(startHover, stopHover) 
    .click(handleClick); 

    // At hover start, start a timer 
    function startHover() { 
    var $this = $(this); 
    $this.data("hoverTimer", setTimeout(function() { 
     $this.addClass("disabled"); 
    }, HOVER_THRESHOLD)); 
    } 

    // At hover end, clear the timer 
    function stopHover() { 
    var $this, timer; 

    $this = $(this); 
    $this.removeClass("disabled"); // May or may not have it 
    timer = $this.data("hoverTimer"); 
    if (timer != 0) { 
     clearTimeout(timer); 
     $this.data("hoverTimer", 0); 
    } 
    } 

    // On click, check how long they've been hovering 
    function handleClick() { 
    var $this; 

    $this = $(this); 

    // Hovering too long? 
    if ($this.hasClass("disabled")) { 
     // Yes, disallow the click 
    } 
    else { 
     // No, allow click 
     $this.html(parseInt($this.html(), 10) + 1); 
     // If you want to reset the hover timer on click: 
     stopHover.call(this); 
     startHover.call(this); 
    } 
    } 
});​ 

Live example

Mais encore une fois, comme je l'ai dit dans mon commentaire, vous ne pouvez pas faire confiance tout les données qui vous sont envoyées par le client pour ce genre de chose, il y a trop d'outils pour déboguer les applications web (ce qui est une bonne chose!) Ou tout simplement fausser les messages HTTP. Dans votre cas, je ne pense pas qu'il soit possible de différencier un joueur surdoué d'un fake doué (les faussaires à la main que vous pouvez probablement comprendre à partir des données).

+0

WOW merci beaucoup pour le grand détail. J'essaie d'ajouter ceci à mon script actuel maintenant. –

+0

J'ai joué avec cela pendant des heures. Le setInterval de mon script provoque la réinitialisation du hover lorsque le script est actualisé, ce qui le rend à nouveau actif. Ceci est une question difficile. –