61阅读

中国象棋人机对弈-JavaScript中的原型和对象机制

发布时间:2017-11-08 所属栏目:经典散文

一 : JavaScript中的原型和对象机制

1 对象相关的一些语言特性

1.1 一切皆为对象

JavaScript里所有的东西都是对象。 对象是属性的集合。 数字, 字符串, 布尔值等原始值是“伪对象”, 它们同样拥有属性, 但是是在栈上分配并按值传递。 而其他的对象是堆上分配并按引用传递。

一个很重要的概念是, 函数也是对象, 能够作为变量的值, 返回值, 参数或者属性的值。 函数对象特殊的地方是能通过“xxx()”语法执行包含在xxx函数对象内的代码。 因为这一特殊性, typeof xxx 将会返回function, 但这只是一种便利设施。

1.2 对象的属性可以动态添加和删除

以下为引用的内容:

var foo = new Object();
// 为foo对象添加bar属性
foo.bar = "foobar";
alert(foo.bar); 
//foobar
//
 删除foo对象的bar属性
delete foo.bar;
alert(foo.bar); 
//undefined

1.3 除了宿主对象, 其它对象皆由构造函数创建

要有对象, 就先要有创建对象的方法。

在C++/Java等语言, 这个方法就是实例化XXX类的一个实例xxx.

而在JavaScript的世界里实际没有类的东西, 当然仍然可以用“类”和“实例”等惯用语来描述JavaScript中类似的行为, 但其机制是完全不同的。 JavaScript的对象是由构造函数创建的, 每个对象都有constructor属性表示创建该对象的构造函数:

以下为引用的内容:

function Test() { this.a = "hello"; }
var test = new Test(); // 由Test构造函数创建
alert(test.constructor);

var o = { a: "hello" };
//实际相当于
var o_ = new Object();
o_.a 
= "hello"// 由Object构造函数创建
alert(o.constructor);

构造函数也是对象, 那构造函数是由什么创建? 内建的Function函数:

以下为引用的内容:

function Test(a, b)
{
    alert(a+b)
;
}
// 相当于:
Test = new Function(["a""b"], "alert(a+b);");

Function函数又是由什么创建? 实际上Function是本机代码实现的固有对象. 不过为了一致性, Function也有constructor属性, 该属性指向它自己. 接上面的代码:

以下为引用的内容:

/* 输出 function Function(){
            [native code]
        }
*/
alert(Test.constructor);

alert(Test.constructor.constructor 
=== Test.constructor); // true
alert(Test.constructor === Object.constructor); // true

2 原型prototype

2.1 prototype的概念

prototype是构造函数的一个属性, 该属性指向一个对象。 而这个对象将作为该构造函数所创建的所有实例的基引用(base reference), 可以把对象的基引用想像成一个自动创建的隐藏属性。 当访问对象的一个属性时, 首先查找对象本身, 找到则返回; 若不, 则查找基引用指向的对象的属性(如果还找不到实际上还会沿着原型链向上查找, 直至到根)。 只要没有被覆盖的话, 对象原型的属性就能在所有的实例中找到。

原型默认为Object的新实例, 由于仍是对象, 故可以给该对象添加新的属性:

以下为引用的内容:

// prototype默认为new Object(); 为了方便, 记为p_obj
function Person(name) {
    
this.name = name;
}

// 为 p_obj 增加 sayName 属性
Person.prototype.sayName = function(){
    alert(
this.name);
}

var john = new Person("John"); // john 的 base reference指向p_obj
var eric = new Person("Eric");  // eric 的 base reference也是指向p_obj

// 注意sayName代码中的this将指向实例化后的对象(this绑定)
john.sayName(); // john对象本身没有sayName属性, 于是访问原型对象p_obj的sayName属性
eric.sayName(); // 访问同一个原型对象p_obj的sayName属性


var tmp = Person.prototype;
tmp.boss 
= "David";
// 于这个运行点, p_obj已经被修改
//
 根据上述属性访问流程, 新的修改(boss属性)能反映到所有的实例, 包括已经创建和即将创建的
