Cherchobjet

Soyez le premier à donner votre avis sur cette source.

Vue 7 194 fois - Téléchargée 404 fois

Description

C'est un jeu dont le principe est de trouver des objets cachés dans un tableau en un temps et en un nombre d'essais limités (voir le résultat). les paramètres de jeu sont modifiables sans changer la source du code.

Source / Exemple :


<html><head>
<title></title>
<script type="text/javascript">
<!--

	if (window.location.search != "") {
	longueur = window.location.search.length - 1;
	data = window.location.search.substr(1,longueur);
	donnees = data.split("&");
	urlvar = new Array();
	urlvarnum = new Array();
		for (var i=0; i < donnees.length; i++) {
		position = donnees[i].indexOf("=");
		variable = donnees[i].substr(0,position);
		pos = position + 1;
		valeur = decodeURI(donnees[i].substr(pos,donnees[i].length));
			while (valeur.search(/\+/) != -1)
			valeur = valeur.replace(/\+/," ");
		urlvar[variable] = valeur;
		urlvarnum[i] = valeur;
		}
		for (var w=0; w < urlvarnum.length; w++) {
			if (isNaN(parseInt(urlvarnum[w]))) {
			alert('entrez des valeurs numériques !');
			break;
			}
		}
	largeur = (isNaN(parseInt(urlvar['largeur'])))? 8 : eval(urlvar['largeur']);
	hauteur = (isNaN(parseInt(urlvar['hauteur'])))? 8 : eval(urlvar['hauteur']);
	cases = new Array(largeur);
	nbre_objets = (isNaN(parseInt(urlvar['nbre_objets'])))? 10 : eval(urlvar['nbre_objets']);
	depart = (isNaN(parseInt(urlvar['depart'])))? 20 : eval(urlvar['depart']);
	departbis = (isNaN(parseInt(urlvar['departbis'])))? 15 : eval(urlvar['departbis']);
	nbre = largeur*hauteur;
		for (var i=0; i < cases.length; i++)
		cases[i] = new Array(hauteur)
	
		if (nbre_objets > nbre) nbre_objets = nbre;
	}
	else {
	largeur = 8;
	hauteur = 8;
	cases = new Array(largeur);
	nbre_objets = 10;
	depart = 20;
	departbis = 15;
	nbre = largeur*hauteur;
		for (var i=0; i < cases.length; i++)
		cases[i] = new Array(hauteur);
	}
	
	function temps(t) {
		if (t == 0) {
		document.getElementById('timegame').innerHTML= "Fini !";
			if (controle < nbre_objets) {
for (var o = 0; o < nbre; o++)
			document.getElementsByName('ok')[o].disabled = true;
				if (! no) {
				no = true;
				alert('vous avez perdu au temps !\nobjets trouvés : '+ controle +'/'+ nbre_objets);
				}
			}
		}
		else {
		t--;
		tbis = t;
		document.getElementById('timegame').innerHTML= "Il vous reste : "+ tbis +" secondes !";
		setTimeout('temps(tbis)',1000);
		}
	}
	
	function start() {
	document.jeu.reset();
		for (var i=0; i < cases.length; i++) {
			for (var j=0; j < cases[i].length; j++) {
			cases[i][j] = false;
			}
		}
	k=0;
	    while (k < nbre_objets) {
                        i = Math.ceil(Math.random()*largeur)-1;
                        j = Math.ceil(Math.random()*hauteur)-1;
			if (! cases[i][j]) {
			cases[i][j] = true;
			k++;
			}
		}
	document.getElementById('timegame').innerHTML= "Il vous reste : "+ depart +" secondes !";
	setTimeout('temps(depart)',1000);
	controle = 0;
	x = 0;
	no = false;
	document.getElementById('nombre').innerHTML = controle +'/'+ nbre_objets;
	document.getElementById('coups').innerHTML = departbis;
		for (var o = 0; o < nbre; o++)
			document.getElementsByName('ok')[o].disabled = false;
	}

	function verif(ligne,colonne,nom) {
		document.getElementById(nom).disabled = true;
		x++;
		if (controle < nbre_objets) {
			if (cases[ligne][colonne] == true) {
			cases[ligne][colonne] ==false;
			controle++;
			document.getElementById('nombre').innerHTML = controle +'/'+ nbre_objets;
			}
		}
		else {
		document.getElementById('nombre').innerHTML = "Gagné !";
			for (var o = 0; o < nbre; o++)
				document.getElementsByName('ok')[o].disabled = true;
				
			if (! no) {
			no = true;
			alert('Vous avez trouvé tous les objets !');
			}
		}
		
		if (x < departbis) {
		document.getElementById('coups').innerHTML = (departbis - x);
		}
		else {
		document.getElementById('coups').innerHTML = "Aucun !";
			if (controle < nbre_objets) {
				for (var o = 0; o < nbre; o++)
					document.getElementsByName('ok')[o].disabled = true;
					
				if (! no) {
				no = true;
				alert('Vous n\'avez plus de coups restants !\nobjets trouvés : '+ controle +'/'+ nbre_objets);
				}
			}
		}
	}
	
//-->
</script>

