中国象棋js代码

代码语言:html

所属分类:游戏

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>BFW NEW PAGE</title>
    <script id="bfwone" data="dep=jquery.17&err=0" type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/bfwone.js"></script>
    <script type="text/javascript">
        class Chess {
            constructor(canvasId) {
                this.canvas = document.getElementById(canvasId);
                this.ctx = this.canvas.getContext("2d");

                this.initCanvas();

                this.resetData();

            }

            // 重置数据,再来一局
            resetData() {
                this.redBottom = true; // 红方在下边(这个属性可以用来给不同的用户显示不同的棋盘)
                this.toMove = {};
                this.active = "red"; // 当前走棋方
                this.bottomColor = "red"; // 红方在下边
                this.chessSteps = []; // 走棋记录

                this.initChessBoard();
                this.initComposition();
                this.drawPieces();
            }

            // 切换走棋方
            exchange() {
                this.active = this.active == 'red' ? 'black': 'red';
                // this.reverseChess();
            }

            // 反转棋局数组
            reverseChess() {
                this.composition = this.deepReverse(this.composition);
            }

            // 渲染棋盘和棋子
            renderUi() {
                //清除之前的画布
                this.ctx.clearRect(0, 0, this.width, this.height);
                this.initChessBoard();
                this.drawPieces();
            }

            // 输赢判断
            getVictor() {
                var flag = false;
                for (let i = 0, len = this.composition.length; i < len; i++) {
                    for (let j = 0, len1 = this.composition[i].length; j < len1; j++) {
                        //              if(){
                        //
                        //              }
                    }
                }
            }

            // 初始化canvas并绑定点击事件
            initCanvas() {
                // var bodys = document.documentElement || document.body;
                var body = document.body;
                // console.log("%O",body);
                var h = body.clientHeight;
                var w = body.clientWidth;
                if (h > w) {
                    this.cellWidth = w / 10;
                } else {
                    this.cellWidth = h / 11;
                }
                this.width = this.cellWidth * 10;
                this.height = this.cellWidth * 11;
                this.canvas.width = this.width;
                this.canvas.height = this.height;

                // 绑定点击事件
                this.canvas.addEventListener("click", (e)=> {
                    var offset = this.canvas.getBoundingClientRect();
                    var x = Math.round((e.clientX - offset.left - this.cellWidth) / this.cellWidth);
                    var y = Math.round((e.clientY - offset.top - this.cellWidth) / this.cellWidth);
                    // console.log(x, y, "点击位置");
                    // 走棋
                    if (x >= 0 && x <= 8 && y <= 9 && y >= 0) {
                        this.goStep(y, x);
                        console.log(this.chessSteps);
                    } else {
                        console.log("点在其他地方,没在棋局中");
                    }
                }, false);

            }

            // 初始化棋盘
            initChessBoard() {
                //设置全局属性
                var padding = 2;
                var borderWidth = 5;
                var borderColor = "#333";
                var bgColor = "#a6753a";
                var lineColor = "#333";
                var fontColor = bgColor;
                var bgWidth = this.cellWidth - borderWidth - padding;


                // 画边框
                this.ctx.strokeStyle = bgColor;
                this.ctx.lineWidth = bgWidth*2;
                this.ctx.lineJoin = "miter";
                this.ctx.beginPath();
                this.ctx.moveTo(0, 0);
                this.ctx.lineTo(this.width, 0);
                this.ctx.lineTo(this.width, this.height);
                this.ctx.lineTo(0, this.height);
                this.ctx.closePath();
                this.ctx.stroke();

                // 画外边线
                this.ctx.strokeStyle = borderColor;
                this.ctx.lineWidth = borderWidth;
                this.ctx.lineJoin = "miter";
                this.ctx.beginPath();
                this.ctx.moveTo(0+bgWidth, 0+bgWidth);
                this.ctx.lineTo(0+this.width-bgWidth, 0+bgWidth);
                this.ctx.lineTo(this.width-bgWidth, this.height-bgWidth);
                this.ctx.lineTo(0+bgWidth, this.height-bgWidth);
                this.ctx.stroke();

                this.ctx.save();

                this.ctx.translate(this.cellWidth, this.cellWidth);
                this.ctx.beginPath();
                // 画横线
                for (let i = 0; i < 10; i++) {
                    this.ctx.moveTo(0, this.cellWidth*i);
                    this.ctx.lineTo(this.cellWidth*8, this.cellWidth*i);
                }

                // 画纵线
                for (let i = 0; i < 9; i++) {
                    this.ctx.moveTo(this.cellWidth*i, 0);
                    this.ctx.lineTo(this.cellWidth*i, this.cellWidth*4);
                    this.ctx.moveTo(this.cellWidth*i, this.cellWidth*5);
                    this.ctx.lineTo(this.cellWidth*i, this.cellWidth*9);
                }

                // 链接断线
                this.ctx.moveTo(0, this.cellWidth*4);
                this.ctx.lineTo(0, this.cellWidth*5);
                this.ctx.moveTo(this.cellWidth*8, this.cellWidth*4);
                this.ctx.lineTo(this.cellWidth*8, this.cellWidth*5);

                this.ctx.strokeStyle = lineColor;
                this.ctx.lineWidth = 1;
                this.ctx.stroke();

                // 写(楚河、汉界)汉字
                this.ctx.font = `${this.cellWidth*0.75}px 方正舒体`; // 隶书  方正舒体
                this.ctx.fillStyle = fontColor;
                this.ctx.textBaseline = "middle";
                this.ctx.textAlign = "center";
                this.ctx.fillText("楚", this.cellWidth*1.5, this.cellWidth*4.5);
                this.ctx.fillText("河", this.cellWidth*2.5, this.cellWidth*4.5);
                this.ctx.fillText("汉", this.cellWidth*5.5, this.cellWidth*4.5);
                this.ctx.fillText("界", this.cellWidth*6.5, this.cellWidth*4.5);

                // 画炮位
                var paoArr = [{
                    x: 1, y: 2
                }, {
                    x: 7, y: 2
                }, {
                    x: 7, y: 7
                }, {
                    x: 1, y: 7
                }];
                for (let i = 0, len = paoArr.length; i < len; i++) {
                    this.markP(paoArr[i].x, paoArr[i].y);
                }
                // 画兵和卒位
                var bingArr = [];
                for (let i = 0; i < 9; i += 2) {
                    bingArr.push({
                        x: i, y: 3
                    });
                    bingArr.push({
                        x: i, y: 6
                    });
                }

                // 画皇宫
                this.ctx.beginPath();
                this.ctx.moveTo(this.cellWidth*3, 0);
                this.ctx.lineTo(this.cellWidth*5, this.cellWidth*2);
                this.ctx.moveTo(this.cellWidth*5, 0);
                this.ctx.lineTo(this.cellWidth*3, this.cellWidth*2);

                this.ctx.moveTo(this.cellWidth*3, this.cellWidth*9);
                this.ctx.lineTo(this.cellWidth*5, this.cellWidth*7);
                this.ctx.moveTo(this.cellWidth*5, this.cellWidth*9);
                this.ctx.lineTo(this.cellWidth*3, this.cellWidth*7);
                this.ctx.stroke();

                for (let i = 0, len = bingArr.length; i < len; i++) {
                    this.markP(bingArr[i].x, bingArr[i].y);
                }

                this.ctx.restore();
            }

            // 方向数字化
            nd(direction) {
                var res = {
                    h: 0, v: 0
                }; // h horizontal v vertical
                switch (direction) {
                    case "r":
                        res.h = 1;
                        res.v = 0;
                        break;
                    case "rd":
                        res.h = 1;
                        res.v = 1;
                        break;
                    case "d":
                        res.h = 0;
                        res.v = 1;
                        break;
                    case "ld":
                        res.h = -1;
                        res.v = 1;
                        break;
                    case "l":
                        res.h = -1;
                        res.v = 0;
                        break;
                    case "lt":
                        res.h = -1;
                        res.v = -1;
                        break;
                    case "t":
                        res.h = 0;
                        res.v = -1;
                        break;
                    case "rt":
                        res.h = 1;
                        res.v = -1;
                        break;
                    default: console.error("方向输入有误");
                    }
                    return res;
                }

                markP(x, y) {
                    // 标出上下左右
                    var arr = [];
                    if (x === 0) {
                        arr = ["rt", "rd"];
                    } else if (x === 8) {
                        arr = ["lt", "ld"];
                    } else {
                        arr = ["lt", "rt", "rd", "ld"];
                    }

                    var padding = this.cellWidth/10;
                    var length = this.cellWidth/5
                    for (let i = 0; i < arr.length; i++) {
                        this.mark(x, y, arr[i], padding, length);
                    }
                }

                // 四个标记中的一个
                mark(x, y, direction, padding, length) {
                    var d = this.nd(direction);
                    var h = d.h;
                    var v = d.v;

                    this.ctx.beginPath();
                    this.ctx.moveTo(this.cellWidth*x+h*(padding+length), this.cellWidth*y+v*padding);
                    this.ctx.lineTo(this.cellWidth*x+h*padding, this.cellWidth*y+v*padding);
                    this.ctx.lineTo(this.cellWidth*x+h*padding, this.cellWidth*y+v*(padding+length));
                    this.ctx.stroke();
                }

                // 初始化棋局
                initComposition() {
                    var origin = [
                        ["車", "馬", "象", "士", "将", "士", "象", "馬", "車"],
                        ["", "", "", "", "", "", "", "", ""],
                        ["", "炮", "", "", "", "", "", "炮", ""],
                        ["卒", "", "卒", "", "卒", "", "卒", "", "卒"],
                        ["", "", "", "", "", "", "", "", ""],
                        ["", "", "", "", "", "", "", "", ""],
                        ["兵", "", "兵", "", "兵", "", "兵", "", "兵"],
                        ["", "砲", "", "", "", "", "", "砲", ""],
                        ["", "", "", "", "", "", "", "", ""],
                        ["車", "馬", "相", "仕", "帥", "仕", "相", "馬", "車"]
                    ];

                    this.composition = [];
                    for (let i = 0, len = origi.........完整代码请登录后点击上方下载按钮下载查看

网友评论0