alert("John's boss is " + john.boss);
alert(
"Eric's boss is " + eric.boss);


// hisCar和sayCar属性将增加到john对象而不是p_obj对象..
john.hisCar = "Audi";
john.sayCar 
= function(){
    alert(
this.name + " has a car of " + this.hisCar);
}
john.sayCar();
// ..因此下一句将错误, 因为eric对象本身和原型p_obj都没有sayName属性
/*
 eric.sayCar(); */

2.2 原型链

除了能修改prototype指向的对象, 还能修改prototype指向哪一个对象, 即为prototype赋予一个不同的对象。 这可以实现一种简单的继承:

以下为引用的内容:

function Superman() {}
Superman.prototype.sayHello 
= function(){
    alert(
"I'm a superman.");
}

function SupermanCan(skill){
    
this.skill = skill;
}
// 为prototype赋予Superman的实例..
SupermanCan.prototype = new Superman();
// ..再动态添加新的属性
SupermanCan.prototype.sayMore = function(){
    
this.sayHello(); // 调用"父类"的方法
    alert(
"I can " + this.skill);
}

var david = new SupermanCan("fly");
// output: I'm a superman. I can fly
david.sayMore();

如果先实例化出一个对象, 再为构造函数prototype赋予一个不同的对象, 将会: 已经创建的对象的基引用不变, 将来创建的对象的基引用为新的原型对象:

以下为引用的内容:

var f1 = {echo: function() { alert("sound"); } };
function Foo() {};
var foo = new Foo(); // foo的基引用指向Object实例
Foo.prototype = f1;
/* 未定义, 因为这是"foo对象自己或者基引用指向的对象有echo属性吗?"
   而不是"foo对象自己或者Foo.prototype指向的对象有echo属性吗?" 
*/
alert(foo.echo);

var foo2 = new Foo(); // foo2的基引用指f1对象
foo2.echo(); // output: sound

所有的构造函数的prototype都不能为空, 就是说Superman.prototype = null 会被解释引擎无视; 另一方面, Object构造函数也有prototype属性(该属性是只读的, 可以为原型增加属性,但不能赋予不同的对象), 故因此可以有多层的原型链, 但原型链的根必定会是Object.prototype 。 这意味着给Object.prototype增加属性影响到所有对象:

以下为引用的内容:

Object.prototype.echo = function() {
    alert(
"hello");
}

// echo属性将增加到所有对象固有对象和自定义对象

var arr = new Array();
arr.echo();
Array.echo();

function ObjCons()    {
    
this.dummy = "d";
}
var obj = new ObjCons();
obj.echo();
ObjCons.echo();

3. 构造函数和new的实质

构造函数是一个地地道道的函数, 一个函数之所以能成为构造函数, 是因为new运算符:

以下为引用的内容:

this.msg = "window";

function Test()
{
    alert(
this.msg);
}

Test(); 
// window
var test = new Test(); // undefined. 因为test对象没有定义msg属性

二者区别在于如何切入对象: Test() 在某个对象(例子中为window)的上下文上执行代码, 即this指向这个对象; new Test()创建一个新对象, 并以这个新的对象为上下文(this指向新对象)执行代码, 然后返回这个新对象。

假如有个函数:

以下为引用的内容:

function Test() {
    
var dummy = "have money";
    
this.wish = dummy;
    doSomeThing();
    
}

结合以上的所有论述, 可以推测new Test()行为的伪代码表示为:

以下为引用的内容:

      创建一个新对象temp;
      temp.constructor = Test;
      temp.(base reference) = Test.prototype; // 这一句先于代码体执行, 意味着构造函数里的this.xxx能访问原型对象的属性xxx
      bind: this = temp; // 将this绑定到temp对象
      // 开始执行函数代码
      var dummy = "have money";
      this.wish = dummy; // 为temp对象添加wish属性
      doSomeThing();
      ....
      // 结束执行函数代码
      return temp;


这个未必会符合内部的二进制实现, 但却能很好地解释了JavaScript的特性.

原文地址:

二 : 中国象棋人机对弈软件:象棋巫师

