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 《五子飞》游戏实现(四)夹一个和挑一对

时间: 2024-10-13 08:44:34

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

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

要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃的,就再随机走一个棋子(要想让电脑成为下棋高手就不能随机下棋,要考虑下棋后会不会再被对方吃掉等等,这里只简单做随机下子了). 完整<五子飞>游戏人机对战:http://www.lyout.com/projects/Fiveflychess/FiveflyChess8.htm // 查找是否有可挑的

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

上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移开棋子后再切换回默认的状态: el.mousemove(function (e) { var o = el.offset(); var p = { x: e.clientX - o.left, y: e.clientY - o.top }; el.css("cursor", "d

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

在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 this.lines = [ [ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [ 0, 5, 10, 15, 20], [ 1, 6, 11, 16,

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

前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:http://www.lyout.com/projects/fiveflychess/FiveflyChess7.htm 现在我们来总结一下该小游戏的一些基本定义: // 定义游戏对象 function GameChess(){ // 初始配置 this.init = function ()//... // 画棋

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

很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种益智游戏,我们先来看看棋盘布局: 规则如下: 一.黑白双方(对方黑,我方白)各执五子,分别摆放在双方的边线上: 二.棋子只能走直线(斜的直线也是),不能转弯: 三.只要前面没有棋子(任何一方的)就可以跳格走: 四.可以夹死对方一个或可以挑对方两个棋子(以1表示黑子,0表示白子,-表示空白): 夹一个:任何一条

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

上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第一节棋盘的先去看一下)(因为路线比较简单,就直接写固定的数据了): 1.横着走有5条直线: var lines_h = [ [ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22,

Cocos2d-x 小试牛刀五子连珠游戏

Cocos2d-x 小试牛刀五子连珠游戏 声明:本文游戏使用的是cocos2d-x-3.13的代码 游戏介绍 本文将介绍有Cocos编写经典游戏,五子连珠.游戏规则,有一个10*10的棋盘,里面有六种颜色的珠子,点击棋盘的珠子可以移动到任意有开放路径的位置,如果横.竖.斜.反斜可以连接相同颜色珠子数大于等于5个,就可以消除.如果移动珠子后没有消除珠子,则会增3个珠子,如果棋盘被所有珠子填满则游戏结束. 游戏界面如下: 游戏代码 游戏代码下载地址:https://pan.baidu.com/s/1

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

最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础. 游戏界面,没做什么美化. 游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自由移动(用方向键,长按下方向键黑色方块加速下滑).红色方块碰到黑色方块即为输. 得分:每正常通过一次黑色方块加12分,加速通过加30分. 下面直接上代码: html: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"&g

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

献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 数据分析基础概念:集中趋势分析是指在大量测评数据分布中,测评数据向某点集中的情况.总体(population)是指客观存在的,并在同一性质的基础上结合起来的许多个别单位的整体,即具有某一特性的一类事物的全体,又叫母体或全域.简单地说,总体也就是我们所研究的性质相同个体的总和,用符号N表示.样本(sample),是指从总体中抽出的一部分个体.样本中所包含个体数目称样本容量或含量,用符号n表示.标准差与方差的区别:从公式上