Cómo utilizar javascript para implementar el juego Go
lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /gt;
lt;titlegt; La leyenda del Zen Golt;/titlegt;
lt; estilo type="text/css"gt;
div { posición: absoluta; ancho: 23px;
.B0 { imagen-de-fondo: url('B0.gif') B1 {imagen-de-fondo: url('B1.gif' }
.B2 { fondo- imagen: url('B2.gif'); }
.B3 { imagen de fondo: url('B3.gif'); >.B4 {imagen de fondo: url('B4.gif'); }
.
.B7 {imagen de fondo: url('B7.gif');
.B8 {imagen de fondo: url('B8.gif');
.BX {imagen de fondo: url('BX.gif'); p>
.D0 {imagen de fondo: url('D0.gif');
.D1 {imagen de fondo: url('D1.gif');
. p>
.C1 { imagen de fondo: url('C1.gif' }
lt;/stylegt;
lt;/headgt;
lt;bodygt;
lt;script type="text/javascript"gt;
//lt;! [CDATA[
Array.prototype.indexOf = function (item) //Extiende un método indexOf a la matriz para recuperar si es un "elemento conocido"
{
for ( var i=0; ilt; this.length; i )
if (this[i] == elemento)
return i;
return -1;
};
var Site = //Definir una clase ChessSite
{
Crear: función (x, y) //Constructor de la clase ChessSite
{
var me = document.createElement("div"); //Construye un objeto div, expándelo y It se resume como una posición de ajedrez.
document.body.appendChild(me); //Agregar al árbol DOM para habilitar la representación de posiciones de ajedrez. top = y * 23 "px"; //Establece la posición vertical absoluta de la posición
// var s = ((x-9)9?0: (x-9)/9) 1 (( (y-9)9?0: (y-9)/9) 1)*3; // Calcula el estilo de fondo. Este algoritmo es redundante y se simplifica al siguiente algoritmo.
var s = parseInt((x-9)/9) 1 (parseInt((y-9)/9) 1)*3 //Calcular estilo de fondo
/ /me._backStyle = "B" ((s==4amp;amp;(x/3)2==1amp;amp;(y/(3)2==1) ?3)2==1) ?" X": s);
me._backStyle = "B" (((x/3)2==1amp;amp;amp;(y/3)2==1)?" : s );
me.Fill = this.Fill; //Asocia un método para llenar la posición del tablero.
me.Tight = this.Tight; //Asocia un método para calcular la estanqueidad.
me.Kill = this.Kill; //Asocia un método para calcular movimientos muertos.
me.onclick = this.Play; // Vincula el evento onclick al método Play.
me.Fill(); // Llenado inicial de huecos.
return me; // Devuelve el objeto de posición de ajedrez, que en realidad es un objeto div encapsulado.
},
Relleno: función(punto, yendo) //Método para llenar piezas de ajedrez, ya sea yendo~~ es el "movimiento de ajedrez actual".
{
if ( dot == undefinido )
this.className = this._backStyle // Si no hay disco, configúrelo en el estilo de fondo .
else
this.className = (going ? "C" : "D") dot; //Cuando hay un disco, maneja el "movimiento actual" de manera diferente
this.dot = dot; //Guardar estado del disco
},
Reproducir: función() //Método de reproducción, activado por el evento onclick
{
if ( this. dot == undefinido ) // El punto de entrega no debe estar definido; de lo contrario, no se procesará.
{
var deads = this.Kill(current^1); //Calcula los niños que pueden ser asesinados, actual es el color actual, luego actual^1 es el del oponente. color
if (deads.length == 1 amp; amp; this == rob) return; //Confirma el estado del robo y recházalo directamente si se puede levantar más de una piedra en este paso; no es un robo
for(var i=0; ilt; deads.length; i )
deads[i].Fill() // Limpia uno por uno según a la columna de muertos
if(i==1)
rob = deads[0] // Si solo se levanta a un niño en este paso, la posición levantada se registra como la posición robada.
else if (igt; 0 || !this.Tight(current))// Este es un juicio que afecta la eficiencia del código. Para las operaciones que pueden producir promoción descendiente, no es necesario juzgar si. está "estrictamente prohibido"; Además, si desea introducir la regla "malo a estrictamente prohibido", debe modificar el algoritmo aquí
rob = null //Limpiar la posición de elevación. Esta condición es un juicio. Si se pueden promover varios nodos secundarios o no hay ninguna prohibición para continuar, se eliminará el estado "robar".
else return // El valor de retorno correspondiente aquí debe ser. sólo la situación del punto de entrada prohibido sin aire.
sound.play(); //¡El sonido de la caída! //Rellena los discos del "paso" actual
Tracks.push( new Step(this, deads)
current ^= 1; //Aislar con 1 a invierte exactamente los discos en blanco y negro
Tracks.push( new Step(this, deads)
current ^= 1 //Aislar con 1 para invertir exactamente el negro. y discos blancos.
var disline = document.getElementById('list');
disline.value = ((current ? 'Black:': 'White:') Pistas[ Tracks.length-1].site.x ' ' Tracks[Tracks.length-1].site.y '\n');
disline.scrollTop = disline.
{
var life = this.dot == undefined ? this : undefinido; // vida es la definición de "vida" si no hay un subpunto en la posición actual, se cuenta como uno; aliento, correspondiente al recorrido de los puntos, no debe haber subpuntos en la posición actual.
punto = punto == undefinido? this.dot : dot; // Esta lógica corresponde al recorrido de tic
if (punto == undefinido) return undefinido;
var block = this.dot == undefinido ?[] : [this]; //El "bloque" está definido al atravesar los niños, encuentra el niño que ingresa al bloque y luego determina cuánto "gas". " hay.
var i = this.dot == indefinido ?0: 1;
var sitio = this;
mientras (verdadero)
{
for(var dx=-1; dxlt; =1; dx ) for (var dy=-1; dylt; =1; dy ) if(!dx^!dy)
{
enlace = GetSite(sitio.x dx, sitio.y dy); // Determine la parte superior, inferior, izquierda y derecha de la posición de destino. Si hay un sitio, continúe. Si no hay un sitio, continúe.
if (link.dot ! = undefinido) // Si hay nodos secundarios, determina si sus colores son iguales, incluso "bloque"
{
if (link.dot == dot amp; amp; block.indexOf(link) lt; 0 )
block.push(link); //esta es la sección para el "bloque" del transversal, la condición es encontrar alrededor del mismo color del niño, buscar para determinar si es un nuevo "saber", "nuevo" y luego ingresar al "bloque"
}
otro if (!life) //no hay hijo, entonces actualiza el "gas"
life = link
else if (life ! = link)
return indefinido ; // Al atravesar los hijos, si hay dos hijos, no es necesario contar
};
if (i gt; = bloque. Si es el último objeto del la lista no se crea Si se crea un nuevo subobjeto adyacente, el recorrido del "bloque" finaliza
};
Si el último objeto de la lista no crea un nuevo subobjeto adyacente subobjeto, luego "bloquear" El recorrido finaliza
sitio = bloque[i]; ;
return block; //retornar bloque; //devolver un bloque de un aliento que corresponde a una sublista de objetos secundarios que pueden promocionarse en un recorrido de promoción y luego determinar si "acierta"
},
Kill. function(punto) // Calcula el niño asesinado, esto apunta al punto descendente, el punto apunta al color del niño muerto que se va a juzgar.
{
var deads = []; //definir la columna de muertos
for(var dx=-1; dxlt; =1; dx) for (var dy=-1; dylt; =1; dy) if(!dx^!dy) //diferente-o, uno y sólo uno de ellos es verdadero, puede corresponder a los hijos vecinos.
{
var sitio = GetSite(this.x dx, this.y dy);
if (sitio amp; amp; (site.dot == punto))
{
var block = site.
// Si desea obtener un recuento preciso del número de mosaicos, debe actualizar el algoritmo.
};
};
devolver muertos; //Devuelve bloques muertos que se pueden levantar
}
}; //Clase de ubicación Sitio
var Board = new Array(19); //Matriz de tablero global.
var Tracks = []; // Matriz de movimiento lineal, cuyos elementos son objetos Step.
var current = 0; //El movimiento de ajedrez actual que se realizará, 0 representa ajedrez negro, 1 representa ajedrez blanco, alternativamente.
var rob = null; // Si hay una tribulación, registra la ubicación de la tribulación.
for(var x = 0; x lt; 19; x)
{
Tablero[x] = new Array(19);
for(var y = 0; y lt; 19; y)
Board[x][y] = Site.Create(x, y); //Crea un objeto de tablero de ajedrez por posición. .
};
if (navigator.userAgent.indexOf(' MSIE ') gt; -1) //Crea un objeto de sonido para Internet Explorer
{
var sonido = document.body.appendChild( document.createElement("bgsound"));
sound.play = function(){this.src = "play.wav" } ;
}
else //Construye objetos de sonido para otros navegadores (como Firefox)
{
var sonido = documento . body.appendChild(document.createElement("span"));
sound.play = function(){this.innerHTML = "lt.bgsound src='play.wav'gt;"};
};
document.body.oncontextmenu = function() //Haga clic derecho para impulsar el evento de arrepentimiento
{
var paso = Tracks.pop();
if (paso)
{
step.site.Fill(); paso = Tracks[Tracks.length] -1 ];
if (paso) step.site.Fill(current, true)
current ^= 1; //invierte las piezas en blanco y negro.
};
return false; //Sin menú emergente.
};
función GetSite(x, y) // La función se utiliza para quitar el tablero del tablero Obtiene una pieza de ajedrez sin lanzar una excepción al cruzar la línea.
{
if (xgt;=0 amp;amp;xlt;19 amp;amp;ygt;=0 amp;amp;ylt;19)
return Board[x][y];
};
función Paso (sitio, muertos) //Clase de paso, registra el estado de cada movimiento
{
this.site = site; // registra la posición del movimiento
this.deads = deads; // registra el conjunto de piezas eliminadas por el movimiento actual p> p>
};
función PrintWay() //Recorre la ruta
{
var str='', coler='' ;
for (var i=0; i lt; Tracks.length; i )
{
paso = Tracks[i];
coler = (i2) ?"blanco" : "negro";
str = str "paso " (i 1) "paso " coler "cuadrado X " paso.sitio.x " Y " paso.site.y "\n";
}
alert(str);
}
document .body.ondblclick = PrintWay ;
document.onkeypress = función(evento)
{
var k = (ventana.evento ? ventana.event.onkeypress = función(evento )
{
var k = (window.event.onkeypress = function(event)
)keyCode: event.what) - 49; '1 'Ingrese la operación de reproducción automática, '1' = 0x31=49
if(klt;0 ||kgt;1) return;
for(var x=0; xlt ;19 ; x ) para (var y=0; ylt; 19; y ) Tablero[x][y].Fill(); actual = 0;
con(va[k]) for(var i=0; ilt; longitud; i =3)
Tablero[charCodeAt(i 1)-65] [charCodeAt (i)-65].fill(charCodeAt(i 2)-48);
};
lt;/bodygt;
lt; /htmlgt;