Крестики нолики.
<html> <head> <title>Игра крестики-нолики</title> </head> <body> <p align=center><br> <SCRIPT language=JavaScript> <!-- step = 0; diff=3; // change board when button is clicked function clear_all(form) { step = 0; for (i=0;i<9; ++i) { position="a"+i; form[position].value=""; } } // change board when button is clicked function clickit(field) { if (step == -1) {alert("Reset to play again"); return;} position=field.name.substring(1,2,1); position = 'a'+position; if (field.form[position].value !="") { alert("Can't go there"); return;} field.form[position].value="X"; if (eval_pos(field.form)) { field.form.output.value="Вы победили!"; step = -1; return; } position=get_move(field.form); field.form.output.value='I moved to ' + position.substring(1,2,1); if (position=="") { field.form.output.value="Ничья."; step = -1; return; } field.form[position].value="O"; if (eval_pos(field.form)) { field.form.output.value="Вы проиграли!"; step = -1; } } // see if there is a winner function eval_pos(form) { if ((form.a0.value!="" && form.a0.value==form.a3.value && form.a0.value==form.a6.value)|| (form.a0.value!="" && form.a0.value==form.a1.value && form.a0.value==form.a2.value) || (form.a0.value!="" && form.a0.value==form.a4.value && form.a0.value==form.a8.value) || (form.a1.value!="" && form.a1.value==form.a4.value && form.a1.value==form.a7.value) || (form.a2.value!="" && form.a2.value==form.a5.value && form.a2.value==form.a8.value) || (form.a2.value!="" && form.a2.value==form.a4.value && form.a2.value==form.a6.value) || (form.a3.value!="" && form.a3.value==form.a4.value && form.a3.value==form.a5.value) || (form.a6.value!="" && form.a6.value==form.a7.value && form.a6.value==form.a8.value)) return true; else return false; } function f(a) { if (a == "") return "."; else return a; } // get position for move. function comp_move(form,player,weight,depth) { var cost; var bestcost=-2; var position; var newplayer; if (player=="X") newplayer="O"; else newplayer="X"; if (depth==diff) return 0; if (eval_pos(form)) return 1; for (var i=0; i<9; ++i) { position='a'+i; if (form[position].value != "") continue; form[position].value=player; cost = comp_move(form,newplayer, -weight, depth+1); if (cost > bestcost) { bestcost=cost; if (cost==1) i=9; } form[position].value=""; } if (bestcost==-2) bestcost=0; return(-bestcost); } // get position for move. function get_move(form) { var cost; var bestcost=-2; bestmove=""; // don't think about first move. if (step++ == 0) if (form.a4.value=="") return "a4"; else if (form.a0.value=="") return "a0"; for (var i=0; i<9; ++i) { localposition='a'+i; if (form[localposition].value != "") continue; form[localposition].value="O"; cost=comp_move(form,"X", -1, 0); if (cost > bestcost) { if (cost==1) i=9; bestmove=localposition; bestcost=cost; } form[localposition].value=""; } return bestmove; } // complain if user attempts to change board function complain(field) { field.form.output.focus(); // put focus eleswhere alert("Don't change the game fields directly!"); } // the end // --> </SCRIPT> <form> <P> <input name=a0 onfocus=complain(this) size=1> <input name=b0 onclick=clickit(this) type=button> <input name=a1 onfocus=complain(this) size=1> <input name=b1 onclick=clickit(this) type=button> <input name=a2 onfocus=complain(this) size=1> <input name=b2 onclick=clickit(this) type=button> <br> <input name=a3 onfocus=complain(this) size=1> <input name=b3 onclick=clickit(this) type=button> <input name=a4 onfocus=complain(this) size=1> <input name=b4 onclick=clickit(this) type=button> <input name=a5 onfocus=complain(this) size=1> <input name=b5 onclick=clickit(this) type=button> <br><input name=a6 onfocus=complain(this) size=1> <input name=b6 onclick=clickit(this) type=button> <input name=a7 onfocus=complain(this) size=1> <input name=b7 onclick=clickit(this) type=button> <input name=a8 onfocus=complain(this) size=1> <input name=b8 onclick=clickit(this) type=button> <br><br><br> Message: <input name=output><br><br> Сложность игры : <SELECT name=difficulty onchange=diff=form.difficulty[form.difficulty.selectedIndex].value; size=1> <option value=1>Очень лёгкая</option> <option value=2>Просто</option> <option selected value=3>Нормально</option> <option value=4>Сложно (Компьютер долго думает)</option></SELECT><br> <input onclick="if (!step++) this.form.a4.value='O';" type=button value="Компьютер ходит первым"><br> <input onclick=clear_all(this.form) type=reset value=Рестарт> </P></form> </body> </html>
Морской бой.
<html> <head> <style type="text/css"> .intro { FONT-SIZE: 10pt; FONT-STYLE: italic} .heading { FONT-FAMILY: sans-serif; FONT-SIZE: 14pt; FONT-WEIGHT: bold } .title { BACKGROUND-COLOR: navy; COLOR: white; FONT-FAMILY: sans-serif; FONT-SIZE: 18pt; FONT-WEIGHT: bold; TEXT-ALIGN: center } #adv { HEIGHT: 60px; LEFT: 0px; TOP: 0px; WIDTH: 468px } </style> </HEAD> <body> <script language="JavaScript"> <!-- Begin /* Information used to draw the ships */ 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]]]; /* Information used to draw sunk ships */ 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]]]; /* Information used to describe ships */ var shiptypes = [["Минер",2,4],["Фрегат",3,4],[ "Крейсер",4,2],[ "Боевой Корабль",5,1]]; var gridx = 16, gridy = 16; var player = [], computer = [], playersships = [], computersships = []; var playerlives = 0, computerlives = 0, playflag=true, statusmsg=""; /* Function to preload all the images, to prevent delays during play */ 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 = "Идет загруска картинок....."; for (i=0;i<ids.length;++i) { var img = new Image, name = "img/batt"+ids[i]+".gif"; img.src = name; preloaded[i] = img; } window.status = ""; } /* Function to place the ships in the grid */ 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; } /* Function to change an image shown on a grid */ function setImage(y,x,id,ispc) { if ( ispc ) { computer[y][x][0] = id; document.images["pc"+y+"_"+x].src = "img/batt"+id+".gif"; } else { player[y][x][0] = id; document.images["ply"+y+"_"+x].src = "img/batt"+id+".gif"; } } /* Function to insert HTML source for a grid */ function showGrid(ispc) { var y,x; for (y=0;y<gridy;++y) { for (x=0;x<gridx;++x) { if ( ispc ) document.write ('<a href="" OnClick="gridClick('+y+','+x+');return false;"><img name="pc'+y+'_'+x+'" src="img/batt100.gif" width=16 height=16 border=0></a>'); else document.write ('<img name="ply'+y+'_'+x+'" src="img/batt'+player[y][x][0]+'.gif" width=16 height=16 border=0>'); } document.write('<img src=img/dot.gif width=1 height=16><br>'); } polewidth = 1 + gridx * 16; document.write('<img src=img/dot.gif width='+polewidth+' height=1><br>'); } /* Handler for clicking on the grid */ 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("You sank my "+shiptypes[computersships[shipno][0]][0]+"!"); updateStatus(); if ( --computerlives == 0 ) { alert("Вы победили!"); playflag = false; } } if ( playflag ) computerMove(); } else if (computer[y][x][0] == 100) { setImage(y,x,102,true); computerMove(); } } } /* Function to make the computers move. Note that the computer does not cheat, oh no! */ function computerMove() { var x,y,pass; var sx,sy; var selected = false; /* Make two passes during 'shoot to kill' mode */ 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 { /* Second pass look for single explosion - fire shots all around it */ 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 ) { /* Nothing found in 'shoot to kill' mode, so we're just taking potshots. Random shots are in a chequerboard pattern for maximum efficiency, and never twice in the same 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("I sank your "+shiptypes[playersships[shipno][0]][0]+"!"); if ( --playerlives == 0 ) { knowYourEnemy(); alert("Вы проиграли!"); playflag = false; } } } else { /* Missed */ setImage(sy,sx,102,false); } } /* When whole ship is hit, show it using changed graphics */ 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); } } } /* Show location of all the computers ships - when player has lost */ 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); } } } /* Show how many ships computer has left */ function updateStatus() { var f=false,i,s = "Корабли компьютера: "; 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 + "ничего не осталось"; statusmsg = s; window.status = statusmsg; } function setStatus() { window.status = statusmsg; } function NewGame() { var rndnum = Math.round(Math.random() * 100000); oldlocation = window.location; window.location= "index.htm?"+ rndnum; } var ie4 = (document.all) ? true : false; var nn4 = (document.layers) ? true : false; /* Start the game! */ imagePreload(); player = setupPlayer(false); computer = setupPlayer(true); document.write("<center><table><tr><td align=center>Флот Компьютера</td>"+ "<td align=center>Ваш Флот</td></tr><tr><td>"); showGrid(true); document.write("</td><td>"); showGrid(false); document.write("</td></tr></table></center>"); document.write("<center><form><INPUT style=\"color: #00cc00; background-color: #000000; border-color: #00cc00;\" type=\"submit\" VALUE=\"Новая Игра !\"></form></center>"); updateStatus(); setInterval("setStatus();", 500); // End --> </script> </div> </body> </html>