typescript小案例:井字游戏

ts小案例:井字游戏

这是排版部分,一个比较简单的排版。
在这里插入图片描述
在这里插入图片描述

css样式

html,body{
    background: rgb(84, 226,226);
}
#box{
    width: 800px;
    height: 800px;
    margin:100px auto
}
.gameTit{
    text-align: center;
    padding: 50px 0;
    color:aliceblue
}
 
.container .row{
    display: flex;
    font-size: 18px;
    justify-content: center;
    align-items: center;
}
.container .row div{
    width:200px;
    height:200px;
    border-right:5px solid #ccc;
    border-bottom: 5px solid #ccc;
    text-align: center;
    line-height: 150px;
    font-size: 200px;
    color:antiquewhite
}
.container .row div:last-child{
    border-right:none;
}
.container .row:last-child div{
    border-bottom:none;
}
.x::after{
     content: 'x' ;
}
.o::after{
     content: 'o' ;
}
.win{
    width: 800px;
    height: 500px;
    color:#fff;
    font-size: 33px;
    text-align: center;
    line-height: 500px;
}

html部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="game.css">
</head>
<body>
    <div id="box">
        <h1 class="gameTit">Game 井字游戏</h1>
   
        <div class="container">
            <!-- 获胜面板 -->
            <div class="gameBox" >
            <div class="row">
                    <div class="cell"></div>
                    <div class="cell"></div>
                    <div class="cell"></div>
            </div>
                <div class="row">
                    <div class="cell"></div>
                    <div class="cell"></div>
                    <div class="cell"></div>
            </div>
                <div class="row lastdiv">
                    <div class="cell"></div>
                    <div class="cell"></div>
                    <div class="cell"></div>
            </div>
            </div>
            <!-- 获胜面板 -->
            <div class="win" style="display: none;"> </div>
        </div>
    </div>
</body>
<script src="./game.js"></script>
</html>

ts部分

1.使用命令tsc index.ts将ts转为js文件
2.在页面引入js文件

1.获取表格数据,并且点击更改x,o

利用事件代理点击标签时,判断play的值,如果是x就变为o。给dom2级事件第三个参数绑定一个once:true表示只执行一次。

// 定义x,y
var play:string='x'
// 获取所有的表格
var cell=document.querySelectorAll(".cell") 
cell.forEach((i,v)=>{
    var lis=i as HTMLDivElement
     clickCell(lis)
})
// 点击事件
function clickCell(lis){
    lis.addEventListener("click",(event)=>{
        let t = event.target as HTMLDivElement
        t.classList.add(play)
        play=play==='x'?'o':'x'
    },{once:true})
}

判断胜利

首先把可以获胜的数组放在一个数组中,然后遍历这个数组,并且把所有的标签代入进去,就可以获得到所有的行,列,斜方向的标签。
如果行,列,斜方向标签包含x/y,这两个class名,就让获胜界面显示并且游戏界面隐藏

// 游戏界面
var gamesContainer=document.querySelector(".gameBox")  as HTMLDivElement
// 获胜界面
var winners=document.querySelector(".win")  as HTMLDivElement
// 获胜数组
let winArrs=[
    [0,1,2],[3,4,5],[6,7,8],//横向
    [0,3,6],[1,4,7],[2,5,8],//竖向
    [0,4,8],[2,4,6]         //斜向
]
// 判断胜利
function winner(){
  return winArrs.some((i,v)=>{
        // 通过索引找到cells元素
        let cell1=cell[i[0]]
        let cell2=cell[i[1]]
        let cell3=cell[i[2]]
        // 如果这一列的class名字都包含play的值(x/y) 就让这个选手获胜
        if(
            cell1.classList.contains(play) &&
            cell2.classList.contains(play) &&
            cell3.classList.contains(play) 

        ){
        // 获胜让获胜界面显示并且游戏界面隐藏
        winners.innerHTML=play+"win"
        winners.style.display='block'
        gamesContainer.style.display='none'
        }      
    })
}

判断平局

没点击一次,就让steps++,当steps===9时,就为平局。让游戏界面隐藏,平局界面显示。
判断为先判断是否胜利,在判断是否平局,所以一定要注意下方法调用的位置。

var steps:number=0
// 判断平局
function noWin(){
    steps++
    if(steps===9){
        winners.innerHTML="平局"
        winners.style.display='block'
        gamesContainer.style.display='none'
        return
    }
}

ts完整代码

// 游戏界面
var gamesContainer=document.querySelector(".gameBox")  as HTMLDivElement
// 获胜界面
var winners=document.querySelector(".win")  as HTMLDivElement
// 定义x,y
var play:string='x'
// 获胜数组
let winArrs=[
    [0,1,2],[3,4,5],[6,7,8],//横向
    [0,3,6],[1,4,7],[2,5,8],//竖向
    [0,4,8],[2,4,6]         //斜向
]
// 定义步骤
var steps:number=0
// 获取所有的表格
var cell=document.querySelectorAll(".cell") 
cell.forEach((i,v)=>{
    var lis=i as HTMLDivElement
     clickCell(lis)
})
// 点击事件
function clickCell(lis){
    lis.addEventListener("click",(event)=>{
        let t = event.target as HTMLDivElement
        t.classList.add(play)
        noWin()
        winner()
        play=play==='x'?'o':'x'
    },{once:true})
}
// 判断胜利
function winner(){
  return winArrs.some((i,v)=>{
        // 通过索引找到cells元素
        let cell1=cell[i[0]]
        let cell2=cell[i[1]]
        let cell3=cell[i[2]]
        // 如果这一列的class名字都包含play的值(x/y) 就让这个选手获胜
        if(
            cell1.classList.contains(play) &&
            cell2.classList.contains(play) &&
            cell3.classList.contains(play) 

        ){
        // 获胜让获胜界面显示并且游戏界面隐藏
        winners.innerHTML=play+"win"
        winners.style.display='block'
        gamesContainer.style.display='none'
        }      
    })
}
// 判断平局
function noWin(){
    steps++
    if(steps===9){
        winners.innerHTML="平局"
        winners.style.display='block'
        gamesContainer.style.display='none'
        return
    }
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hope°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值