如何用javascript实现围棋游戏

JavaScript012

如何用javascript实现围棋游戏,第1张

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<title>禅棋传说</title>

<style type="text/css">

div { position: absolutewidth: 23pxheight: 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) //给数组扩展一个indexOf方法,用来检索是否为"已知元素"

{

for ( var i=0i<this.lengthi++)

if (this[i] == item)

return i

return -1

}

var Site = //定义一个棋位类

{

Create: function(x, y) //棋位类的构造函数

{

var me = document.createElement("div")//建一个div对象,将其扩展并封装成棋位。

document.body.appendChild(me) //附加到DOM树,实现棋位的呈现。

me.x = x //记录棋位的X坐标

me.y = y //记录棋位的Y坐标

me.style.left = x * 23 + "px" //设置棋位水平方向的绝对位置

me.style.top = y * 23 + "px" //设置棋位垂直方向的绝对位置

//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 //关联一个填充棋位的方法。

me.Tight = this.Tight //关联计算紧气方法。

me.Kill = this.Kill //关联计算死子方法。

me.onclick = this.Play//绑定onclick事件到Play方法。

me.Fill() //初始填充空子。

return me //返回棋位对象,其实是一个封装了的div对象。

},

Fill: function(dot, going) //填充棋子的方法,going~~是否"当前步".

{

if ( dot == undefined )

this.className = this._backStyle//无子,就设置为背景式样。

else

this.className = (going ? "C" : "D") + dot //有子,区别对待"当前步"

this.dot = dot//保存棋子状态

},

Play: function()//行棋方法,由onclick事件触发

{

if ( this.dot == undefined ) //落子点必须为无子状态,否则不处理.

{

var deads = this.Kill(current^1)//计算可以杀死的子,current为当前颜色,则current^1为对方颜色

if (deads.length == 1 &&this == rob) return//确认的打劫状态后,直接拒绝如果此步落子可以提不止一子,则不是打劫

for(var i=0i<deads.lengthi++)

deads[i].Fill() //按照死子列清空,one by one

if(i==1)

rob = deads[0]//如果此步只提了一个子,记录被提位置为打劫位置.

else if (i>0 || !this.Tight(current)) //这里有一个影响代码效率的判断,对于能产生提子的操做,不需要再判断是否"紧气禁入"此外,如果要引入"变穷为禁"的规则,这里需要改变算法

rob = null//清打劫位,这个条件是判断,如果能够提多子,或者不是禁止着手,则解除"打劫"状态

else return //这里对应的返回,应该是只有无气禁入点的情况.

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来异或,正好反转黑白棋子。

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,则对应提子的遍历,this指向当前点.

{

var life = this.dot == undefined ? this : undefined//life为"气"的定义当前位无子则算一口气,对应落子的遍历,当前位置必然无子.

dot = dot == undefined ? this.dot : dot//这个逻辑是对应提子的遍历

if (dot == undefined) return undefined

var block = this.dot == undefined ? [] : [this]//定义的"块",在提子的遍历中,发现子就放入块,再判断有多少"气".

var i = this.dot == undefined ? 0 : 1

var site = this

while (true)

{

for(var dx=-1dx<=1dx++) for(var dy=-1dy<=1dy++) if(!dx^!dy)

{

link = GetSite(site.x + dx, site.y + dy)

if (link) //判断目标位置的上下左右,有位则继续,"无位"对应棋盘以外的区域.

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 //在提子的遍历中,如果发现有两"气"了,则无须再算

}

if ( i >= block.length) break //"块"的遍历结束条件为,列表的最后一个对象没有产生新的相邻子.

site = block[i]

i ++

}

return block //返回只有一口气的块,在提子的遍历中,这对应了可能被提掉的子列,再去判断是否为"打劫"

},

Kill: function(dot) //计算杀死的子,目前this指向落子点,dot指向需要判断的死子颜色.

{

var deads = []//定义死子列

for(var dx=-1dx<=1dx++) for(var dy=-1dy<=1dy++) if(!dx^!dy) //异或,有且只有一个为真,可对应到相邻子.

{

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 合并操作,此操作并未识别"同项",仅以围棋规则判断,对"打劫没有影响".

//如果需要准确的提子数目统计,这里的算法需要更新.

}

}

return deads //返回可以提子的死子块

}

}//棋位类 Site

var Board = new Array(19) //全局的Board数组,表示棋盘。

var Tracks = [] //行棋线索数组,数组元素是Step对象。

var current = 0 //当前要下的子,0表示黑子,1表示白子,交替。

var rob = null//如果有打劫时,记录打劫位置。

for(var x = 0 x <19x++)

{

Board[x] = new Array(19)

for(var y = 0y <19y++)

Board[x][y] = Site.Create(x, y) //按位置创建棋位对象。

}

if (navigator.userAgent.indexOf(' MSIE ') >-1) //为IE浏览器构造声音对象

{

var sound = document.body.appendChild(document.createElement("bgsound"))

sound.play = function(){this.src = "play.wav"}

}

else//为Firefox等其他浏览器构造声音对象

{

var sound = document.body.appendChild(document.createElement("span"))

sound.play = function(){this.innerHTML = "<bgsound src='play.wav'>"}

}

document.body.oncontextmenu = function() //右键驱动悔棋事件

{

var step = Tracks.pop()

if (step)

{

step.site.Fill()

for (var i=0i<step.deads.lengthi++)

step.deads[i].Fill(current)

step = Tracks[Tracks.length-1]

if (step) step.site.Fill(current, true)

current ^= 1 //反转黑白棋子。

}

return false //不弹出菜单。

}

function GetSite(x, y) //从棋盘取棋位的函数,越界不抛出异常。

{

if (x>=0 &&x<19 &&y>=0 &&y<19)

return Board[x][y]

}

function Step(site, deads) //棋步类,记录每一步棋的状态

{

this.site = site //记录棋步的位置

this.deads = deads//记录被当前棋步杀死的棋子集合

}

function PrintWay() //行棋路线

{

var str='', coler=''

for (var i=0i <Tracks.lengthi++)

{

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(k<0 || k>1) return

for(var x=0x<19x++) for(var y=0y<19y++) Board[x][y].Fill()

Tracks.length = 0

current = 0

with(goes[k]) for(var i=0i<lengthi+=3)

Board[charCodeAt(i+1)-65][charCodeAt(i)-65].Fill(charCodeAt(i+2)-48)

}

</body>

</html>

围棋起源于中国古代,是一种策略性二人棋类游戏,使用格状棋盘及黑白二色棋子进行对弈。目前围棋流行于亚太,覆盖世界范围,是一种非常流行的棋类游戏。

目录

简介

起源

传说

中国围棋的发展地位

春秋、战国时期

秦、汉、三国时期

南、北朝时期

隋时期

唐、宋、元时期

明、清时期

近、现代

围棋规则现代规则

古代规则

围棋术语

围棋段位和级位综述

细则

公示

鉴定

年审

证书

级位制

围棋头衔

围棋赛事国内棋战

韩国棋战

日本棋战

世界棋战

中日棋战

中韩棋战

职业围棋棋手中国

日本

韩国

中国台北

历史上的著名棋手中国

日本

韩国

围棋与哲学契合本性

元素性

自然规律

围棋与经济学

计算机围棋JS围棋程序

常见的围棋软件

网上对弈软件

关于围棋的动漫

关于围棋的小说

关于围棋的古谱

贴吧相册 简介

起源

传说

中国围棋的发展 地位

春秋、战国时期

秦、汉、三国时期

南、北朝时期

隋时期

唐、宋、元时期

明、清时期

近、现代

围棋规则 现代规则

古代规则

围棋术语

围棋段位和级位 综述

细则

公示

鉴定

年审

证书

级位制

围棋头衔

围棋赛事

国内棋战 韩国棋战 日本棋战 世界棋战 中日棋战 中韩棋战职业围棋棋手

中国 日本 韩国 中国台北历史上的著名棋手

中国 日本 韩国围棋与哲学

契合本性 元素性 自然规律围棋与经济学计算机围棋

JS围棋程序 常见的围棋软件 网上对弈软件关于围棋的动漫关于围棋的小说关于围棋的古谱贴吧相册 展开 编辑本段简介

中文:围棋 日文:囲碁(读音yigo) 韩文:바둑  拼音:wéiqí(也是我国提倡的英文译法) 围棋的棋子和棋盘

英文:Go(源自日文的发音),weiqi,the game of go或the chess of go(但weiqi用得比较普遍,是我国提倡的英文译法)。 在英文词汇中,有些中国的东西,因为最先由日本人传入西方国家,所以称呼都用日本发音。例如:豆腐,盆栽,折纸,等等。 围棋是一种智力游戏,起源于中国。中日韩是现今围棋的三大支柱,但近年来日本围棋逐步衰弱,形成了中韩争霸的局面。 目前,围棋面临的最大问题是规则不统一,没有一个国际性的组织统一管理,所以在推广过程中面临着巨大的困难。中国围棋规则是数子法,日本围棋规则和韩国围棋规则是数目法,台湾应氏围棋规则(应氏规则)和智运围棋规则(2008世界智力运动会围棋规则)采用的是计点制度。一盘棋用三种规则计算出来的结果一般是相同的。尽管国际上开了多次围棋规则研讨会,不过各方均坚持自己国家的围棋规则最好,都不可做任何退让,除了在非原则性的问题上(比如:棋盘大小、用时、赛场规定)有一些统一外,在真正的问题上(围棋胜负计算)没有任何进展。围棋的本质是:谁的占地面积大谁获胜。不过“地”至今没有一个能被世界接受的定义--中国规则是“子空皆地”,日韩规则是“唯目是地”,应氏规则也是“子空皆地”。(与中国规则区别为:中国规则计算胜负是单方,与盘面中数180.5进行比较;应氏规则为黑白双方的点数相减,此处的“点”事实上就是中国规则说的“子”,就是称呼不一样。) 古代围棋与现代围棋下法有非常大的不同,主要 围棋

区别有以下四点:第一,古代围棋有还棋头(眼位不是目,该规则后来被日本废除);第二,古代围棋白先黑后(现代围棋黑先白后,该规则后来被日本修改);第三,古代围棋没有贴目,黑棋181子就获胜(日本发明的贴目,目前黑棋185子才获胜),无贴目围棋的下法已经失传了;第四,古代围棋是座子制,就是先在对角星位分别放黑白两子,最大限度限制先手优势(后来被日本废除,为了限制先手增加了贴目)。 围棋的规则十分简单,却拥有十分广阔的落子空间,使得围棋变化多端,比其它棋类复杂深奥。这就是围棋的魅力所在。下围棋对人脑的智力开发很有帮助,可增强一个人的计算能力、创造能力、思维能力、判断能力,也能提高人的注意力和控制力。下围棋对儿童少年的智力发展起到积极作用,使他们能更好的分析事物。围棋有横竖19条线,总共有361个交叉点。就是因为第一手有361种选择,第二手有360种选择……从而,围棋是唯一电脑下不出的棋,最强的电脑围棋也只有13级水平。围棋变化多端,而且还有定式……所以,围棋是棋类中较为复杂的。中国就是围棋的故乡,围棋高手也很多,如:古力、周鹤洋、常昊、聂卫平……

编辑本段起源

中国古代四大艺术:「琴、棋、书、画」之棋,指的就是围棋。 《路史后记》中说尧娶妻富宜氏,生下儿子丹朱。丹朱行为不好,尧至汾水之滨,见二仙对坐翠桧,划沙为道,以黑白行列如阵图。帝前问全丹朱之术,一仙曰:「丹朱善争而愚,当投其所好,以闲其情。」指沙道石子:「此谓弈枰,亦名围棋,局方而静,棋圆而动,以法天地,自立此戏,世无解者。」。丹朱由尧处学了围棋,据说果真有了长进。(仙话见《历代神仙通鉴》)也有人说是舜作围棋以教愚子商均。按照这种说法,制造围棋,是为了开发智能,纯洁性情的。唐朝人皮日休在其《原弈》一文中则以为围棋始于战国,是纵横家们的创造。他的根据是,围棋「有害诈争伪之道」!可谓穿凿附会了。 围棋

在甘肃永昌县鸳鸯池出土的原始社会末期的陶罐,不少绘有黑色、红色甚至彩色的条纹图案,线条均匀。纵横交错,格子齐整,形状很像现在的围棋盘,但纵横线条只有十至十二道,而不像现在是十九道。考古学家称之为棋盘纹图案。

编辑本段传说

相传,上古时期尧都平阳,平息协和各部落方国以后,

围棋照片集锦(19张)农耕生产和人民生活呈现出一派繁荣兴旺的景象。但有一件事情却让尧帝很忧虑,散宜氏所生子丹朱虽长大成人,十几岁了却不务正业,游手好闲,聚朋嚣讼斗狠,经常招惹祸端。大禹治平洪水不久,丹朱坐上木船让人推着在汾河西岸的湖泊里荡来荡去,高兴地连饭也顾不上吃了,家也不回了,母亲的话也不听了。散宜氏对帝尧说:“尧啊,你只顾忙于处理百姓大事,儿子丹朱越来越不像话了,你也不管管,以后怎么能替你干大事呀!”尧帝沉默良久,心想:要使丹朱归善,必先稳其性,娱其心,教他学会几样本领才行。便对散宜氏说:“你让人把丹朱找回来,再让他带上弓箭到平山顶上去等我。” 这时丹朱正在汾河滩和一群人戏水,忽见父亲的几个卫士,不容分说,强拉扯着他上了平山,把弓箭塞到他手里,对他说:“你父帝和母亲叫你来山上打猎,你可得给父母装人啊。”丹朱心想:射箭的本领我又没学会,咋打猎呢?丹朱看山上荆棘满坡,望天空白云朵朵,哪有什么兔子、飞鸟呢?这明明是父亲母亲难为自己!“哼,打猎我就是不学,看父母能把我怎么样!”卫士们好说歹劝,丹朱就是坐着动也不动。一伙人正吵嚷着,尧帝从山下被侍从搀扶着上来了,衣服也被刮破了。看到父帝气喘吁吁的样子,丹朱心里不免有些心软,只好向父帝作揖拜跪,唱个喏:“父帝这把年纪要爬这么高的山,让儿上山打猎,不知从何说起?”尧帝擦了把汗,坐到一块石上,问:“不孝子啊,你也不小了,十七、八岁了,还不走正道,猎也不会打,等着将来饿死吗?你看山下这么广阔的土地,这么好的山河,你就不替父帝操一点心,把土地、山河、百姓治理好吗?”丹朱眨了眨眼晴,说:“兔子跑得快,鸟儿飞得高,这山上无兔子,天上无飞鸟,叫我打啥哩。天下百姓都听你的话,土地山河也治理好了,哪用儿子再替父帝操心呀。”尧帝一听丹朱说出如此不思上进、无心治业的话,叹了一口气说:“你不愿学打猎,就学行兵征战的石子棋吧,石子棋学会了,用处也大着哩。”丹朱听父帝不叫他打猎,改学下石子棋,心里稍有转意,“下石子棋还不容易吗?坐下一会儿就学会了。”丹朱扔掉了箭,要父亲立即教他。尧帝说:“哪有一朝一夕就能学会的东西,你只要肯学就行。”说着拾起箭来,蹲下身,用箭头在一块平坡山石上用力刻画了纵横十几道方格子,让卫士们捡来一大堆山石子,又分给丹朱一半,手把着手地将自己在率领部落征战过程中如何利用石子表示前进后退的作战谋略传授讲解给丹朱。丹朱此时倒也听得进去,显得有了耐心。直至太阳要落山的时候,帝尧教子下棋还是那样的尽心尽力。在卫士们的催促下,父子们才下了平山,在乎水泉里洗了把脸,回到平阳都城。 围棋

此后一段时日,丹朱学棋很专心,也不到外边游逛,散宜氏心里踏实些。尧帝对散宜氏说:“石子棋包含着很深的治理百姓、军队、山河的道理,丹朱如果真的回心转意,明白了这些道理,接替我的帝位,是自然的事情啊。”谁料,丹朱棋还没学深学透,却听信先前那帮人的坏话,觉得下棋太束缚人,一点自由也没有,还得费脑子,犯以前的老毛病,终日朋淫生非,甚至想用诡计夺取父帝的位置,散宜氏痛心不已,大病一场,怏怏而终。帝尧也十分伤心,把丹朱迁送到南方,再也不想看到丹朱,还把帝位禅让给经过他三年严格考察认为不但有德且有智有才的虞舜。虞舜也学尧帝的样子,用石子棋教子商均。以后的陶器上便产生围棋方格的图形,史书便有“尧造围棋,以教丹朱”的记载。今龙祠乡晋掌村西山便有棋盘岭围棋石刻图形遗迹。

编辑本段中国围棋的发展

地位

围棋是汉民族传统文化中的瑰宝,它体现了汉民族对智慧的追求,古人常以“琴棋书画”论及一个人的才华和修养,其中的“棋”指的就是围棋。 古代的围棋

被人们形象地比喻为黑白世界的围棋,是我国古人所喜爱的娱乐竞技活动,同时也是人类历史上最悠久的一种棋戏。由于它将科学、艺术和竞技三者融为一体,有着发展智力,培养意志品质和机动灵活的战略战术思想意识的特点,因而,几千年来长盛不衰, 并逐渐地发展成了一种国际性的文化竞技活动。 围棋,在我国古代称为弈,在整个古代棋类中可以说是棋之鼻祖,相传已有4000多年的历史。据《世本》所言,围棋为尧所造。晋张华在《博物志》中亦说:“舜以子商均愚,故作围棋以教之。”舜是传说人物,造围棋之说不可信,但它反映了围棋起源之早。

春秋、战国时期

围棋已在社会上广泛流传了。《左传·襄公二十五年》曾记载了这样一件事,公元前559年,卫国的国君献公被卫国大夫宁殖等人驱逐出国。后来,宁殖的儿子又答应把卫献公迎回来。文子批评道:“宁氏要有灾祸了,弈者举棋不定,不胜其耦,而况置君而弗定乎?”用“举棋不定”这类围棋中的术语来比喻政治上的优柔寡断,说明围棋活动在当时社会上已经成为人们习见的事物。

秦、汉、三国时期

秦灭六国一统天下,有关围棋的活动鲜有记载。《西京杂记》卷三曾有西汉初年“杜陵杜夫子善弈棋,为天下第一人” 关于围棋的诗

的记述,但这类记载亦是寥如星辰,表明当时围棋的发展仍比较缓慢。到东汉初年,社会上还是“博行于世而弈独绝”的状况。直至东汉中晚期,围棋活动才又渐盛行。1952年,考古工作者于河北望都一号东汉墓中发现了一件石质围棋盘,此棋局呈正方形,盘下有四足,局面纵横各17道,为汉魏时期围棋盘的形制提供了形象的实物资料。与汉魏间几百年频繁的战争相联系,围棋之战也成为培养军人才能的重要工具。东汉的马融在《围棋赋》中就将围棋视为小战场,把下围棋当作用兵作战,“三尺之局兮,为战斗场;陈聚士卒兮,两敌相当。”当时许多著名军事家,像三国时的曹操、孙策、陆逊等都是疆场和棋枰这样大小两个战场上的佼佼者。著名的“建安七子”之一——王粲,除了以诗赋名著于世外,同时又是一个围棋专家。据说他有着惊人的记忆力,对围棋之盘式、着法等了然于胸,能将观过的“局坏”之棋,重新摆出而不错一子。 我国围棋之制在历史上曾发生过两次重要变化,主要是在于局道的增多。魏晋前后,是第一次发生重要变化的时期。魏邯郸淳的《艺经》上说,魏晋及其以前的“棋局纵横十七道,合二百八十九道,白、黑棋子各一百五十枚”。这与前面所介绍的河北望都发现的东汉围棋局的局制完全相同。但是,在甘肃敦煌莫高窟石室发现的南北朝时期的《棋经》却载明当时的围棋棋局是“三百六十一道,仿周天之度数。”表明这时已流行19道的围棋了。这与现在的棋局形制完全相同,反映出当时的围棋已初步具备现行围棋定制。

南、北朝时期

由于南北朝时期玄学的兴起,导致文人学士以尚清谈为荣,因而弈风更盛,下围棋被称为“手谈”。上层统治者也无不雅好弈棋,他们以棋设官,建立“棋品”制度,对有一定水平的“棋士”,授予与棋艺相当的“品格”(等级)。当时的棋艺分为九品,《南史·柳恽传》载:“梁武帝好弈,使恽品定棋谱,登格者二百七十八人”,可见棋类活动之普遍。现在日本围棋分为“九段”即源于此。上述这些变化,极大地促进了围棋游艺技术的提高,为后来围棋游艺在中国的进一步发展和向国外的传播奠定了基础。

隋时期

由19道棋盘代替了过去的17道棋盘,从此19道棋盘成为主流。而随着隋帝国对外的政策,高句丽、新罗百济把围棋带到了朝鲜半岛,遣隋使把围棋带到了日本国。

关于写一个带存档的js游戏相关资料如下

最近使用 JS 写了一个贪吃蛇游戏,效果如下:

贪吃蛇作为一款经典又简单的小游戏,每个人都玩过。实现一个贪吃蛇游戏基本具有以下功能:

棋盘(也被称作 “地图”,我这里画的像一个围棋棋盘,索性就叫棋盘)

蛇 (细致一点分为:蛇头、蛇身、蛇尾)

方向(上下左右)控制,并且自动行走

碰撞检测(撞墙、撞自己)

食物在随机位置生成

蛇吃到食物,尾部生长一截

以上也便是我的实现步骤了,下面分享一些更详细的实现思路。