上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子。现在里沃特跟大家分享分享,怎么移动棋子。

想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位置,如果可以移动,则把棋子移动的目标位置,原来的位置就要清空。

上面这句话,我们要分两步来处理:1、判断目标是否可移动;2、可以移动则移动棋子。

1、判断目标是否可移动。

首先移动时只能按直线,其次目标位置与原始位置之间不能有其他棋子:

    // 是否可移动
this.canMove = function (pDest, pSrc) {
var pi = this.getIndex(pDest, pSrc);
if (pi && pi.destIndex != pi.srcIndex) {
if (this.chesses[pi.destIndex].player == Player.None && this.chesses[pi.srcIndex].player != Player.None) {
var i1, i2, j;
for (var i = 0; i < this.lines.length; i++) {
i1 = $.inArray(pi.destIndex, this.lines[i]);
i2 = $.inArray(pi.srcIndex, this.lines[i]);
if (i1 != -1 && i2 != -1) {
if (pi.destIndex < pi.srcIndex) {
for (var j = Math.min(i1, i2); j < Math.max(i1, i2) - 1; j++) {
if (this.chesses[this.lines[i][j]].player != Player.None) {
return false;
}
}
} else {
for (var j = Math.min(i1, i2) + 1; j <= Math.max(i1, i2); j++) {
if (this.chesses[this.lines[i][j]].player != Player.None) {
return false;
}
}
}
return pi;
}
}
}
}
return false;
};

2、移动棋子:

可以移动时,要判断移动后,可不可以夹对方一个或挑对方一对,如果可以的话还要把对方被吃掉的棋子换成自己的棋子;同时根据上一章的函数,我们知道,夹一个或挑一对的同时有可能会出现同时有两条线或多条线的棋子被吃掉,(下一次我们再细讲)。:

    // 移动棋子
this.moveChess = function (pDest, pSrc) {
this.chessarray = null;
var pi = this.canMove(pDest, pSrc);
if (pi) {
this.chesses[pi.srcIndex].moveTo(this.chesses[pi.destIndex]); var chess = this.chesses[pi.destIndex];
var r1 = this.canCarry(chess), r2 = this.canClip(chess);
if (r1 || r2) {
var rl = (r1 ? r1.length : 0) + (r2 ? r2.length : 0);
if (rl == 1) {
if (r1) {
// 被替换掉的棋子
this.chessreplace.push(r1[0][0]);
this.chessreplace.push(r1[0][1]);
// 替换
this.chesses[r1[0][0].point.index].player = chess.player;
this.chesses[r1[0][1].point.index].player = chess.player;
} else {
// 被替换掉的棋子
this.chessreplace.push(r2[0][0]);
// 替换
this.chesses[r2[0][0].point.index].player = chess.player;
}
} else {
// 如果有多条路线的棋子可以吃,先存起来,再提示用户选择吃哪一条线上的
this.chessarray = [];
if (r1) {
for (var i = 0; i < r1.length; i++) {
this.chessarray.push(r1[i]);
}
}
if (r2) {
for (var i = 0; i < r2.length; i++) {
this.chessarray.push(r2[i]);
}
}
}
}
return true;
}
return false;
};

这一节讲的比较简单,大家先消化一下。下一节我们将实现多重棋子的操作与提示。

HTML5+JS 《五子飞》游戏实现(一)规则

HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备

HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子

HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择

HTML5+JS 《五子飞》游戏实现(五)移动棋子的更多相关文章

  1. HTML5+JS 《五子飞》游戏实现(一)规则

    很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种 ...

  2. HTML5+JS 《五子飞》游戏实现(八)人机对战

    要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃 ...

  3. HTML5+JS 《五子飞》游戏实现(七)游戏试玩

    前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...

  4. HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择

    上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...

  5. HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

    在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 thi ...

  6. HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子

    前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...

  7. HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备

    上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第 ...

  8. 用html5+js实现掌机游戏赛车demo

    最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础. 游戏界面,没做什么美化. 游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自 ...

  9. 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析

    献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 数据分析基础概念:集中趋势分析是指在大量测评数据分布中,测评数据向某点集中的情况.总体(population)是指客观存在 ...

随机推荐

  1. 【故障处理】一次RAC故障处理过程

    [故障处理]一次RAC故障处理过程 1.1  故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...

  2. activiti入门

    一.Activiti简介 Activiti 是一个针对商务人士. 开发人员和系统管理员的轻量级的工作流和业务流程管理 (BPM) 平台.它的核心是Java的高速和可靠的 BPMN 2 流程引擎.它是开 ...

  3. sql server 索引分析相关sql

    select object_id('dbo.FT_CFP_TRADE_SUBACCOUNT') select * from sys.partitions where [object_id]=14672 ...

  4. Opensource开源精神

    现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的“商业价值”.那些大公司的代码不愿意开放的更重要的原 ...

  5. Zookeeper 监视(Watches) 简介(转)

    Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量.结构体声明也在 zookeeper.h 中,如果 ...

  6. 拓扑排序 POJ2367Genealogical tree[topo-sort]

    ---恢复内容开始--- Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4875   A ...

  7. 什么是UV?

    转自http://www.cnblogs.com/jenry/p/4083415.html 1.什么是UV?   对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV ...

  8. Maven系列二setting.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  9. Stunnel服务端

    Stunnel on Debian GNU/Linux 6 (squeeze) 传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访 ...

  10. [No00005F]读书与心智

    读千卷书,行万里路,不够…还得有个对谈者相伴,才更有意思.十月七号晚上,与友人谈读书,线上直播,三百观众相伴,四小时畅谈,不亦乐乎! Part1:读书的载体 散发出最浓郁的知识芬芳和铭刻下最隽永的历史 ...