首先你需要考慮棋盤的焦點實際上只是一層背景圖,比如:50x50像素一個位置的話,貼圖應(yīng)該正好錯位25x25左右,這樣的話看起來你的棋子就像在棋格交點上了
10年積累的成都網(wǎng)站設(shè)計、網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有新巴爾虎右免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
大概是這給意思
div id="bak1" style="top:-25px; left:-25px;position: absolute; background: url("table.png") transparent;"/div
div id="point" style="top:0px; left:0px;position: absolute;"棋子/div
head
meta http-equiv="Content-Type" content="text/html;charset=utf-8" /
title禪棋傳說/title
style type="text/css"
div { position: absolute; width: 23px; height: 23px; }
.B0 { background-image: url('B0.gif'); }
.B1 { background-image: url('B1.gif'); }
.B2 { background-image: url('B2.gif'); }
.B3 { background-image: url('B3.gif'); }
.B4 { background-image: url('B4.gif'); }
.B5 { background-image: url('B5.gif'); }
.B6 { background-image: url('B6.gif'); }
.B7 { background-image: url('B7.gif'); }
.B8 { background-image: url('B8.gif'); }
.BX { background-image: url('BX.gif'); }
.D0 { background-image: url('D0.gif'); }
.D1 { background-image: url('D1.gif'); }
.C0 { background-image: url('C0.gif'); }
.C1 { background-image: url('C1.gif'); }
/style
/head
body
script type="text/javascript"
//![CDATA[
Array.prototype.indexOf = function (item) //給數(shù)組擴展一個indexOf方法,用來檢索是否為"已知元素"
{
for ( var i=0; ithis.length; i++)
if (this[i] == item)
return i;
return -1;
};
var Site = //定義一個棋位類
{
Create: function(x, y) //棋位類的構(gòu)造函數(shù)
{
var me = document.createElement("div"); //建一個div對象,將其擴展并封裝成棋位。
document.body.appendChild(me); //附加到DOM樹,實現(xiàn)棋位的呈現(xiàn)。
me.x = x; //記錄棋位的X坐標
me.y = y; //記錄棋位的Y坐標
me.style.left = x * 23 + "px"; //設(shè)置棋位水平方向的絕對位置
me.style.top = y * 23 + "px"; //設(shè)置棋位垂直方向的絕對位置
// var s = ((x-9)%9?0:(x-9)/9)+1+(((y-9)%9?0:(y-9)/9)+1)*3; //計算背景式樣,這個算法有冗余,簡化為下面的算法.
var s = parseInt((x-9)/9)+1+(parseInt((y-9)/9)+1)*3; //計算背景式樣
// me._backStyle = "B" + ((s==4(x/3)%2==1(y/3)%2==1) ? "X" : s);
me._backStyle = "B" + (((x/3)%2==1(y/3)%2==1) ? "X" : s);
me.Fill = this.Fill; //關(guān)聯(lián)一個填充棋位的方法。
me.Tight = this.Tight; //關(guān)聯(lián)計算緊氣方法。
me.Kill = this.Kill; //關(guān)聯(lián)計算死子方法。
me.onclick = this.Play; //綁定onclick事件到Play方法。
me.Fill(); //初始填充空子。
return me; //返回棋位對象,其實是一個封裝了的div對象。
},
Fill: function(dot, going) //填充棋子的方法,going~~是否"當前步".
{
if ( dot == undefined )
this.className = this._backStyle //無子,就設(shè)置為背景式樣。
else
this.className = (going ? "C" : "D") + dot; //有子,區(qū)別對待"當前步"
this.dot = dot; //保存棋子狀態(tài)
},
Play: function() //行棋方法,由onclick事件觸發(fā)
{
if ( this.dot == undefined ) //落子點必須為無子狀態(tài),否則不處理.
{
var deads = this.Kill(current^1); //計算可以殺死的子,current為當前顏色,則current^1為對方顏色
if (deads.length == 1 this == rob) return; //確認的打劫狀態(tài)后,直接拒絕;如果此步落子可以提不止一子,則不是打劫
for(var i=0; ideads.length; i++)
deads[i].Fill(); //按照死子列清空,one by one
if(i==1)
rob = deads[0] //如果此步只提了一個子,記錄被提位置為打劫位置.
else if (i0 || !this.Tight(current)) //這里有一個影響代碼效率的判斷,對于能產(chǎn)生提子的操做,不需要再判斷是否"緊氣禁入";此外,如果要引入"變窮為禁"的規(guī)則,這里需要改變算法
rob = null //清打劫位,這個條件是判斷,如果能夠提多子,或者不是禁止著手,則解除"打劫"狀態(tài)
else return; //這里對應(yīng)的返回,應(yīng)該是只有無氣禁入點的情況.
sound.play(); //落子有聲!
var step = Tracks[Tracks.length-1];
if(step) step.site.Fill(step.site.dot); //更新此前一"步"的子的位圖
this.Fill(current, true); //填入當前"步"的子
Tracks.push( new Step(this, deads) );
current ^= 1; //用1來異或,正好反轉(zhuǎn)黑白棋子。
var disline = document.getElementById('list');
disline.value += ((current ? '黑:': '白:')+Tracks[Tracks.length-1].site.x+' '+Tracks[Tracks.length-1].site.y+'\n');
disline.scrollTop = disline.scrollHeight;
};
},
Tight: function (dot) //計算緊氣的塊,此時如果dot==undefined,則對應(yīng)提子的遍歷,this指向當前點.
{
var life = this.dot == undefined ? this : undefined; //life為"氣"的定義;當前位無子則算一口氣,對應(yīng)落子的遍歷,當前位置必然無子.
dot = dot == undefined ? this.dot : dot; //這個邏輯是對應(yīng)提子的遍歷
if (dot == undefined) return undefined;
var block = this.dot == undefined ? [] : [this]; //定義的"塊",在提子的遍歷中,發(fā)現(xiàn)子就放入塊,再判斷有多少"氣".
var i = this.dot == undefined ? 0 : 1;
var site = this;
while (true)
{
for(var dx=-1;dx=1;dx++) for(var dy=-1;dy=1;dy++) if(!dx^!dy)
{
link = GetSite(site.x + dx, site.y + dy);
if (link) //判斷目標位置的上下左右,有位則繼續(xù),"無位"對應(yīng)棋盤以外的區(qū)域.
if (link.dot != undefined) //有子,則判斷是否為同色,連"塊"
{
if (link.dot == dot block.indexOf(link) 0 )
block.push(link); //此一段為"塊"的遍歷,條件是找四周的同色子,找到后判斷是否為新"知道","新"則放入"塊"
}
else if (!life) //無子,則更新"氣"
life = link
else if (life != link)
return undefined; //在提子的遍歷中,如果發(fā)現(xiàn)有兩"氣"了,則無須再算
};
if ( i = block.length) break; //"塊"的遍歷結(jié)束條件為,列表的最后一個對象沒有產(chǎn)生新的相鄰子.
site = block[i];
i ++;
};
return block; //返回只有一口氣的塊,在提子的遍歷中,這對應(yīng)了可能被提掉的子列,再去判斷是否為"打劫"
},
Kill: function(dot) //計算殺死的子,目前this指向落子點,dot指向需要判斷的死子顏色.
{
var deads = []; //定義死子列
for(var dx=-1;dx=1;dx++) for(var dy=-1;dy=1;dy++) if(!dx^!dy) //異或,有且只有一個為真,可對應(yīng)到相鄰子.
{
var site = GetSite(this.x + dx, this.y + dy);
if (site (site.dot == dot))
{
var block = site.Tight(); //分別對上下左右進行遍歷,查找被緊氣的"塊",然后合并成為"死子列"
if (block) deads = deads.concat(block); //concat 合并操作,此操作并未識別"同項",僅以圍棋規(guī)則判斷,對"打劫沒有影響".
//如果需要準確的提子數(shù)目統(tǒng)計,這里的算法需要更新.
};
};
return deads; //返回可以提子的死子塊
}
}; //棋位類 Site
var Board = new Array(19); //全局的Board數(shù)組,表示棋盤。
var Tracks = []; //行棋線索數(shù)組,數(shù)組元素是Step對象。
var current = 0; //當前要下的子,0表示黑子,1表示白子,交替。
var rob = null; //如果有打劫時,記錄打劫位置。
for(var x = 0 ; x 19; x++)
{
Board[x] = new Array(19);
for(var y = 0; y 19; y++)
Board[x][y] = Site.Create(x, y); //按位置創(chuàng)建棋位對象。
};
if (navigator.userAgent.indexOf(' MSIE ') -1) //為IE瀏覽器構(gòu)造聲音對象
{
var sound = document.body.appendChild(document.createElement("bgsound"));
sound.play = function(){this.src = "play.wav"};
}
else //為Firefox等其他瀏覽器構(gòu)造聲音對象
{
var sound = document.body.appendChild(document.createElement("span"));
sound.play = function(){this.innerHTML = "bgsound src='play.wav'"};
};
document.body.oncontextmenu = function() //右鍵驅(qū)動悔棋事件
{
var step = Tracks.pop();
if (step)
{
step.site.Fill();
for (var i=0; istep.deads.length; i++)
step.deads[i].Fill(current);
step = Tracks[Tracks.length-1];
if (step) step.site.Fill(current, true)
current ^= 1; //反轉(zhuǎn)黑白棋子。
};
return false; //不彈出菜單。
};
function GetSite(x, y) //從棋盤取棋位的函數(shù),越界不拋出異常。
{
if (x=0 x19 y=0 y19)
return Board[x][y];
};
function Step(site, deads) //棋步類,記錄每一步棋的狀態(tài)
{
this.site = site; //記錄棋步的位置
this.deads = deads; //記錄被當前棋步殺死的棋子集合
};
function PrintWay() //行棋路線
{
var str='', coler='';
for (var i=0;i Tracks.length;i++)
{
step = Tracks[i];
coler = (i%2) ? "白" : "黑";
str=str+"第"+(i+1)+"步"+coler+"方 X"+step.site.x+" Y"+step.site.y+" \n";
}
alert(str);
}
document.body.ondblclick = PrintWay;
document.onkeypress = function(event)
{
var k = (window.event ? window.event.keyCode : event.which) - 49; //按'1'可以進入自動擺棋操作,'1'=0x31=49
if(k0 || k1) return;
for(var x=0; x19; x++) for(var y=0; y19; y++) Board[x][y].Fill();
Tracks.length = 0;
current = 0;
with(goes[k]) for(var i=0; ilength;i+=3)
Board[charCodeAt(i+1)-65][charCodeAt(i)-65].Fill(charCodeAt(i+2)-48);
};
/body
/html
#include "stdio.h"
main()
{
int i,j;
for(i=0;i8;i++)
{
for(j=0;j8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}