如果你是一名中国象棋迷,棋艺太臭无人问津?棋艺太好没有对手?作为一名棋迷,想提高棋艺却无人陪练是最痛苦的事,当然最好是有人和你一样疯狂,随叫随到,不过在现实生活中,这似乎很难实现。(www.61k.com]有以上症状者,象棋巫师能够满足你的需要。
象棋巫师软件界面
象棋巫师是一款功能超强的中国象棋教学、电脑对弈和棋谱编辑软件。软件安装后包括象棋巫师、象棋巫师魔法学校Ⅱ、象棋巫师竞技场三个部分。其中象棋巫师魔法学校Ⅱ为广大象棋爱好者提供全新的象棋教学体验;象棋巫师竞技场是象棋巫师内置的一款实战对局游戏。象棋巫师吸收了一些同类软件的优点,集众家之所长,受到广大象棋爱好者的高度评价。
象棋巫师竞技场软件界面
象棋巫师竞技场模拟20多种不同水平的对手,适合各种层次的象棋爱好者评价自己的棋艺,如果注册了象棋巫师官方账号,进入象棋巫师竞技场并登陆可与众多象棋爱好者参与成绩排名,享爱进步快乐,并且能把自己的对局保存成棋谱,既可以用象棋巫师分析也可以分享到网络上。
最后,如果你是一名中国象棋初学者,象棋巫师魔法学校Ⅱ就派上用场了。它内置上千局精心挑选的习题,采取杀局和残局合理搭配方式,全面提高学员棋艺水平;支持与众多学员参与成绩排名,全程记录学员教学进度,并拥有强大的象棋巫师用户中心云端存储功能,不用担心更换电脑或重装系统而丢失进度; 提供提示、悔棋、跳过等功能,辅助学员挑战高难度习题。
下载地址:Dbank网盘 | 官方下载

原文链接 www.61k.com ?p=636

三 : 象棋中的人性

对象棋的爱好,来自于一位初中的同学,他叫黑蛋,比我大一两岁。当年,上初中没有什么娱乐可玩,记得除了买一两本小说来读读外,几乎是散兵游勇,瞎玩一气。而那时的军旗、象棋,对我来说是一种高级的游戏,黑蛋对象棋、军棋精通,而且还拥有一副两副军旗或象棋,拿出来秀秀,当时,跟在他屁股后玩的我,就不自觉地学会了走几步,知道了象棋的布局,也了解了“马走日,象走田,车走直道炮翻山;士走角,围将转,小卒只能往前看”这种象棋的走法。每当黑蛋拿出棋来,羡慕得不得了,想自己那天也能买一副,放在家里过过瘾,让别人也羡慕羡慕咱。

时间过得真快,一愰几十年过去了,象棋在我的生活里时而出现,见了免不了手痒痒,就对阵几盘,不管输赢,一笑了之。后来,网上出现象棋游戏,就在网上对弈,网上对弈要的是积分,所以,有的玩家快要输了,为了不失分,就在网上拖着跟你磨时间,等到最后一秒时间限制时才走,耍赖皮,一遇到这种主儿,特没劲,我就立马换人。

最近几年,卫辉象棋风猛刮不减,特别在汽车站对过的农业银行墙外胡同,渐渐成了象棋爱好者集聚的地方,每天,少则两摊三摊,多则十来摊,风雨无阻,遇到下雨天,就搬到农业银行的廊檐下,有老人,也有年轻人,有时一副棋跟前围十几个人,水泄不通,两军对垒,有跟红方一派的,也有跟黑方一派的,双方争论不休,面红耳赤,棋盘上狼烟滚滚,棋盘外火药味也是弥漫尘上。

有道是:“观棋不语真君子”。但在大街上下棋,不能怕人看,也不能怕人帮腔,山外青山楼外楼,高人出自凡间,围观者,高手多的是,但大多是一瓶子不响半瓶子晃荡,所以说,别人给你指招时,你可听也可不听,不能受别人思路的影响,认为别人说的对,你听就是了,如果认为别人说的不在理,你不听也没关系,毕竟大权在你手上。有一条必须明确,下棋是一种娱乐,增长智慧,磨练心境,切不可离开棋盘,伤人和气。理是这个理,实际上,人往那一坐,就不当家了,往往把一盘棋下的,是不是是,非不是非,下到性格、人际关系、情绪里去了,甚至骂不绝口,直至拳脚相加。

