HTML5+JS 《五子飞》游戏实现(五)移动棋子
上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子。现在里沃特跟大家分享分享,怎么移动棋子。
想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位置,如果可以移动,则把棋子移动的目标位置,原来的位置就要清空。
上面这句话,我们要分两步来处理: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 《五子飞》游戏实现(七)游戏试玩
前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...
- HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择
上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...
- HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对
在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 thi ...
- HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子
前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...
- HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备
上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第 ...
- 用html5+js实现掌机游戏赛车demo
最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础. 游戏界面,没做什么美化. 游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自 ...
- 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析
献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 数据分析基础概念:集中趋势分析是指在大量测评数据分布中,测评数据向某点集中的情况.总体(population)是指客观存在 ...
随机推荐
- Html5拖拽复制
拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...
- 烂泥:高负载均衡学习haproxy之关键词介绍
本文由ilanniweb提供友情赞助,首发于烂泥行天下 上一篇文章我们简单讲解了有关haproxy的安装与搭建,在这篇文章我们把haproxy配置文件中使用到的关键词一一介绍下. 关注我微信ilann ...
- Seafile内部云盘
软件列表 软件 版本 备注 centos 6.4 x86_64 64位系统 mysql mysql5.5.49 本机使用 python 2.7 seafile 依赖python pip 8.1.2 安 ...
- docker-7 docker在阿里云的使用
在传统模式中,开发团队在开发环境中完成软件开发,自己做了一遍单元测试, 测试通过,ᨀ交到代码版本管理库.运维把应用部署到测 试环境, QA 进行测试,没问题后通知部署人员发布到生产环境. 在上述过程中 ...
- PHP生成器Generators
下文的第一个逐行读取文件例子用三种方式实现;普通方法,迭代器和生成器,比较了他们的优缺点,很好,可以引用到自己的代码中 ,支持的php版本(PHP 5 >= 5.5.0) 后面的yield讲解, ...
- python json
#-*-coding:utf-8-*- '''编码格式记得统一,不然容易出现中文乱码,推荐用utf-8''' import json ##################json单对象######## ...
- Redis-benchmark测试Redis性能
Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] ...
- <mvc:default-servlet-handler/>导致SimpleUrlHandlerMapping失效
整理springmvc的demo的时候遇到一件奇葩事情,本来就是想简单演示一下SimpleUrlHandlerMapping的用法就完活.结果写好demo怎么都无法进行映射,就好像根本就没有创建Sim ...
- cloudera cdh native lib
如果通过命令行的方式安装cloudera 版本的hadoop,下载它的cdh版本. 解压后执行,你会发现报warning,没有native的库,lib/native是空的. 如何获取native的文件 ...
- TFS - 使用微软测试管理器实现跨团队项目的测试用例管理
在团队项目之间实现测试用例和测试计划的共享,是很多客户关注的问题.尤其在开发产品+服务的团队中,对测试用例的共享要求比较高.下面就如何在Team Foundation Server中如何实现团队项目之 ...