Red de conocimiento informático - Material del sitio web - Cómo utilizar javascript para implementar el juego Go

Cómo utilizar javascript para implementar el juego Go

lt;headgt;

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>

};

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;