svg实现五子棋

这两天刚学了canvas和svg就想做一个五子棋

个人喜欢svg就是用svg吧

svg元素

矩形

  • <rect>

    x 绘制的x轴坐标 y 绘制的y轴坐标 width 矩形宽度 height 矩形高度 rx 设置圆角矩形的x轴方向的半径 ry 设置圆角矩形的y轴方向的半径

  • 样式设置

fill:transparent 填充 stroke:描边 stroke-width 边框宽度 fill-opacity :0-1

圆形

  • <circle>

cx,cy:圆心 r:半径

  • <ellipse>

cx,cy:圆心 rx:x轴方向的半径 ry:y轴方向的半径

线条

  • <line>

x1 y1 起始点坐标 x2 y2 结束点坐标 stroke-dashArray

  • <polyline>

points:表示绘制折线的所有坐标点 自动填充绘制的区域 但是不会自动闭合

  • <polygon>

points:表示绘制多边形的所有坐标点 自动填充绘制的区域 但是会自动闭合

绘制文本

  • <text>

x y 绘制坐标 font-size:设置文字字体大小 alignment-baseline 调整文本的基线

绘制图像

-<image>

x y XLink:href="url" width height

路径

  • <path>

 css样式:

  • <style>
            svg {
                border: rgb(17, 111, 219) solid 1px;
                width: 700px;
                height: 700px;
                position: absolute;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                margin: auto;
                background-color: rgb(206, 167, 96);
            }
    
            line {
                stroke-width: 2px;
                stroke: black;
            }
    
            circle {
                opacity: 0;
                /* fill-opacity: 0; */
            }
    </style>

    js部分:

    var svg = document.getElementsByTagName('svg')[0];
            var n = 70
            for (var i = 0; i < 15; i++) {
                var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
                line.setAttribute('fill', 'black')
                line.setAttribute('x1', n)
                line.setAttribute('y1', 70)
                line.setAttribute('x2', n)
                line.setAttribute('y2', 630)
                n += 40
                svg.appendChild(line)
                if (n == 670) {
                    break
                }
                // svg.appendChild(line)
            }
            var m = 70;
            for (var i = 0; i < 15; i++) {
                var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
                line.setAttribute('fill', 'black')
                line.setAttribute('x1', 70)
                line.setAttribute('y1', m)
                line.setAttribute('x2', 630)
                line.setAttribute('y2', m)
                m += 40
                svg.appendChild(line)
                if (m == 670) {
                    break
                }
                // svg.appendChild(line)
            }
    
            for (var j = 0; j < 15; j++) {
                var n = 70
                for (var i = 0; i < 15; i++) {
                    var circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
                    circle.a = 0
                    circle.setAttribute('fill', 'red')
                    circle.setAttribute('cx', n)
                    circle.setAttribute('cy', 70 + 40 * j)
                    circle.setAttribute('r', 15)
                    n += 40
                    svg.appendChild(circle)
                    if (n == 670) {
                        break
                    }
                }
            }

 js部分

通过svg划线算好距离就可以因为要画不少所以用循环实现

var svg = document.getElementsByTagName('svg')[0];
        var n = 70
        for (var i = 0; i < 15; i++) {
            var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
            line.setAttribute('fill', 'black')
            line.setAttribute('x1', n)
            line.setAttribute('y1', 70)
            line.setAttribute('x2', n)
            line.setAttribute('y2', 630)
            n += 40
            svg.appendChild(line)
            if (n == 670) {
                break
            }
            // svg.appendChild(line)
        }
        var m = 70;
        for (var i = 0; i < 15; i++) {
            var line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
            line.setAttribute('fill', 'black')
            line.setAttribute('x1', 70)
            line.setAttribute('y1', m)
            line.setAttribute('x2', 630)
            line.setAttribute('y2', m)
            m += 40
            svg.appendChild(line)
            if (m == 670) {
                break
            }
            // svg.appendChild(line)
        }

        for (var j = 0; j < 15; j++) {
            var n = 70
            for (var i = 0; i < 15; i++) {
                var circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
                circle.a = 0
                circle.setAttribute('fill', 'red')
                circle.setAttribute('cx', n)
                circle.setAttribute('cy', 70 + 40 * j)
                circle.setAttribute('r', 15)
                n += 40
                svg.appendChild(circle)
                if (n == 670) {
                    break
                }
            }
        }

 效果如下

svg实现五子棋

 我的想法是将妻子下在交点上(也可以在格子内)

以交点为圆心画圆然后将其隐藏代码如下:

var flag = true;
        var flaga = false;
        var cir = document.getElementsByTagName('circle');
        for (var i = 0; i < cir.length; i++) {
            (function (i) {
                cir[i].onclick = function (e) {
                    if (e.target.style.opacity != '1') {
                        e.target.style.opacity = '1'
                        if (flag) {
                            e.target.setAttribute('fill', 'black')
                            e.target.a = '黑棋'
                        } else {
                            e.target.setAttribute('fill', 'white')
                            e.target.a = '白棋'
                        }
                        flag = !flag
                    }
                }
            }
            (i))
        }

 这样一个五子棋模型就完成了

上一篇:画图python turle库


下一篇:认识Circle数据库