我到大街的棋摊,并不亲自操刀,是属于围观者的那种主儿,一是因为事儿多,坐不了一会儿,说不清就要拍屁股走人,总不能下一半跑了,把对方撂那儿不管。二是棋艺不精,自己那两把刷子,不敢露青,怕别人笑话。站在那儿看棋就不同了,你可以给红方指点,也可以给黑方指点,也可以双方都指点,指点错了,也不负责任,输赢跟自己一点关系都没有。

看棋的时间长了,我就觉得,在棋面前其实能够看出人的性格,不管你是县长大人,还是平民百姓,到了楚河汉界,真性情就会一览无余,真相毕露,活脱脱一个真实的自我,该骂人时,你会骂人,该急眼时你也会毫不客气地急眼,当你走了一步好棋,你自然而然地就会表现出洋洋自得的神情。( 文章阅读网:www.61k.com )

棋摊上有一个高手,人称“老曾”,因为对手不多,他一般不下,他往那儿一坐,也没有人敢跟他对奕,经他指点的步,一般都是步步经典,输盘的时候少。因此,棋界的人对他都很客气,嘴上都叫“曾老师儿”。而曾老师因为棋艺高,说话总是带点傲气,在棋胡同这二分地里别人也都服气。偶有不服或外来者,大家都让老曾上阵,老将一出马,棋摊马上围得水泄不通,有的是看老曾的笑话,有的是看棋艺,而老曾总是从容不迫,淡定自如,表现出一副大家风范。

我在市人民医院,偶然遇到一老者前去看病,老者是棋摊上的,我一眼就认出了,一搭话,老者就说:“我下棋从来都不回棋,而且也不听其他人的,我下我的,输就输了,我输一盘,就顶他们输三盘五盘,因为我是一个人,他们是一堆人,一个人对付一堆人,他们输一顶十。”老者的那种执拗脾气一目了然。

还有一位是退体干部,在位时,面目严肃,说话深沉。在棋盘面前,像换了个人似的,为了一步棋争论半天。别人开他的玩笑:“你这个厅长,办案行,下棋咋老回棋呢?”他听了也不急,反面嬉皮笑脸地说:“靠,下棋能跟办案一样,这能退,办案能鸡巴退?”

有时想,我们的老祖先真厉害,发明了中国象棋,让人们从象棋的纸上谈兵,懂得了礼仪、兵法、人际乃至社会关系。象棋很符合各个兵种的作战技法,卒,是战争中最小的单位个体,它在象棋里,只能一走一步,卒尽管能力小,但也有捉住老将的时候,那个时候往往是战争打到了最激烈、最残酷的时候,没有兵力了,只能靠小卒往前冲了,中国历史上很多战例都是用小卒活捉老将的,比如,毛泽东笔下的“齐声唤,前头捉了张辉瓒”,就是小卒的功劳。其它,炮、车、马的走法都很符合自己的作战特色,作为保卫中央老将的相和士,不能像其它兵种一样任意全盘作战,警卫只能在老将的周围,以保家为己任,所以它们两个兵种不能过河。

中国是个礼仪的国家,打仗要先下战书,两军对垒,排兵布阵,再出兵撕杀,而象棋正是依据这种先礼后兵的历史文化设计的,符合中国的军事文化特色。象棋开局布阵里常见的有“边马局”、“巡河炮”、“士角炮”、“仙人指路”等十几种,而历史上真正的阵法,我们听过的有穆桂英大破敌军的“天门阵”、诸葛亮奥妙无穷的八阵图等等,从象棋到现实的开局布阵,如出一辙,一脉相承。对奕中,凡是孙子兵法上能用的,在楚河汉界边同样适用,“声东击西”、“围魏救赵”、“以逸待劳”这些计谋,在象棋摊上经常可以看到。所以要想下好象棋,不仅要通晓布局阵法,还必须熟悉象棋的各种杀法和计策,所谓通盘考虑,高瞻远瞩,方能决胜千里。

