HTML canvasタグを使って描画


前置き

HTMLで碁盤を作れないだろうか?と考えた。
CSSだけでは線が引けないことで悩んでいたら、HTMLのcanvasタグを使うとjavascriptで描画が出来るということで試してみた。

HTML側

HTMLの方は、canvasタグで描画される幅・高さを指定できる。
style属性を指定することで、背景色なども変更できる。

app/html/kifu.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>canvasで図形を描く</title>
<script type="text/javascript" src="../js/kifu.js">
</script>

</head>
<body onLoad="kifu()">
<h2>canvasで碁盤を描く</h2>
<canvas id="kifu"  width="400px" height="400px" style="background-color:#f78740;">
  碁盤を表示するには、canvasタグをサポートしたブラウザが必要です。
</canvas>
</body>
</html>

上のコードでは、幅(width)を400px、高さ(height)を400px、背景色を#f78740に指定している。bodyタグにあるkifu()はjavascript側の関数で、canvasタグの描画をする。

JavaScript側

描画のメインはこちら側に書く。

app/js/kifu.js
function kifu() {
//描画コンテキストの取得
var canvas = document.getElementById('kifu');

if (canvas.getContext) {

var context = canvas.getContext('2d');

context.strokeStyle = 'rgb(00,00,00)';
for (var x = 0; x < 8; x++) {
  for(var y = 0; y < 8; y++) {
    context.strokeRect(40+x*40, 40+y*40, 40, 40);
  }
}
var str = "_abcdefghi";
var game_record = [];
canvas.addEventListener("click", function(e) {
  var stone_x = Math.round(e.offsetX / 40);
  var stone_y = Math.round(e.offsetY / 40);
  var stone_x_code = str[stone_x];
  var stone_y_code = str[stone_y];
  var stone_code = stone_x_code + stone_y_code;
  if (!(game_record.includes(stone_code))) {
    game_record.push(stone_code)
    if (game_record.length % 2 == 0) {
      context.fillStyle = "rgb(255, 255, 255)";
      context.strokeStyle = "rgb(255, 255, 255)";
    } else {
      context.fillStyle = 'black';
      context.strokeStyle = 'black';
    }
    context.beginPath();
    context.arc(stone_x*40, stone_y*40, 19, 0, 2 * Math.PI, true);
    context.fill();
  }
  console.log(game_record);
}, false)
}
}

上のコードで、碁盤の格子と黒・白交互に盤面に石が置ける。
碁盤は、正方形を8×8個書くことで生成。
碁石は、奇数手、偶数手で塗りつぶされる色を変更して円で表現。
石取りの判定が入っていないので、囲碁ではないですね。
五目並べには使えるかな(笑)

後書き

ポートフォリオの題材に囲碁アプリを作りたかったんですが、棋譜再生方法、棋譜検討機能の実装で詰まってしまいました。
碁盤・碁石の描画だけはできるようになったので、アウトプットとして投稿します。