基本JavaScript问题,Tic-Tac-Toe游戏问题

基本JavaScript问题,Tic-Tac-Toe游戏问题,javascript,Javascript,我想知道你们是否能帮我解决这个问题。我有两个: 有没有可能把它浓缩一些?(见下文评论) 第二:我很确定你必须在checkWin()函数中使用tic-tac-toe中的每一个可能获胜的组合,但我不知道如何在不使用每一个组合的情况下做到这一点。请参见下文,注意,我使用的是code.org AppLab,大多数代码行都能正常工作,有些代码行可能无法正常工作 在每个插槽上放置一个类,然后遍历这些插槽并创建onclick事件 var slots = document.getElementsByClassN

我想知道你们是否能帮我解决这个问题。我有两个:

有没有可能把它浓缩一些?(见下文评论)

第二:我很确定你必须在checkWin()函数中使用tic-tac-toe中的每一个可能获胜的组合,但我不知道如何在不使用每一个组合的情况下做到这一点。请参见下文,注意,我使用的是code.org AppLab,大多数代码行都能正常工作,有些代码行可能无法正常工作


在每个插槽上放置一个类,然后遍历这些插槽并创建onclick事件

var slots = document.getElementsByClassName("slot");
for(var x = 0; x < slots.length; x++){
   slots[x].onClick = function() {
        squareID = x; // why set the id when its clicked? doesnt make sense. should have an id weather clicked or not.
        updateSquare(); 
   }
}
var slots=document.getElementsByClassName(“slot”);
对于(变量x=0;x
下面是一个示例,说明如何实现事件委派,使代码更简单。您可以看到,我们只需要应用单个事件处理程序来跟踪所有按钮单击,因为该处理程序属于父容器

代码的其余部分只是一个简单的示例,说明如何在
单击事件时更新特定的方块:

const handleClick=event=>{
如果(event.target.tagName=='TD'){
const square=event.target;
更新方形(方形);
}
};
const updateSquare=square=>{
如果(square.style.backgroundColor==='red'){
square.style.backgroundColor='透明';
}否则{
square.style.backgroundColor='红色';
}
};
document.querySelector(“#container”).addEventListener('click',handleClick)
td{
填充:10px;
边框样式:凹槽;
}

1.
2.
3.
4.
5.
6.
7.
8.
9
0

现在是学习
for
循环的时候了。这段代码比它需要的长9倍。@tadman,我知道for循环是什么,我真的不知道在这种情况下如何使用它,介意详细说明吗?事件委托将大大简化代码。不要将事件侦听器放在每个方块上,应该考虑为所有方格创建父容器,然后在单个元素上放置一个事件侦听器。您可以使用
事件
参数来确定单击的单个正方形。查看这篇很棒的博客文章了解详细信息:
for(让i=1;i{squared=n-1;updateSquare})
作为一个例子。我会避免使用
for
属性,而是在被点击的对象上使用
data
属性,或者绑定到
.slot
选择器并从
id
属性中提取数字。这对于HTML似乎很好,我在code.org上使用AppLab,所以document.getElementsByClassName(“slot”);出现了一个错误,它不喜欢loopsPretty中的函数。当然,在这种情况下,您需要将
var x
声明为
let x
。使用
var
x
将是
slots的值。每次调用
onClick
时,长度-1
,因为
var
是函数作用域-
let
,另一方面,它的作用域是for循环块。谢谢,我找到了答案
var slots = document.getElementsByClassName("slot");
for(var x = 0; x < slots.length; x++){
   slots[x].onClick = function() {
        squareID = x; // why set the id when its clicked? doesnt make sense. should have an id weather clicked or not.
        updateSquare(); 
   }
}