高人下棋,不仅要布局技法厉害,而且还要知彼知己,要看和你对奕的那个人是个什么性格,讲不讲礼数,只有了解了对方,才能掌控决胜的方寸。如果对方是个急脾气,你可以用激将法来打乱他的套路,如果对方多疑,不能让其看出你的心思和下一步棋的步法,甚至可以通过他的多疑击垮他。我在看下棋时,发现有个人自信不足,总是在自己进攻失利时,丧失信心,而对方抓住了他性格的弱点,在时机成熟时猛力进攻,进攻过后,他的思路便乱了,已经无心再战,最后只有缴械投降了。

清朝左宗棠喜欢下棋,很少碰到对手。率兵赴新疆平叛前夕,在街上看到一个老人在写有“天下第一棋手”的招牌下摆棋阵。左宗棠觉得老人过于狂妄,便上前挑战。没想到老人不堪一击,连连败北。左宗棠命老人赶快自己砸了招牌走人。左宗棠从新疆平叛归来,看到那块“天下第一棋手”的招牌依然竖在那里。他很不高兴,决定再教训一次老人。这一次左宗棠居然被老人“杀”得落花流水,三战三败。他觉得不可思议,就问老人什么原因,老人微笑着回答:“上次您即将出征新疆,我不想挫伤您这个一军主帅的锐气,所以存心让你赢,如今,您已凯旋,我也就无所顾忌不再谦让了。”左宗棠听后,羞惭不已。

老人才是真正的棋中高手。

四 : 谋国如弈棋

61阅读/ www.61k.net


◎王维家

《大地棋局》是何辉长篇历史小说《大宋王朝》的第二部。从历史脉络上看,这部小说紧承第一部《沉重的黄袍》,反映赵宋王朝立国初期如何稳固王朝根基的故事。通览这部小说,尽管不见铁骑纵横驰骋,没有刀光剑影闪耀,甚至看不到两军对垒的紧张与一触即发;但是,通篇字里行间却又处处弥漫着一股股搏杀的气氛,使人不时感受到“山雨欲来风满楼”的压迫与凶险。这种大战前的宁静带给人的绝不是气定神闲,在其背后隐藏着的是运筹帷幄的谋略,尔虞我诈的“暗战”以及定鼎乾坤的妙计。

从历史来看,陈桥兵变,“黄袍加身”,赵匡胤以“少流血”的方式实现了王朝的更替,开国之易为五代以来所罕见,然而接踵而来的并非就是天下太平,高枕无忧。相反,迎接开国之君赵匡胤及其新王朝的,是朝内外、国内外各式各样的压力和形形色色的凶险。放眼王朝内部,节度使李筠、李重进蠢蠢欲动,图谋反叛;皇弟赵匡义暗中磨刀霍霍,觊觎大位;韩通之子韩敏信及部将陈骏处心积虑,伺机行刺;就连最亲近的谋臣赵普也是三面讨好,两处下注,朝堂内外可谓凶险重重,危机四伏。再环顾王朝周边,更是四面受敌,处在被重重包围境地:北边是强大的辽国和背靠契丹肆行骚扰的北汉;西边有羽翼渐丰的吐蕃、党项;西南有号称“天府之国”的后蜀;南面有口出卑言实则抗拒的南唐,东南有吴越,再往南还有南汉等大大小小的十数个割据政权。这些内忧外患好似棋盘上纵横交错的棋格,看似平淡无奇,实则机关重重,牵一发而动全身,走错一步就可能会导致满盘皆输。

“谋国如弈棋”,正如书名之《大地棋局》所言,一群心态各异的棋手,在暗中运筹、布局、博弈,以期决胜于千里之外。从这一点来说,“博弈”是这部小说最主要的内容,是作者谋篇布局的立足点,作者牢牢把握住“博弈”主线,通过不同人物的粉墨登场来谋篇布局,推动情节,展现历史,整部书写得跌宕起伏,引人入胜,又促人深思。

