Une superbe bataille navale
Entrez dans une bataille navale infernale contre votre ordinateur. Faites attention, votre adversaire n'est pas stupide !
... Nous avons placé la flotte ennemie sous la commande de l'Amiral Kompüter, mais n'avons pas encore le contact visuel. Nous pensons que la meilleure tactique et de tirer au hasard de leur voisinage, et d'écouter les impacts des tir d'obus sur leurs coques..
... Nos sources de renseignements indiquent que la composition de la flotte ennemie est la même que la notre et a été forcée de recourir à la même tactique que la notre. Conformément aux règles de guerre, les échanges de tir se feront un obus à la fois et les navires perdus seront immédiatement signalés...
Copiez avant la balise </head> :
<style type="text/css">
.intro { font-size:10pt; font-style:italic }
.heading { font-size:14pt; font-weight:bold; font-family:sans-serif }
.title { font-size:18pt; font-weight:bold; background-color:navy; color:white;
text-align:center; font-family:sans-serif }
</style>
Copiez entre les balises <body> et </body> :
<SCRIPT LANGUAGE="JavaScript">
<!-- Debut
/* Information employée dessiner les bateaux
*/
var ship = [[[1,5], [1,2,5], [1,2,3,5], [1,2,3,4,5]], [[6,10], [6,7,10],
[6,7,8,10], [6,7,8,9,10]]];
/* L'information pour faire couler les bateaux
*/
var dead = [[[201,203], [201,202,203], [201,202,202,203], [201,202,202,202,203]],
[[204,206], [204,205,206], [204,205,205,206], [204,205,205,205,206]]];
/* Description des bateaux, cuirassé, croiseur(s), frégate,
dragueur de mines
*/
var shiptypes = [["dragueur de mines ",2,4],["frégate(s)
",3,4],[ "croiseur(s) ",4,2],[ "cuirassé(s) ",5,1]];
var gridx = 16, gridy = 16;
var player = [], computer = [], playersships = [], computersships = [];
var playerlives = 0, computerlives = 0, playflag=true, statusmsg="";
/* FuFonction pour précharger toutes les images, pour empêcher
les retards pendant jeu
*/
var preloaded = [];
function imagePreload() {
var i,ids = [1,2,3,4,5,6,7,8,9,10,100,101,102,103,201,202,203,204,205,206];
window.status = "Preloading images...please wait";
for (i=0;i<ids.length;++i) {
var img = new Image, name = "batt"+ids[i]+".gif";
img.src = name;
preloaded[i] = img;
}
window.status = "";
}
/* Fonction pour placer les bateaux dans la grille
*/
function setupPlayer(ispc) {
var y,x;
grid = [];
for (y=0;y<gridx;++y) {
grid[y] = [];
for (x=0;x<gridx;++x)
grid[y][x] = [100,-1,0];
}
var shipno = 0;
var s;
for (s=shiptypes.length-1;s>=0;--s) {
var i;
for (i=0;i<shiptypes[s][2];++i) {
var d = Math.floor(Math.random()*2);
var len = shiptypes[s][1], lx=gridx, ly=gridy, dx=0, dy=0;
if ( d==0) {
lx = gridx-len;
dx=1;
}
else {
ly = gridy-len;
dy=1;
}
var x,y,ok;
do {
y = Math.floor(Math.random()*ly);
x = Math.floor(Math.random()*lx);
var j,cx=x,cy=y;
ok = true;
for (j=0;j<len;++j) {
if (grid[cy][cx][0] < 100) {
ok=false;
break;
}
cx+=dx;
cy+=dy;
}
} while(!ok);
var j,cx=x,cy=y;
for (j=0;j<len;++j) {
grid[cy][cx][0] = ship[d][s][j];
grid[cy][cx][1] = shipno;
grid[cy][cx][2] = dead[d][s][j];
cx+=dx;
cy+=dy;
}
if (ispc) {
computersships[shipno] = [s,shiptypes[s][1]];
computerlives++;
}
else {
playersships[shipno] = [s,shiptypes[s][1]];
playerlives++;
}
shipno++;
}
}
return grid;
}
/* Fonction pour changer une image chargée sur une grille
*/
function setImage(y,x,id,ispc) {
if ( ispc ) {
computer[y][x][0] = id;
document.images["pc"+y+"_"+x].src = "batt"+id+".gif";
}
else {
player[y][x][0] = id;
document.images["ply"+y+"_"+x].src = "batt"+id+".gif";
}
}
/* Fonction pour insérer le code HTML pour dans la grille
*/
function showGrid(ispc) {
var y,x;
for (y=0;y<gridy;++y) {
for (x=0;x<gridx;++x) {
if ( ispc )
document.write ('<a href="javascript:gridClick('+y+','+x+');"><img
name="pc'+y+'_'+x+'" src="batt100.gif" width=16 height=16></a>');
else
document.write ('<a href="javascript:void(0);"><img name="ply'+y+'_'+x+'"
src="batt'+player[y][x][0]+'.gif" width=16 height=16></a>');
}
document.write('<br>');
}
}
/* Fonction pour du clic sur la grille
*/
function gridClick(y,x) {
if ( playflag ) {
if (computer[y][x][0] < 100) {
setImage(y,x,103,true);
var shipno = computer[y][x][1];
if ( --computersships[shipno][1] == 0 ) {
sinkShip(computer,shipno,true);
alert("Vous avez coulé l'un(e) de mes "+shiptypes[computersships[shipno][0]][0]+"!");
updateStatus();
if ( --computerlives == 0 ) {
alert("Vous avez gagné ! Cliquez sur le bouton "actualiser"
pour rafraîchir \n"+
"la fenêtre de votre navigateur et refaire une partie.");
playflag = false;
}
}
if ( playflag ) computerMove();
}
else if (computer[y][x][0] == 100) {
setImage(y,x,102,true);
computerMove();
}
}
}
/* Fonction pour faire le mouvement d'ordinateurs. Notez que l'ordinateur
ne se trompe pas, oh non !
*/
function computerMove() {
var x,y,pass;
var sx,sy;
var selected = false;
/* passez deux tours pendant le mode' tirent pour tuer '
*/
for (pass=0;pass<2;++pass) {
for (y=0;y<gridy && !selected;++y) {
for (x=0;x<gridx && !selected;++x) {
/* Explosion shown at this position
*/
if (player[y][x][0]==103) {
sx=x; sy=y;
var nup=(y>0 && player[y-1][x][0]<=100);
var ndn=(y<gridy-1 && player[y+1][x][0]<=100);
var nlt=(x>0 && player[y][x-1][0]<=100);
var nrt=(x<gridx-1 && player[y][x+1][0]<=100);
if ( pass == 0 ) {
/* On first pass look for two explosions
in a row - next shot will be inline
*/
var yup=(y>0 && player[y-1][x][0]==103);
var ydn=(y<gridy-1 && player[y+1][x][0]==103);
var ylt=(x>0 && player[y][x-1][0]==103);
var yrt=(x<gridx-1 && player[y][x+1][0]==103);
if ( nlt && yrt) { sx = x-1; selected=true; }
else if ( nrt && ylt) { sx = x+1; selected=true; }
else if ( nup && ydn) { sy = y-1; selected=true; }
else if ( ndn && yup) { sy = y+1; selected=true; }
}
else {
/* Le deuxième passage cherche l'explosion simple -
décharges de feu tous autour de cela
*/
if ( nlt ) { sx=x-1; selected=true; }
else if ( nrt ) { sx=x+1; selected=true; }
else if ( nup ) { sy=y-1; selected=true; }
else if ( ndn ) { sy=y+1; selected=true; }
}
}
}
}
}
if ( !selected ) {
/* Rien trouvé dans ' tire pour tuer ' le mode, donc nous prenons juste
potshots.
Des décharges aléatoires sont dans un modèle
de chequerboard
pour l'efficacité maximale et jamais deux fois à
la même place
*/
do{
sy = Math.floor(Math.random() * gridy);
sx = Math.floor(Math.random() * gridx/2)*2+sy%2;
} while( player[sy][sx][0]>100 );
}
if (player[sy][sx][0] < 100) {
/* Hit something
*/
setImage(sy,sx,103,false);
var shipno = player[sy][sx][1];
if ( --playersships[shipno][1] == 0 ) {
sinkShip(player,shipno,false);
alert("J'ai coulé votre "+shiptypes[playersships[shipno][0]][0]+"!");
if ( --playerlives == 0 ) {
knowYourEnemy();
alert("I win! Employez la fonction rafraîchir de votre navigateur
avec le bouton \n"+
"pour recommencer une partie.");
playflag = false;
}
}
}
else {
/* Missed
*/
setImage(sy,sx,102,false);
}
}
/* Quand le bateau entier est frappé, cette fonction montre-la modification
de son apparence
*/
function sinkShip(grid,shipno,ispc) {
var y,x;
for (y=0;y<gridx;++y) {
for (x=0;x<gridx;++x) {
if ( grid[y][x][1] == shipno )
if (ispc) setImage(y,x,computer[y][x][2],true);
else setImage(y,x,player[y][x][2],false);
}
}
}
/*L'emplacement de la position finale de tous les bateaux de l'ordinateurs
- quand le joueur a perdu
*/
function knowYourEnemy() {
var y,x;
for (y=0;y<gridx;++y) {
for (x=0;x<gridx;++x) {
if ( computer[y][x][0] == 103 )
setImage(y,x,computer[y][x][2],true);
else if ( computer[y][x][0] < 100 )
setImage(y,x,computer[y][x][0],true);
}
}
}
/* Montre combien de bateaux de l'ordinateur sont détruis
*/
function updateStatus() {
var f=false,i,s = "Computer has ";
for (i=0;i<computersships.length;++i) {
if (computersships[i][1] > 0) {
if (f) s=s+", "; else f=true;
s = s + shiptypes[computersships[i][0]][0];
}
}
if (!f) s = s + "nothing left, thanks to you!";
statusmsg = s;
window.status = statusmsg;
}
function setStatus() {
window.status = statusmsg;
}
/* Commencez le jeu!
*/
imagePreload();
player = setupPlayer(false);
computer = setupPlayer(true);
document.write("<center><table><tr><td align=center><p
class='heading'>L'ORDINATEUR</p></td>"+
"<td align=center><p class='heading'>VOUS</p></td></tr><tr><td>");
showGrid(true);
document.write("</td><td>");
showGrid(false);
document.write("</td></tr></table></center>");
updateStatus();
setInterval("setStatus();", 500);
// End -->
</script>
© Copyright GendNet 2000 Tout droit de reproduction strictement réservé aux membres de l'association ®