求象棋规则大神破解……红先走

埋葬的人生的贴吧
捷安特标风2500,禧玛诺套件。八成新。价格私聊,支持试骑。联系电话。 医院见习一定要穿白色鞋子吗?我每次被打击,都在心里告诉自己不要放在心上,可是为什么一天自己都高兴不起来?我觉得每个人每一条路,只是路不同,而我就应该找到属于自己的一条路,不管如何也要走...来学校读了一年直接从一百一十多瘦到八十九,谁知道学校网址学校门口发生抢劫,保安在干嘛?在吃翔么?现在我发现起点已经不如创始了,都不知道那个网站小说好了?谁知道学校宿舍什么时候开门?一天兔子和老鹰比赛跑,如果兔子赢了老鹰就不再吃兔子,比赛开始老鹰遥遥领先,快到终...唉我想创一个群可是在电脑上为毛创不起为毛在手机上才可以创 我读大一被父母逼着选了一个我讨厌的专业,对这个专业我很迷茫,我在想转专业,但是又...请问考计算机一级只考实际操作吗?还要考理论吗?求知道的师兄师姐解答,谢谢!过年玩什么好!说说你们最喜欢的小说大神和最讨厌的我是新生……我请问一下那个查分怎么查啊!JavaScript中国象棋程序(3) - 电脑自动走棋 - royhoo - 博客园
随笔 - 53, 文章 - 0, 评论 - 12, 引用 - 0
“JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序。这是教程的第3节。
程序的最终效果。
这一系列共有9个部分:
这一节,程序将可以自动行棋。但仅仅是走了一步符合象棋规则的棋,电脑智商为0。
3.1、帅(将)的走法生成
使用一个辅助数值表示这4个方向:
var KING_DELTA = [-16, -1, 1, 16];
已知帅在一维棋局数组中的起点位置sqSrc。生成帅的走法,就是获取帅全部的合法终点sqDes。使用一个数组存储所有可能的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {
// 将的4个方向
var sqDst = sqSrc + KING_DELTA[i]; // 得到一个可能的终点位置
if (该位置不位于九宫中) {
// 该走法不合法,执行下一轮循环
var pcDst = 终点位置的棋子;     // 如果终点位置没有棋子,那么pcDst=0
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
3.2、仕的走法生成
同样使用辅助数组表示仕的4个方向:
var ADVISOR_DELTA = [-17, -15, 15, 17];
生成仕的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {      // 仕的4个方向
var sqDst = sqSrc + ADVISOR_DELTA[i]; // 得到一个可能的终点位置
if (该位置不位于九宫中) {
// 该走法不合法,执行下一轮循环
var pcDst = 终点棋子;          // 如果终点位置没有棋子,那么pcDst=0
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
3.3、象的走法生成
我们并不用设置一个类似[-34, -30, 30, 37]的数组保存象的方向。因为仕的方向,跟象眼的方向一致。仕方向的二倍,就是象的方向。
生成象的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {
// 象的4个方向
var sqDst = sqSrc + ADVISOR_DELTA[i]; // 获得象眼的位置
if (象眼不在棋盘上,或者象眼位置已过河,或者象眼存在棋子) {
// 位置不合法,执行下一轮循环
sqDst += ADVISOR_DELTA[i];     // 得到一个可能的终点位置
var pcDst = 终点位置的棋子     // 如果终点位置没有棋子,那么pcDst=0
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
3.4、马的走法生成
用辅助数组表示马的方向:
KNIGHT_DELTA = [[-33, -31], [-18, 14], [-14, 18], [31, 33]];
对应马腿的4个方向,与帅的4个方向是一样的。
生成马的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {      // 马腿的4个方向
var sqDst = sqSrc + KING_DELTA[i];  // 得到一个马腿的位置
if (马腿位置存在棋子) {
for (var j = 0; j & 2; j ++) { // 1个马腿对应2个马的方向
sqDst = sqSrc + KNIGHT_DELTA[i][j]; // 得到一个马的可能的终点位置
if (该位置不在棋盘上) {
var pcDst = 终点位置的棋子;
// 如果终点位置没有棋子,那么pcDst=0
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
3.5、车的走法生成
车的方向与帅的方向相同,只不过车可以连续走下去。
生成车的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {
var delta = KING_DELTA[i]; // 得到一个方向
var sqDst = sqSrc + // 从起点sqSrc开始,沿着方向delta走一步
while (sqDst在棋盘上) {
var pcDst = sqDst位置的棋子;
if (pcDst == 0) {
// sqDst位置上根本就没有棋子
走法合法,保存到步骤数组中
if (pcDst是对方的棋子) {
走法合法,保存到步骤数组中
// 已经遇到了对方棋子,终止循环
// 沿着方向delta向前走一步
3.6、炮的走法生成
炮的走法与车类似,但炮遇到一个棋子后,可以越过去,也就是翻山,并吃掉一个对方棋子。
生成炮的走法,伪代码如下:
for (var i = 0; i & 4; i ++) {
var delta = KING_DELTA[i]; // 得到一个方向
var sqDst = sqSrc + // 从起点sqSrc开始,沿着方向delta走一步
while (sqDst在棋盘上) {
var pcDst = sqDst位置的棋子;
if (pcDst == 0) {
// sqDst位置上根本就没有棋子
走法合法,保存到步骤数组中
// 终点存在棋子,炮需要翻山
// 沿着方向delta向前走一步
// 沿着方向delta向前走一步
while (IN_BOARD(sqDst)) { // 如果sqDst仍位于棋盘,那么此时炮已经翻山了
var pcDst = sqDst位置的棋子;
if (pcDst & 0) {
// 炮翻山后遇到了一个棋子
if (pcDst是对方棋子) {
走法合法,保存到步骤数组中
// 炮翻山后,不管遇到的是对方棋子,还是己方棋子,都要结束对当前方向的搜索
七、兵的走法生成
红兵和黑卒向前走的方向是不一样的,分别是-16和16。在上一节,我们已经介绍了下面的函数:
// sp是棋子位置,sd是走棋方(红方0,黑方1)。返回兵(卒)向前走一步的位置。
function SQUARE_FORWARD(sq, sd) {
return sq - 16 + (sd && 5);
该函数可以获得兵(卒)前进一步的位置。
生成兵的走法,伪代码如下:
var sqDst = SQUARE_FORWARD(sqSrc, this.sdPlayer); // 得到兵(卒)前进一步的位置
if (sqDst在棋盘上) {
var pcDst = sqDst位置的棋子;
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
if (这个兵(卒)已过河) {
for (var delta = -1; delta &= 1; delta += 2) {
// delta只能取-1和1两个值,这正是兵(卒)的左右两个方向
sqDst = sqSrc +
if (sqDst在棋盘上) {
var pcDst = sqDst位置的棋子;
if (pcDst不是本方棋子) {
走法合法,保存到步骤数组中
3.8、电脑先走功能的实现
如果我们选择了“电脑先走”,并点击“重新开始”按钮,那么电脑会执红先走。红棋显示在上方,黑棋显示再下方,并且红棋会先走一步,如下图所示:
这其实就是在视觉上,将原来的棋盘旋转180°。例如,本来显示在左上角的黑车,现在显示在右下角的位置。在一维棋盘数组中,左上角的位置是51,右下角的位置是203。也就是说,要想实现对棋盘旋转180°,只需将sq位置的棋子,显示在254-sq的位置。如下函数就是实现这一功能的:
function SQUARE_FLIP(sq) {
return 254 -
当用户点击棋盘时,需要对点击的位置再执行一次SQUARE_FLIP函数,就可以转换为用户点击的棋盘数组中的位置。
3.9、核心代码说明
本节的代码可以在&&下载,也可以直接clone
git clone -b step-3 https://github.com/Royhoo/write-a-chinesechess-program
这一节我们引入一个新的对象Search,负责实现搜索算法。目前我们的搜索算法很简单,就是生成全部走法后随机选择一个。
Board中新增或修改的主要属性和方法
(1)、computer
computer = 0,表示电脑执黑;computer = 1,表示电脑执红。在index.html中,会对computer赋初值为0。
(2)、busy
busy默认为false,此时可以响应用户的点击事件。如果电脑正常思考状态下,比如正常执行搜索算法,busy会被置为true,不响应点击事件。
(3)、response()
电脑回一步棋。
(4)、restart(fen)
重新使用fen串初始化棋局。该方法会调用response(),这就实现了在电脑执红的情况下,电脑先走一步棋的功能。
(5)、retract()
Position中新增或修改的主要属性和方法
(1)、mvList[]
这是一个数组,保存每步的走法。悔棋的时候会用到。
(2)、pcList[]
这也是一个数组,保存每步被吃的棋子。如果这一步没有棋子被吃,那么保存的是0。
该数组也会在悔棋的时候用到。
(3)、generateMoves()
生成棋局的所有走法。
(4)、makeMove(mv)
走一步棋,主要需要以下4步:
1、删除终点棋子,并记录吃子。
2、将起点棋子放在终点。
3、保存这一走法。
4、切换走棋方。
Search中主要属性和方法
(1)、pos
Position实例。
(2)、searchMain()
搜索算法。目前非常简单,就是生成所有可能的走法,随机选择一个。点标签看更多好帖
更新于& 14:15
红先走。。谁赢&
TA共获得:
评分共:<em id="J_rateLogNum_ 条
街上的女人穿的很危险,但是长的很安全!
发表于 13:52
TA共获得:
评分共:<em id="J_rateLogNum_ 条
【爱丽屋】临平新大地
汽车销售顾问
发表于 13:57
太没智商了啊
TA共获得:
评分共:<em id="J_rateLogNum_ 条
这是为什么呢?
发表于 14:02
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:03
引用:1太没智商了啊谁赢?高智商大哥
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:04
引用:1红赢怎么走能赢?
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:05
引用:1黑赢怎么走能赢?
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:08
红赢。。。
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:11
引用:1红赢引用:2怎么走能赢?用车去将军.
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:12
引用:1红赢。。。红怎么走 赢?
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:13
把兵兵一路向前冲就赢了
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:13
引用:1红赢引用:2怎么走能赢?引用:3用车去将军.红只有一个帅 一个兵。。哪里来车
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:14
引用:1把兵兵一路向前冲就赢了可能么。。黑可以直接将军。。往哪里冲
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:14
红兵上前一步,红赢吧?
TA共获得:
评分共:<em id="J_rateLogNum_ 条
就噶么好的......
发表于 14:14
引用:1红兵上前一步,红赢吧?黑车直接走中 将军
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:16
红直接把车吃了 在走兵啊。。。。。。。。
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:16
引用:1红兵上前一步,红赢吧?引用:2黑车直接走中 将军帅吃车
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
就噶么好的......
发表于 14:17
引用:1红兵上前一步,红赢吧?引用:2黑车直接走中 将军引用:3帅吃车卒子下来 继续将军。。走中在将军,,基本无限将军。。
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:18
引用:1红直接把车吃了 在走兵啊。。。。。。。。帅吃车,,上面卒子下来继续将军。。有个3卒。
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:18
引用:1红赢引用:2怎么走能赢?引用:3用车去将军.引用:4红只有一个帅 一个兵。。哪里来车我说的是黑赢.
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:19
好吧 我输了
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:19
红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:21
不对 还是红赢的 我不吃黑的车 往中间走
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:21
引用:1红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。红是永远不可能吃的到炮的。。
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:23
引用:1红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。引用:2红是永远不可能吃的到炮的。。谁说的啊 只能同一种方法联系将军3次 还是红赢
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:25
引用:1红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。引用:2红是永远不可能吃的到炮的。。引用:3谁说的啊 只能同一种方法联系将军3次 还是红赢怎么会止3次呢, 黑色上可是有个车的
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:26
引用:1红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。引用:2红是永远不可能吃的到炮的。。红的兵向前挺一步,你黑的下步怎么走。。。
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:27
引用:1红赢引用:2怎么走能赢?引用:3用车去将军.引用:4红只有一个帅 一个兵。。哪里来车引用:5我说的是黑赢.黑色也不会赢的哦
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:28
舍得,舍得,有舍才有得.特别是你有资本舍的时候.,更要大胆放手.
TA共获得:
评分共:<em id="J_rateLogNum_ 条
发表于 14:28
引用:1红的你只要想着吃掉炮就能将死黑的,黑的回防的路够被兵挡住了,黑的光靠一个车和离的还有2格的卒是一下子将不死红的。。。引用:2红是永远不可能吃的到炮的。。引用:3红的兵向前挺一步,你黑的下步怎么走。。。黑车 过来将军。。然后你吃车,然后卒子下来继续将军。你走中 这边卒子在下来将军,,然后你卒子左边过来继续将军,,然后你怎么走 我怎么将军
与本帖相关的人: 展开
TA共获得:
评分共:<em id="J_rateLogNum_ 条
使用(可批量传图、插入视频等)
下载19楼客户端回帖双倍威望
Ctrl + Enter 快速发布
热门推荐:求象棋大神破解……红先走_百度知道
求象棋大神破解……红先走
求象棋大神破解……红先走求象棋大神破解……红先走
我有更好的答案
先兵将,对方只能用将吃(否则死棋),然后马将,对方将只能回中心(否则死棋),然后马踩炮同时将,对方将只能往上走(否则死棋),然后车退两格,和马一条线上,此时车将
兵将,马将,车将,马将,然后车马将(会多耗几步,一直将着他的将)就可将死对方,过程中要一直保持将住对方的将,否则别人走一步咋们就输了。
这棋我和别人真的试过了,这样走红方一定会赢的。需要多耗几步,是真的呀。
兵将,马将,车将,马将
兵将然后马将
其他2条回答
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 象棋是红先走还是黑先走 的文章

 

随机推荐