如何下好“谋国”这盘棋?赵匡胤在思考、谋划,赵匡胤的政敌、对手和敌国也在盘算、运筹。本来,有形的对弈只是两个人的事,一来一往,以程式的公平决定弈棋的胜负,以胜负判别棋艺水平的高低和棋手个人的智慧度量。但是,历史的棋盘并不是平面的、有形的,也往往不是两个对手在下,而是多个对手在下,《大地棋局》就是这样一副历史的棋盘。作者的高妙之处在于,他以皇位、政权和疆土为标靶,把多个对手聚拢起来,让他们以各自的方式和目的来下这样一盘决定个人命运和邦国未来的人生与历史大棋。在博弈的众多“棋手”中,赵匡胤无疑是核心,因为只有他才有能力决定着棋局的走势和结局,因此作者以相当大的篇幅来表现赵匡胤在这副“棋盘”上的排兵布阵和纵横捭阖,展现他的雄才大略与过人之处。比如书中三次写到赵匡胤的巡访,一次是带领朝臣察访,一次是轻车简从微服私访,一次是半夜突然驾临赵普家中探访。三次巡访对象、目的不同,但皆浓墨重彩,描写细腻,生动展现赵匡胤忧心国事、体察民情与谋事稳重的情怀和个性。

“朕担心棋局走错一步,满盘皆输啊!”一句话使赵匡胤的弈棋心理跃然纸上!

另一方面,与赵匡胤及赵宋王朝博弈的“棋手”多不可数,昭义节度使李筠、淮南节度使李重进、北汉以及契丹直接处在赵宋王朝的对立面,进行的是剑拔弩张的军事上的博弈;皇弟赵光义及夫人符氏、谋臣赵普站在赵匡胤侧后,既彼此利用又相互防范,进行的是背后的博弈;天雄军节度使符彦卿、韩通之子韩敏信若隐若现,一个形成震慑,一个伺机行刺,进行的是侧翼的博弈;南唐、吴越站在赵宋王朝一统江山的正前方,进行的是战略与策略上的博弈;还有西夏、南汉、闽等政权,对赵宋王朝来说虽然是潜在的博弈对手,作者也没有忽视不顾,着墨虽少,却为以后各卷埋下了伏笔。

“以大地为棋盘,以天下为棋局”,下一盘谋国之大棋,是这部小说最大的看点,也是谋篇布局最为成功的地方。

五 : 寻求一个中国象棋网络对弈平台我有一个朋友,是我们当地的象棋高手,

寻求一个中国象棋网络对弈平台

我有一个朋友,是我们当地的象棋高手,他没有,平时不上网下棋,可是这两天发生兴趣,经常到我这里,想在网上找高手切磋;我象棋水平太差,在中国游戏中心有一个号,只积了一百多分,我朋友有两千分以上的实力,可是他用我的号上网,高手都不愿意跟他下。
在中国游戏中心申请的号,都只能从最低的级别开始往上打。我知道有些围棋网站,如果觉得自己水平高,可以申请一个高段位的号。我想问,有没有一个象棋对弈网站,新注册的号可以申请到一个较高的级别?
或者哪位朋友有多余的中国游戏中心的象棋高分号,送给我一个,我愿意出一百分或者更多的分交换。


去弈天棋缘网下,这里不象联众世界,也不象QQ里的象棋,一开始上时,就会碰到高手,不信,你让他去那里试试!专业的象棋人士都去弈天棋缘网下,说不定会碰到张强。我曾用软件在联众世界上下,一直打到最高境界:国手,但是,一上弈天棋缘,一个等级较低的人也会让软件自愧不如!绝对是最佳的选择!

这是它的客户端下载地址:

当然,你也可打开它官方的网页:

然后,下载(就是上方的下载地址),安装后,打开客户端申请一个号码,然后就可以,痛痛快快地找人下了!这里的高手可多了,一般的话,县级冠军到这里能上到几级?

本文标题:中国象棋人机对弈-JavaScript中的原型和对象机制
本文地址: http://www.61k.com/1071070.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1