</head><body>
<div id="rules"></div>
<br>
temps : <div id="timegame"></div><br>
nombre d'objets trouvés : <div id="nombre"></div><br>
coups restants : <div id="coups"></div>
<form name="jeu" id="jeu">
<table id="tableau">
</table>
</form>
<br><button type="button" onClick="start()">start</button><br>
personnalisation : <form name="formulaire" method="get">
largeur : <input name="largeur" type="text"><br>
hauteur : <input name="hauteur" type="text"><br>
nombre d'objets à trouver : <input name="nbre_objets" type="text"><br>
temps limite en secondes : <input name="depart" type="text"><br>
nombre de coups limités à : <input name="departbis" type="text"><br>
<button type="submit">changer !</button>
</form>
<script type="text/javascript">
<!--
document.formulaire.largeur.value = largeur;
document.formulaire.hauteur.value = hauteur;
document.formulaire.nbre_objets.value = nbre_objets;
document.formulaire.depart.value = depart;
document.formulaire.departbis.value = departbis;
numero = 0;
	for (var m=0; m < cases.length; m++) {
	var rangee = document.createElement("tr");
		if (navigator.appName.substr(0,3)!="Mic") document.getElementById("tableau").appendChild(rangee);
		else document.getElementById("tableau").firstChild.appendChild(rangee);
		
		for (var n=0; n < cases[m].length; n++) {
		var cellule = document.createElement("td");
		rangee.appendChild(cellule);
		cellule.innerHTML = "<input type='checkbox' disabled='true' id='n"+ numero +"' name='ok' 	onClick='verif("+ m +","+ n +",this.id)'></input>";
		numero++;
		}
	}
document.getElementById('rules').innerHTML="Voici un jeu que j'ai inventé : dès que vous appuyez sur le bouton start, vous avez "+ depart +" secondes et "+ departbis +" essais pour trouver le maximum d'objets cachés dans les "+ nbre +" cases. Pour chercher dans une case, cochez-la !";

//-->
</script>
</body></html>

Conclusion :


Ce script est compatible avec tous les navigateurs. Ce script utilise le DOM. Pas de bugs connus.

Codes Sources

Ajouter un commentaire Commentaires
Messages postés
16
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
3 mars 2007

Super !Bravo! Génial !!!!! ;)
Messages postés
79
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
28 août 2010

10 sur 10 rien que pour l'idé génial !
Messages postés
35
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
22 mai 2006

Merci marmotte86 de m'avoir signalé cette erreur ! Je te dois la mise à jour de mon script ;)
Bonnes vacances et à bientôt !
Messages postés
34
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2007

Super, on peut maintenant un peu jouer sur IE :)

Encore un petit bug (mais tres vite réparé...)
aux lignes 81 et 82, on voit le choix aléatoire des cases pour objets à trouver... je ne pense pas me tromper jusque la :
i = Math.floor(Math.random()*7.99);
j = Math.floor(Math.random()*7.99);

Continuons... la ligne 83 permet de ne pas placer deux objets dans la meme case.
Le problème, c'est le "7.99" qui se trouve aux lignes 81 et 82 : ces valeurs sont pour la taille par défaut du tableau, mais pas si on a modifié la taille.

Je m'explique : Essaye de mettre un tableau de 5x5 cases, tu as toutes les chances pour que ton navigateur te sorte une erreur du style :
"'cases[...]' a la valeur Null ou n'est pas un objet."
C'est tout simplement parce que la case choisie pour l'objet etait dans les lignes ou colonnes 6, 7 ou 8, et que ces lignes et colonnes n'existent pas dans un tableau de 5 cases.
Il faut juste remplacer les lignes 81 et 82 par :
i = Math.ceil(Math.random()*largeur)-1;
j = Math.ceil(Math.random()*hauteur)-1;
et le problème est réglé ;) les cases ne vont plus aller dans des lignes ou colonnes inexistantes. Le ceil donne l'entier directement supérieur à la valeur trouvée, et le -1 permet donc d'avoir des valeurs à partir de 0... et de ne pas dépasser la taille.
PS : Ce problème surgissait aussi si on ajoutait des lignes et colonnes au tableau... dans ce cas, les objets etaient seulement dans les 8 premieres lignes ou colonnes, il etait donc inutile de chercher plus loin, et si par malheur on mettait plus de 64 objets a trouver, le code partait dans une boucle infinie !
Une fois les 64 premiers objets placés dans les 8 premieres lignes et colonnes, la limite du 7.99, toutes les cases etaient prises, et les objets suivants n'avaient plus de place (voici donc le "bug" de la ligne 83, corrigé en partie par la correction des lignes 81 et 82...)

J'espere que tout le monde me suit, ce n'est pas toujours tres clair quand je corrige en ecrivant le commentaire :(

Un dernier petit truc sur la ligne 83 : ce n'est pas un bug a proprement parler, mais ca peut durer longtemps si le navigateur a la mauvaise idée de choisir toujours les memes nombres avec sa fonction random... c'est vrai que ce ne serait pas de chance non plus. dans ce cas, le problème de la boucle infinie revient.
sans chercher beaucoup (et ce n'est certainement pas une bonne idée, mais c'est celle qui me vient a l'esprit), on pourrait faire un tableau dans lequel on classerait aléatoirement les numéros de cases du tableau de jeu. il faudrait donc un tableau contenant toutes ces coordonées : le tableau contient une liste de petits tableaux contenant chacuns 2 valeurs. on range ensuite aléatoirement ces petits tableaux de 2 valeurs aléatoirement dans un nouveau tableau. on prend ensuite les x premieres valeurs du deuxième tableau pour placer les objets.

Pour placer aléatoirement les valeurs dans un tableau, on prend une valeur que l'on met dans la derniere case du deuxième tableau, et on la remplace dans le premier tableau par la derniere valeur de ce tableau, et on recommence en prenant les valeurs restantes (donc toutes sauf la derniere)... ca se fait facilement avec une boucle :
for(i=nbcases;i>0;i--){
choix=math.ceil(math.random()*i);
tableau2[i]=tableau1[choix];
tableau1[choix]=tableau1[i];
}
on evite donc le problème de la boucle infinie, mais c'est surement inutile ici.
Messages postés
35
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
22 mai 2006

PS : le code a été mis à jour tout de suite, ce qui veut dire que les admins ont corrigé l'erreur...
@+
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.