如何通过单击一个正方形在使用for循环创建的板上显示X

问题描述 投票:0回答:1

我是初学者,所以请大方:)我正在尝试使用html,css和纯JS制作井字游戏。我一直试图在板上单击一个正方形时尝试显示“ X”符号(或“ O”)(我用于循环,就像以前在俄罗斯方块游戏中一样)。我尝试了事件侦听器,但无法正常工作,可能是我做错了:P所以无论如何我的问题是:如何通过单击它在板上显示符号?

<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="tic-tac-toe.css">
    <title>TIC TAC TOE IN JS</title>
    <h1 class='header'>TIC TAC TOE in JS</h1>
  </head>
<body>
    <div class='canvas'>
        <canvas id="canvas" width='300px' height="300px"></canvas>
    </div>
    <div class='scores'>
        <div>Player 1 Wins: <span id="score-x">0</span></div>
        <div>Ties: <span id="score-tie">0</span> </div>
        <div>Player 2 Wins: <span id="score-o">0</span> </div>
    </div>

<script src="./tictactoe.js"></script>

</body>

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

//CONSTS
const row = 3;
const col = 3;
const vacant = "white";
const sq = 100;
let w = canvas.clientWidth/3;
let h = canvas.clientHeight/3;


//draw a square
function drawSquare(x, y, color) {
    ctx.fillStyle = color;
    ctx.fillRect(x*sq, y*sq, sq, sq);
    ctx.strokeStyle = 'black';
    ctx.strokeRect(x*sq, y*sq, sq, sq);
}

    //Create board

let board = [ ];
for(let r = 0; r < row; r++){
    board[r] = [ ];
        for(let c = 0; c < col; c++) {
            board[r][c] = vacant;
        }
}
    //Draw Board

function drawBoard() {
    for(r = 0; r < row; r++) {
        for(c = 0; c < col; c++){
            drawSquare(c, r, board[r][c]);
        }
    }
}
drawBoard();

//players
const players = ['X', 'O']
const player1 = players[0];
const player2 = players[1];

//let the starting player be selected at random
const spot = board[r-1][c-1];

function setup() {
    let randomPlayer = Math.floor(Math.random() *2 );
    let currentPlayer = "";
    if (randomPlayer == 0){
        currentPlayer = player1;
        alert('Player 1 starts the game !')
    }else {
        currentPlayer = player2;
        alert('Player 2 starts the game !')
    };
}
function drawSymbol () {
    let x = w * r + w/2;
    let y = h * c + h/2;
    let xr = w/4;
    spot.addEventListener('click', (x, y, xr) => {
    line(x-xr, y-xr, x+xr, y+xr);
    line(x+xr, y-xr, x-xr, y+xr);
})
}


setup();
//Check if player clicked on the board 

//Place X

//Place O
javascript html css onclick tic-tac-toe
1个回答
0
投票

您似乎从未将事件侦听器添加到画布本身?从此类事件侦听器中,您可以获取点击的X坐标和Y坐标,以确定点击的单元格。如果该单元空闲,请为当前玩家绘制一个符号。

因此,您需要使drawSymbol接收有关要插入哪个单元格的信息。

您创建了一个我不了解它的功能的变量,在drawSymbol内添加了一个事件侦听器,但这可能不是元素吗?而且从来没有调用drawSymbol函数,因此不会执行代码,因此也不会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.