Вот как я бы это сделал: я сохраняю все ячейки в массиве ячеек.Затем по щелчку я обнаруживаю ячейку, в которой произошло событие щелчка.Я крашу эту клетку в красный цвет.Здесь вы можете решить сохранить индекс ячейки, по которой щелкнули (pos), в другом массиве.
Пожалуйста, прочитайте комментарии в коде.
// the width and the height of the canvas
const cw = canvas.width = 480;
const ch = canvas.height = 400;
// the width and the height of every cell
let rw = 40;
let rh = 20;
// the number of cells per row
let w = cw / rw;
// the number of cells per column
let h = ch / rh;
// the mouse position
let m = {};
// the array of cells
let cells = [];
// the canvas context
const context = canvas.getContext("2d");
// a function to draw a cell
function drawCell(o,fill){
let fillcolor = fill ? fill : "white";
context.fillStyle = fillcolor;
context.beginPath();
context.moveTo(o.x,o.y);
context.lineTo(o.x+rw, o.y);
context.lineTo(o.x+rw, o.y+rh);
context.lineTo(o.x, o.y+rh);
context.lineTo(o.x, o.y);
context.closePath()
context.fill();
context.stroke();
}
// a function to draw the board
function drawBoard(){
for (var y = 0; y < ch; y += rh) {
for (var x = 0; x < cw; x += rw) {
let o = {x:x,y:y}
//draw the cell and pust the coords of the cell onto the cells array
drawCell(o);
cells.push(o)
}
}
}
drawBoard();
canvas.addEventListener("click",(evt)=>{
// get the mouse position
m = oMousePos(canvas, evt);
// get the index of the clicked cell
let pos = (~~(m.y / rh))* w + ~~(m.x / rw);
// fill the clicked cell
drawCell(cells[pos],"red")
// here you can store the guess in an aray if this is what you need
})
// a function to get the mouse position
function oMousePos(canvas, evt) {
var ClientRect = canvas.getBoundingClientRect();
return {
x: Math.round(evt.clientX - ClientRect.left),
y: Math.round(evt.clientY - ClientRect.top)
}
}
canvas{border:1px solid}
<canvas id="canvas"></canvas>
ОБНОВЛЕНИЕ
ОП комментирует:
У вас есть идеи, как очиститьвсе уже отмеченные ячейки, прежде чем выбрать другую, но все еще сохранить панель?Так что каждый раз помечается только одна ячейка.
В этом случае вам необходимо очистить контекст и перерисовать сетку перед заполнением ячейки, по которой щелкнули:
// the width and the height of the canvas
const cw = canvas.width = 480;
const ch = canvas.height = 400;
// the width and the height of every cell
let rw = 40;
let rh = 20;
// the number of cells per row
let w = cw / rw;
// the number of cells per column
let h = ch / rh;
// the mouse position
let m = {};
// the array of cells
let cells = [];
// the canvas context
const context = canvas.getContext("2d");
// a function to draw a cell
function drawCell(o,fill){
let fillcolor = fill ? fill : "white";
context.fillStyle = fillcolor;
context.beginPath();
context.moveTo(o.x,o.y);
context.lineTo(o.x+rw, o.y);
context.lineTo(o.x+rw, o.y+rh);
context.lineTo(o.x, o.y+rh);
context.lineTo(o.x, o.y);
context.closePath()
context.fill();
context.stroke();
}
// a function to draw the board
function drawBoard(){
for (var y = 0; y < ch; y += rh) {
for (var x = 0; x < cw; x += rw) {
let o = {x:x,y:y}
//draw the cell and pust the coords of the cell onto the cells array
drawCell(o);
cells.push(o)
}
}
}
drawBoard();
canvas.addEventListener("click",(evt)=>{
// get the mouse position
m = oMousePos(canvas, evt);
// get the index of the clicked cell
let pos = (~~(m.y / rh))* w + ~~(m.x / rw);
// clear the context
context.clearRect(0,0,cw,ch);
// draw the board
drawBoard()
// fill the clicked cell
drawCell(cells[pos],"red")
// here you can store the guess in an aray if this is what you need
})
// a function to get the mouse position
function oMousePos(canvas, evt) {
var ClientRect = canvas.getBoundingClientRect();
return {
x: Math.round(evt.clientX - ClientRect.left),
y: Math.round(evt.clientY - ClientRect.top)
}
}
canvas{border:1px solid}
<canvas id="canvas"></canvas>