您好!欢迎访问家园网-www.jy.wang!

家园网

棋盘方格绘制

网络 作者:本站 点击:

棋盘方格绘制

js代码:

// JavaScript Document
var cav = document.getElementById("cav").getContext("2d");
for (var j = 0; j < 10; j++) {//j为棋盘列数
    for (var i = 0; i < 10; i++) {//i为棋盘行数
        cav.beginPath();
        cav.strokeStyle = "rgb(147,109,70)";
        //每个格子的宽高都为50像素,语法rect(x, y, w, h)
        cav.rect(115 + j * 30, 85 + i * 30, 30, 30);
        cav.stroke();
    }
}
cav.beginPath();//棋盘外部的大正方形
cav.lineWidth=4;//设置线宽
cav.strokeRect(100,70,330,330);
cav.stroke();


html文件

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>平移图形</title>
</head>
<link href="css/style.css" type="text/css" rel="stylesheet">
<body>
<div class="mr-cont">
    <!--设置画布高位870像素,宽慰1208像素,并且设置id为cav-->
    <canvas id="cav" height="504" width="700"></canvas>
</div>
</body>
<script type="text/javascript" src="js/js.js"></script>
</html>


css代码

@charset "utf-8";
/* CSS Document */
.mr-cont{
    height: 700px;
    width: 504px;
    margin: 0 auto;
}
#cav{
    border: 1px solid #f00;
    background: url(../img/bg.png);
}


棋盘图片


bg.png

五子棋棋盘代码逐行详细讲解

这是一段用 Canvas 绘制五子棋棋盘的 JavaScript 代码。我来逐行详细讲解每一句的作用。


第1行:获取Canvas上下文


var cav = document.getElementById("cav").getContext("2d");

含义:获取页面中 id 为 "cav" 的 Canvas 元素的 2D 绘图上下文,并赋值给变量 cav

词源

  • getElementById:通过 ID 获取元素

  • getContext:获取绘图上下文

  • "2d":指定为二维绘图上下文

作用:之后所有绘图操作都通过 cav 对象调用。


第2行:外层循环控制列数


for (var j = 0; j < 10; j++) {//j为棋盘列数

含义:声明变量 j 从 0 开始,每次循环加 1,直到 j < 10 条件不成立时结束。循环执行 10 次,j 的值依次为 0,1,2,...,9。

注释说明j 代表棋盘的列数,即横向有多少条线。


第3行:内层循环控制行数


	for (var i = 0; i < 10; i++) {//i为棋盘行数

含义:对于每一个 j 值,内层循环声明变量 i 从 0 开始,每次循环加 1,直到 i < 10 时结束。循环执行 10 次,i 的值依次为 0,1,2,...,9。

注释说明i 代表棋盘的行数,即纵向有多少条线。

嵌套循环结果:外层循环每执行一次,内层循环就要完整执行 10 次。总共执行 10 × 10 = 100 次内层循环体。


第4行:开始新路径


		cav.beginPath();

含义:开始一个新的绘图路径。

作用:每次绘制一个小方格前都重新开始一条新路径,避免之前绘制的路径影响到当前绘制。


第5行:设置描边颜色


		cav.strokeStyle = "rgb(147,109,70)";

含义:设置绘图的描边颜色为 RGB 值 (147,109,70)。

颜色说明:这是一个木棕色,模拟传统棋盘的颜色。

作用:之后所有 stroke() 描边操作都会使用这个颜色。


第6行:注释说明


		//每个格子的宽高都为50像素,语法rect(x, y, w, h)

含义:这是一条注释,说明每个小方格的尺寸是 50×50 像素,并提醒 rect() 方法的参数顺序。

注意:代码中实际格子宽高是 30 像素,不是 50。注释可能是旧版本的说明,未及时更新。


第7行:绘制矩形路径


		cav.rect(115 + j * 30, 85 + i * 30, 30, 30);

含义:在画布上定义一个矩形路径。

参数详解

  • 115 + j * 30:矩形左上角的 X 坐标

    • 基础偏移量 115 是棋盘左边距画布边缘的距离

    • j * 30 是列偏移量,每增加一列,X 坐标向右移动 30 像素

  • 85 + i * 30:矩形左上角的 Y 坐标

    • 基础偏移量 85 是棋盘上边距画布边缘的距离

    • i * 30 是行偏移量,每增加一行,Y 坐标向下移动 30 像素

  • 30, 30:矩形的宽度高度,都是 30 像素

计算示例

  • 当 i=0, j=0 时:rect(115, 85, 30, 30) → 第一个小方格

  • 当 i=0, j=1 时:rect(145, 85, 30, 30) → 第一行第二个小方格

  • 当 i=1, j=0 时:rect(115, 115, 30, 30) → 第二行第一个小方格

作用:这个 rect() 只是定义了矩形路径,还没有真正画到画布上。


第8行:描边路径


		cav.stroke();

含义:用当前设置的 strokeStyle 颜色描边当前路径。

作用:将之前 rect() 定义的矩形路径真正绘制到画布上,形成一个可见的小方格边框。

至此:一个完整的小方格就画完了。


第9-10行:结束内层循环和外层循环


	}
}

含义:第一个 } 结束内层 for 循环,第二个 } 结束外层 for 循环。

执行结果:循环结束后,画布上绘制了一个 10×10 的网格,共有 100 个小方格。


第11行:开始新路径(用于外框)


cav.beginPath();//棋盘外部的大正方形

含义:重新开始一条新路径,准备绘制棋盘的外边框。

注释说明:明确说明这里要绘制的是棋盘外部的大正方形边框。

为什么需要再次 beginPath():如果不开始新路径,之前绘制小方格时留下的路径信息可能会影响当前绘制。


第12行:设置线宽


cav.lineWidth=4;//设置线宽

含义:设置描边的线条宽度为 4 像素。

作用:让棋盘外框比内部小方格的边框(默认 1 像素)更粗,起到突出和装饰作用。


第13行:绘制描边矩形


cav.strokeRect(100,70,330,330);

含义:直接绘制一个描边矩形,不需要 rect() + stroke() 两步。

strokeRect() 的特点

  • 这是一个独立的方法,直接绘制矩形边框

  • 不需要先调用 rect() 再调用 stroke()

  • 参数同样是 (x, y, width, height)

参数详解

  • x = 100:矩形左上角 X 坐标

  • y = 70:矩形左上角 Y 坐标

  • width = 330:矩形宽度

  • height = 330:矩形高度

为什么用 330?

  • 内部网格有 10 行 10 列,每个格子 30 像素

  • 网格实际占用的宽度是 10 × 30 = 300 像素

  • 外框多出的 30 像素是给边缘留出的空白(左边距 15 像素,右边距 15 像素)


第14行:再次描边


cav.stroke();

含义:执行描边操作。

疑问:这里为什么要再执行一次 stroke()

分析:这一行可能是多余的,因为:

  1. strokeRect() 已经完成了描边

  2. 当前路径可能为空(没有新的 rect() 或 beginPath() 之间的内容)

  3. 执行这一行通常不会产生可见效果

可能的原因

  • 开发者的习惯性写法

  • 为后续可能的路径绘制预留

  • 代码复用的遗留


棋盘布局分析

坐标计算图解


360截图20260305200543355.jpg

数值关系

  • 内部网格起点:(115, 85)

  • 外框起点:(100, 70)

  • 内部网格占用:300×300 像素

  • 外框占用:330×330 像素

  • 边距:上/左各 15 像素


完整执行流程总结

  1. 获取绘图上下文:拿到画笔

  2. 嵌套循环:10×10 次绘制小方格

    • 每次绘制一个小方格边框

  3. 绘制外框

    • 设置线宽为 4 像素

    • 绘制更大的外框矩形

  4. 完成绘制:一个 10×10 的五子棋棋盘呈现在画布上


代码存在的问题

  1. 注释不准确:注释说格子宽高 50 像素,实际是 30 像素

  2. 多余的 stroke():第 14 行的 cav.stroke() 可能是多余的

  3. 硬编码数值:所有坐标都是固定数值,不易维护

  4. 缺少变量定义:格子大小、棋盘大小等应该定义为变量

改进建议


const CELL_SIZE = 30;
const BOARD_SIZE = 10;
const OFFSET_X = 115;
const OFFSET_Y = 85;
for (let row = 0; row < BOARD_SIZE; row++) {
    for (let col = 0; col < BOARD_SIZE; col++) {
        cav.strokeRect(
            OFFSET_X + col * CELL_SIZE,
            OFFSET_Y + row * CELL_SIZE,
            CELL_SIZE,
            CELL_SIZE
        );
    }
}
标签: