js实现简易版井字棋(附二套源码)

用html+js实现一个简单h5版井字棋游戏。仅参考,提供一种思路。代码,仍有不足之处,接受大佬们的指正和完善。

1.使用canvas,

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <title>井字游戏</title>
</head>
<body>
<canvas id="canvas" width="340" height="300" onclick="cnvs_getCoordinates(event)"></canvas>
<!--<canvas id="canvas" width="340" height="300" onmousemove="cnvs_getCoordinates(event)"></canvas>-->

<script>
    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');

    var color="black";

    init();

    var init1=0;
    var init2=0;
    var init3=0;
    var init4=0;
    var init5=0;
    var init6=0;
    var init7=0;
    var init8=0;
    var init9=0;

    function cnvs_getCoordinates(e){
        x=e.clientX;
        y=e.clientY;
        //document.getElementById("xycoordinates").innerHTML="Coordinates: (" + x + "," + y + ")";

        //左一
        if(x>=20&&x<=80&&y>=20&y<=80){
            if(init1==1||init1==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(20,20,60,60);
                context.fill();
                init1=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(50,50,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init1=2;
                color="black";
            }
            winyesorno();
        }

        //左二
        if(x>=20&&x<=80&&y>=80&&y<=140){
            if(init2==1||init2==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(20,80,60,60);
                context.fill();
                init2=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(50,110,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init2=2;
                color="black";
            }
            winyesorno();
        }
        //左三
        if(x>=20&&x<=80&&y>=160&&y<=200){
            //alert("123");
            if(init3==1||init3==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(20,140,60,60);
                context.fill();
                init3=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(50,170,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init3=2;
                color="black";
            }
            winyesorno();
        }

        //中一
        if(x>=80&&x<=140&&y>=20&y<=80){
            if(init4==1||init4==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(80,20,60,60);
                context.fill();
                init4=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(110,50,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init4=2;
                color="black";
            }
            winyesorno();
        }

        //中二
        if(x>=80&&x<=140&&y>=80&&y<=140){
            if(init5==1||init5==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(80,80,60,60);
                context.fill();
                init5=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(110,110,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init5=2;
                color="black";
            }
            winyesorno();
        }
        //中三
        if(x>=80&&x<=140&&y>=160&&y<=200){
            if(init6==1||init6==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(80,140,60,60);
                context.fill();
                init6=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(110,170,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init6=2;
                color="black";
            }
            winyesorno();
        }

        //右一
        if(x>=140&&x<=200&&y>=20&y<=80){
            if(init7==1||init7==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(140,20,60,60);
                context.fill();
                init7=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(170,50,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init7=2;
                color="black";
            }
            winyesorno();
        }

        //右二
        if(x>=140&&x<=200&&y>=80&&y<=140){
            if(init8==1||init8==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(140,80,60,60);
                context.fill();
                init8=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(170,110,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init8=2;
                color="black";
            }
            winyesorno();
        }
        //右三
        if(x>=140&&x<=200&&y>=160&&y<=200){
            if(init9==1||init9==2){
                alert("已有棋子!");
                return;
            }
            if(color=="black"){
                context.beginPath();
                context.fillStyle = color;
                context.rect(140,140,60,60);
                context.fill();
                init9=1;
                color="red";
            }
            else{
                context.beginPath();
                context.arc(170,170,30,0,360,false);
                context.fillStyle="red";//圆弧填充颜色
                context.fill();//画实心圆
                context.closePath();
                init9=2;
                color="black";
            }
            winyesorno();
        }

    }

            function winyesorno() {
            if (init1 == init2 && init2 == init3) {
                if (init1 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init1 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init1 == init4 && init4 == init7) {
                if (init1 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init1 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init1 == init5 && init5 == init9) {
                if (init1 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init1 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init7 == init8 && init8 == init9) {
                if (init7 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init7 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init3 == init6 && init6 == init9) {
                if (init3 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init3 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init2 == init5 && init5 == init8) {
                if (init2 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init2 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init4 == init5 && init5 == init6) {
                if (init4 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init4 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }

            if (init5 == init7 && init5 == init3) {
                if (init5 == 2) {
                    alert("红棋胜利!");
                    draw();
                }
                if (init5 == 1) {
                    alert("黑棋胜利!");
                    draw();
                }
            }
        }

        function draw() {
            context.fillStyle = "red"
            context.fillRect(0, 0, 340, 400);
            context.strokeStyle = "#006400";
            context.textBaseline = "hanging";
            context.font = "bold 40px '微软雅黑'";
            context.strokeText("游戏结束!", 80, 80, 250);
        }

        function cnvs_clearCoordinates() {
            document.getElementById("xycoordinates").innerHTML = "";
        }

        function init() {
            context.moveTo(20, 20);
            context.lineTo(200, 20);

            context.moveTo(20, 80);
            context.lineTo(200, 80);

            context.moveTo(20, 140);
            context.lineTo(200, 140);

            context.moveTo(20, 200);
            context.lineTo(200, 200);

            context.moveTo(20, 20);
            context.lineTo(20, 200);

            context.moveTo(80, 20);
            context.lineTo(80, 200);

            context.moveTo(140, 20);
            context.lineTo(140, 200);

            context.moveTo(200, 20);
            context.lineTo(200, 200);

            context.stroke();

            var color = "black";
        }

        function newstart() {

            canvas.height = 300;
            init();

            init1 = 0;
            init2 = 0;
            init3 = 0;
            init4 = 0;
            init5 = 0;
            init6 = 0;
            init7 = 0;
            init8 = 0;
            init9 = 0;
        }

</script>
<textarea rows="5" cols="20">游戏玩法:各个方向,哪方先连成三个同色形状的,为赢方,游戏结束。下满棋盘后,双方都没有达成三子成一条线的情况,属于和局。</textarea>
<input type="button" onclick="newstart()" value="重新开始">
<div id="xycoordinates"></div>

</body>
</html>

2.纯js+html


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <title>井字棋</title>
    
    <style>
        .kk{float:left;width:20vw;height:20vw;border:1px solid black;border:1px solid grey;box-sizing:border-box;}
    </style>
</head>
<body style="margin:0px;padding:0px;width:100%;height:100%;font-size:14px;">
    
    <!--提示框-->
	<div id="tsk" style="display:none;height:auto;overflow:hidden;z-index:9999;position:fixed;top:30%;left:10%;right:10%;border:1px solid black;border-radius:10px;background:white;">
		<div id="tsnr" style="padding:10px;text-align:center;font-size:14px;font-weight:bold;color:black;">
			
		</div>
	</div>
	
    <script>
	    //提示
		function tsxs(nr){
			document.getElementById("tsk").style.display="block";
			document.getElementById("tsnr").innerHTML=nr;
			function tsgb(){
				document.getElementById("tsk").style.display="none";
				document.getElementById("tsnr").innerHTML="";
			}
			setTimeout(tsgb,1500);
			
			return 1;
		}
	</script>
	
	<div onclick="ksyx()" style="position:fixed;z-index:2;top:10px;left:20%;right:20%;width:auto;height:30px;line-height:30px;border:1px solid black;border-radius:5px;background:white;text-align:center;">胜局:<span id="sj" style="color:red;"></span>  败局: <span id="bj" style="color:red;"></span> 平局:<span id="pj" style="color:red;"></span></div>
	
	<!--开始游戏-->
	<div style="position:fixed;z-index:2;top:80vw;left:20vw;width:60px;height:30px;line-height:30px;border:1px solid black;border-radius:5px;background:white;text-align:center;">
        <div id="yxks" onclick="ksyx()" style="display:block;width:100%;height:100%;">
            游戏开始
        </div>
        
        <div id="yxjs" onclick="jsyx()" style="display:none;width:100%;height:100%;">
            游戏结束
        </div>
    </div>
    
    <!--选择框-->
    <div id="xzk" style="display:none;position:fixed;z-index:2;top:30vw;left:20%;right:20%;width:auto;height:auto;border:2px solid black;border-radius:10px;background:white;text-align:center;">
        <div style="width:100%;height:30px;line-height:30px;">请选择棋子</div>
        <div onclick="wj='1',ds='2';xzqz()" style="margin:20px;border:1px solid black;height:30px;line-height:30px;border-radius:5px;background:black;color:white;">黑子</div>
        <div onclick="wj='2',ds='1';xzqz()" style="margin:20px;border:1px solid black;height:30px;line-height:30px;border-radius:5px;background:red;color:white;">红子</div>
    </div>
    
    
    <!--切换ai-->
	<div id="ai" onclick="dkxzk2()" style="position:fixed;z-index:2;top:80vw;right:20vw;width:60px;height:30px;line-height:30px;border:1px solid black;border-radius:5px;background:white;text-align:center;">
	    AI:<span id="aicd" style="">初级</span>
    </div>
    
     <!--选择框2-->
    <div id="xzk2" style="display:none;position:fixed;z-index:2;top:30vw;left:20%;right:20%;width:auto;height:auto;border:2px solid black;border-radius:10px;background:white;text-align:center;">
        <div style="width:100%;height:30px;line-height:30px;">请选择ai程度</div>
        <div onclick="ai='1';qhai()" style="margin:20px;border:1px solid black;height:30px;line-height:30px;border-radius:5px;background:white;color:black;">初级</div>
        <div onclick="ai='2';qhai()" style="margin:20px;border:1px solid black;height:30px;line-height:30px;border-radius:5px;background:white;color:black;">中级</div>
        <div onclick="ai='3';qhai()" style="margin:20px;border:1px solid black;height:30px;line-height:30px;border-radius:5px;background:white;color:black;">高级</div>
    </div>
    
    <!--遮挡框-->
    <div id="zdk" onclick="zd()" style="display:none;position:fixed;z-index:2;top:60px;left:20vw;right:20vw;width:60vw;height:60vw;background:none;text-align:center;opacity:0.5;"></div>
    
    <!--棋盘-->
    <div id="qp" style="margin:60px 20vw 0 20vw;width:60vw;height:60vw;overflow:hidden;" >
    </div>
    
    <!--玩法-->
    <div style="margin:100px 20px 0 20px;height:auto;">
        <span style="font-size:15px;font-weight:bold;">井字棋玩法:</span><br>
        各个方向,哪方先连成三个同色形状的,为赢方,游戏结束。下满棋盘后,双方都没有达成三子成一条线的情况,属于和局。
    </div>

    <script>
        //查询胜负平数据
        function cxsj(){
            var a="",b="",c="";
            var sj=localStorage.getItem("sj");
            if(sj!=null){
                a=sj;
            }else{
                a="0";
            };
            
            var bj=localStorage.getItem("bj");
            if(bj!=null){
                b=bj;
            }else{
                b="0";
            };
            
            var pj=localStorage.getItem("pj");
            if(pj!=null){
                c=pj;
            }else{
                c="0";
            };
            document.getElementById("sj").innerHTML=a;
            document.getElementById("bj").innerHTML=b;
            document.getElementById("pj").innerHTML=c;
        }
        cxsj();
        
        var wj="";//玩家
        var ds="";//对手
        var ai="1";//ai
        var ksz=[];//框数组
        var jsq="";
        var jsq2="";
        
        //开始游戏
        function ksyx(){
            document.getElementById("xzk").style.display="block";
            //切换为结束游戏按钮
            qh();
        }
        //选择棋子
        function xzqz(){
            gjqp();
            document.getElementById("xzk").style.display="none";
            if(ds=="1"){
                dj();
                pdjs();
            }else{
                //clearTimeout(jsq2);
            }
        }
        
        //构建棋盘
        function gjqp(){
            let zh="";
            for(let i=0;i<9;i++){
                zh+='<div id="k'+i+'" onclick=\'dj("'+i+'","0");\' class="kk" style=""></div>';
                ksz[i]="0";
            }
            document.getElementById("qp").innerHTML=zh;
        }
        
        
        //点击框
        function dj(id,sfai){
            if(id!=null){
                if(sfai=="1"){
                    //显示遮挡,避免再次ai未下,玩家再次点击
                    document.getElementById("zdk").style.display="none";
                }else{
                    //关闭遮挡
                    document.getElementById("zdk").style.display="block";
                }
                //tsxs(ksz[id]);
                
                if(ksz[id]!="0"){
                    tsxs("已有棋子");
                    //关闭遮挡
                    document.getElementById("zdk").style.display="none";
                }else{
                    let ys="";
                    
                    if(sfai=="0"){
                        ksz[id]=wj;
                        
                        if(wj=="1"){
                            ys="black";
                        }else{
                            ys="red";
                        }
                        jsq=setTimeout(ab,200);
                    }else{
                        ksz[id]=ds;
                        if(ds=="1"){
                            ys="black";
                        }else{
                            ys="red";
                        }
                        
                    }
                    
                    
                    document.getElementById("k"+id).style.background=ys;
                    
                    //完成之后触发ai
                    //判断是否胜利
                    pdjj(sfai);
                }
            }else{
                jsq=setTimeout(ab,200);
            }
        }
        
        //判断是否胜利,8种胜利条件,横三种,竖三种,斜两种
        function pdjj(sfai){
            //012
            //345
            //678
            let jg="0";
            
            //012
            if((ksz[0]==ksz[1])&&(ksz[1]==ksz[2])&&(ksz[0]!=0)&&(ksz[1]!=0)&&(ksz[2]!=0)){
                jj(sfai);
                jg="1";
            }else{
                //345
                if((ksz[3]==ksz[4])&&(ksz[4]==ksz[5])&&(ksz[3]!=0)&&(ksz[4]!=0)&&(ksz[5]!=0)){
                    jj(sfai);
                    jg="1";
                }else{
                    //678
                    if((ksz[6]==ksz[7])&&(ksz[7]==ksz[8])&&(ksz[6]!=0)&&(ksz[7]!=0)&&(ksz[8]!=0)){
                        jj(sfai);
                        jg="1";
                    }else{
                    
                        //036
                        if((ksz[0]==ksz[3])&&(ksz[3]==ksz[6])&&(ksz[0]!=0)&&(ksz[3]!=0)&&(ksz[6]!=0)){
                            jj(sfai);
                            jg="1";
                        }else{
                        
                            //147
                            if((ksz[1]==ksz[4])&&(ksz[4]==ksz[7])&&(ksz[1]!=0)&&(ksz[4]!=0)&&(ksz[7]!=0)){
                                jj(sfai);
                                jg="1";
                            }else{
                            
                                //258
                                if((ksz[2]==ksz[5])&&(ksz[5]==ksz[8])&&(ksz[2]!=0)&&(ksz[5]!=0)&&(ksz[8]!=0)){
                                    jj(sfai);
                                    jg="1";
                                }else{
                                
                                    //048
                                    if((ksz[0]==ksz[4])&&(ksz[4]==ksz[8])&&(ksz[0]!=0)&&(ksz[4]!=0)&&(ksz[8]!=0)){
                                        jj(sfai);
                                        jg="1";
                                    }else{
                                    
                                        //246
                                        if((ksz[2]==ksz[4])&&(ksz[4]==ksz[6])&&(ksz[2]!=0)&&(ksz[4]!=0)&&(ksz[6]!=0)){
                                            jj(sfai);
                                            jg="1";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
                
            return jg;
        }
        
        
        //结局
        function jj(sfai){
            let sz="";
            if(sfai!=null){
                if(sfai=="0"){
                    sz="您";
                    //写入数据
                    var a=localStorage.getItem("sj");
                    localStorage.setItem("sj",Number(a)+1);
                }else{
                    sz="AI";
                    //写入数据
                    var a=localStorage.getItem("bj");
                    localStorage.setItem("bj",Number(a)+1);
                }
                tsxs(sz+"胜利!");
            }else{
                tsxs("平局!");
                //写入数据
                var a=localStorage.getItem("pj");
                localStorage.setItem("pj",Number(a)+1);
            }
            
            //棋盘不可点击
            bkdj();
            
            //更新数据
            cxsj();
            
            //关闭遮挡
            document.getElementById("zdk").style.display="none";
            
            document.getElementById("yxks").innerHTML="再来一局";
        }
        
        //棋盘不可点击
        function bkdj(){
            for(let i=0;i<ksz.length;i++){
                document.getElementById("k"+i).onclick=function(){tsxs('游戏已结束,不可下子');};
            }
            //切换为开始游戏按钮
            qh();
            //关闭ai计时器
            clearTimeout(jsq);
        }
        
        //清空棋盘
        function qkqp(){
            document.getElementById('qp').innerHTML="";
        }
        
        //主动结束游戏
        function jsyx(){
            tsxs("主动认输");
            qkqp();
            //写入数据
            var a=localStorage.getItem("bj");
            localStorage.setItem("bj",Number(a)+1);
            //更新数据
            cxsj();
            
            //切换为开始游戏按钮
            qh();
            //关闭遮挡
            document.getElementById("zdk").style.display="none";
            
            //切换为初始状态
            document.getElementById("yxks").innerHTML="开始游戏";
        }
        
        //切换开始结束按钮
        function qh(){
            var a=document.getElementById("yxks").style.display;
            if(a=="block"){
                document.getElementById("yxjs").style.display="block";
                document.getElementById("yxks").style.display="none";
                //打开ai选择
                document.getElementById("ai").onclick=function (){tsxs("游戏中,不可切换");};
            }else{
                document.getElementById("yxjs").style.display="none";
                document.getElementById("yxks").style.display="block";
                //打开ai选择
                document.getElementById("ai").onclick=function (){dkxzk2();};
            }
        }
        
        
        //判断可能胜利的条件,24种
        function sltj(dx){
            
            let fh=[];
            
            //012
            //345
            //678
            
            //01
            if((ksz[0]==ksz[1])&&(ksz[0]==dx)&&(ksz[1]==dx)&&(ksz[2]==0)){
                fh.push(2);
            }
            //02
            if((ksz[0]==ksz[2])&&(ksz[0]==dx)&&(ksz[2]==dx)&&(ksz[1]==0)){
                fh.push(1);
            }
            //03
            if((ksz[0]==ksz[3])&&(ksz[0]==dx)&&(ksz[3]==dx)&&(ksz[6]==0)){
                fh.push(6);
            }
            //04
            if((ksz[0]==ksz[4])&&(ksz[0]==dx)&&(ksz[4]==dx)&&(ksz[8]==0)){
                fh.push(8);
            }
            //06
            if((ksz[0]==ksz[6])&&(ksz[0]==dx)&&(ksz[6]==dx)&&(ksz[3]==0)){
                fh.push(3);
            }
            //08
            if((ksz[0]==ksz[8])&&(ksz[0]==dx)&&(ksz[8]==dx)&&(ksz[4]==0)){
                fh.push(4);
            }
            
            
            //14
            if((ksz[1]==ksz[4])&&(ksz[1]==dx)&&(ksz[4]==dx)&&(ksz[7]==0)){
                fh.push(7);
            }
            //17
            if((ksz[1]==ksz[7])&&(ksz[1]==dx)&&(ksz[7]==dx)&&(ksz[4]==0)){
                fh.push(4);
            }
            
            
            //21
            if((ksz[1]==ksz[2])&&(ksz[2]==dx)&&(ksz[1]==dx)&&(ksz[0]==0)){
                fh.push(0);
            }
            //24
            if((ksz[2]==ksz[4])&&(ksz[2]==dx)&&(ksz[4]==dx)&&(ksz[6]==0)){
                fh.push(6);
            }
            //25
            if((ksz[2]==ksz[5])&&(ksz[2]==dx)&&(ksz[5]==dx)&&(ksz[8]==0)){
                fh.push(8);
            }
            //26
            if((ksz[2]==ksz[6])&&(ksz[2]==dx)&&(ksz[6]==dx)&&(ksz[4]==0)){
                fh.push(4);
            }
            //28
            if((ksz[2]==ksz[8])&&(ksz[2]==dx)&&(ksz[8]==dx)&&(ksz[5]==0)){
                fh.push(5);
            }
            
            
            //34
            if((ksz[3]==ksz[4])&&(ksz[3]==dx)&&(ksz[4]==dx)&&(ksz[5]==0)){
                fh.push(5);
            }
            //35
            if((ksz[3]==ksz[5])&&(ksz[3]==dx)&&(ksz[5]==dx)&&(ksz[4]==0)){
                fh.push(4);
            }
            
            //54
            if((ksz[5]==ksz[4])&&(ksz[5]==dx)&&(ksz[4]==dx)&&(ksz[3]==0)){
                fh.push(3);
            }
            
            //63
            if((ksz[6]==ksz[3])&&(ksz[6]==dx)&&(ksz[3]==dx)&&(ksz[0]==0)){
                fh.push(0);
            }
            //64
            if((ksz[6]==ksz[4])&&(ksz[6]==dx)&&(ksz[4]==dx)&&(ksz[2]==0)){
                fh.push(2);
            }
            //67
            if((ksz[6]==ksz[7])&&(ksz[6]==dx)&&(ksz[7]==dx)&&(ksz[8]==0)){
                fh.push(8);
            }
            //68
            if((ksz[6]==ksz[8])&&(ksz[6]==dx)&&(ksz[8]==dx)&&(ksz[7]==0)){
                fh.push(7);
            }
            
            //74
            if((ksz[7]==ksz[4])&&(ksz[7]==dx)&&(ksz[4]==dx)&&(ksz[1]==0)){
                fh.push(1);
            }
            
            //87
            if((ksz[8]==ksz[7])&&(ksz[8]==dx)&&(ksz[7]==dx)&&(ksz[6]==0)){
                fh.push(6);
            }
            //84
            if((ksz[8]==ksz[4])&&(ksz[8]==dx)&&(ksz[4]==dx)&&(ksz[0]==0)){
                fh.push(0);
            }
            //85
            if((ksz[8]==ksz[5])&&(ksz[8]==dx)&&(ksz[5]==dx)&&(ksz[2]==0)){
                fh.push(2);
            }
            
            
            
            //返回可选择的数组
            return fh;
        }
        
        //创建胜利条件
        function cjsltj(){
            //012
            //345
            //678
            let fh=[];
            //01
            if((ksz[0]==ds)&&(ksz[1]==0)&&(ksz[2]==0)){
                fh.push(1);
            }
            //03
            if((ksz[0]==ds)&&(ksz[3]==0)&&(ksz[6]==0)){
                fh.push(3);
            }
            //04
            if((ksz[0]==ds)&&(ksz[4]==0)&&(ksz[8]==0)){
                fh.push(4);
            }
            
            //14
            if((ksz[1]==ds)&&(ksz[4]==0)&&(ksz[7]==0)){
                fh.push(4);
            }
            
            //21
            if((ksz[2]==ds)&&(ksz[1]==0)&&(ksz[0]==0)){
                fh.push(1);
            }
            //24
            if((ksz[2]==ds)&&(ksz[4]==0)&&(ksz[6]==0)){
                fh.push(4);
            }
            //25
            if((ksz[2]==ds)&&(ksz[5]==0)&&(ksz[8]==0)){
                fh.push(5);
            }
            
            //34
            if((ksz[3]==ds)&&(ksz[4]==0)&&(ksz[5]==0)){
                fh.push(4);
            }
            
            //54
            if((ksz[5]==ds)&&(ksz[4]==0)&&(ksz[3]==0)){
                fh.push(4);
            }
            
            //63
            if((ksz[6]==ds)&&(ksz[3]==0)&&(ksz[0]==0)){
                fh.push(3);
            }
            //64
            if((ksz[6]==ds)&&(ksz[4]==0)&&(ksz[2]==0)){
                fh.push(4);
            }
            //67
            if((ksz[6]==ds)&&(ksz[7]==0)&&(ksz[8]==0)){
                fh.push(7);
            }
            
            //74
            if((ksz[7]==ds)&&(ksz[4]==0)&&(ksz[1]==0)){
                fh.push(4);
            }
            
            //87
            if((ksz[8]==ds)&&(ksz[7]==0)&&(ksz[6]==0)){
                fh.push(7);
            }
            //84
            if((ksz[8]==ds)&&(ksz[4]==0)&&(ksz[0]==0)){
                fh.push(4);
            }
            //85
            if((ksz[8]==ds)&&(ksz[5]==0)&&(ksz[2]==0)){
                fh.push(5);
            }
            
            //fh=ds;
            
            //返回可选择的数组
            return fh;
        }
        
        //ai
        function ab(){
            var sysz=[];
            for(let i=0;i<ksz.length;i++){
                if(ksz[i]==0){
                    sysz.push(i);
                }
            }
            
            //如果剩余可点击的格子为零,说明结束,平局
            if(sysz.length=="0"){
                //写入平局
                let jg=pdjj();
                if(jg=="1"){
                    jj(1);
                }else{
                    jj();
                }
                //tsxs("结束");
            }else{
                //低级ai,随机下
                if(ai=="1"){
                    //Math.floor(Math.random() * arrStr.length)
                    let a=Math.floor(Math.random()*sysz.length);
                    dj(sysz[a],1);
                    
                }
                //中级ai,阻止玩家胜利
                if(ai=="2"){
                    //检测玩家可能胜利的情况
                    let b=sltj(wj);
                    
                    let c="";
                    if(b.length!="0"){
                        //存在多种可能时,随机选择一个
                        c=b;
                    }else{
                        c=sysz;
                    }
                    
                    let a=Math.floor(Math.random()*c.length);
                    dj(c[a],1);
                }
                //高级ai,阻止玩家,优先自己胜利
                if(ai=="3"){
                    
                    let b=sltj(wj);
                    //alert("玩家胜利条件:"+b);
                    
                    let d=sltj(ds);
                    //alert("ai胜利条件:"+d);
                    
                    
                    
                    
                    
                    if(b.length!="0"){
                        if(d.length=="0"){
                            let a=Math.floor(Math.random()*b.length);
                            dj(b[a],1);
                        }else{
                            //取重复值,即双方都可能胜利的选项
                            function compare(arr1, arr2) {
                              return arr1.filter((v) => {
                                return arr2.includes(v);
                              });
                            }
                            
                            let e=compare(b,d);
                            //alert("最有可能胜利:"+e);
                            
                            if(d.length!="0"&&e.length=="0"){
                                //存在多种可能时,随机选择一个,出现多个选项时必输
                                let a=Math.floor(Math.random()*d.length);
                                dj(d[a],1);
                            }else{
                                //存在多种可能时,随机选择一个,出现多个选项时必输
                                let a=Math.floor(Math.random()*e.length);
                                dj(e[a],1);
                            }
                            
                        }
                    }else{
                        //不存在相连的情况
                        let e=cjsltj();
                        
                        if(e.length!="0"){
                            //alert(e);
                            //创建胜利条件
                            let a=Math.floor(Math.random()*e.length);
                            dj(e[a],1);
                            //tsxs("已创建有利");
                        }else{
                            //alert(e);
                            //无胜利条件,随机选一个
                            let a=Math.floor(Math.random()*sysz.length);
                            dj(sysz[a],1);
                        }
                    }
                    
                    
                    //查询玩家是否有胜利条件,无的话,随机或者创建胜利条件
                    
                }
            }
        }
        
        function zd(){
            tsxs("请等待ai下子");
        }
        
        //打开关闭ai选择框
        function dkxzk2(){
            document.getElementById("xzk2").style.display="block";
        }
        function gbxzk2(){
            document.getElementById("xzk2").style.display="none";
        }
        
        //切换ai
        function qhai(){
            if(ai=="1"){
                document.getElementById("aicd").innerHTML="初级";
            }
            if(ai=="2"){
                document.getElementById("aicd").innerHTML="中级";
            }
            if(ai=="3"){
                document.getElementById("aicd").innerHTML="高级";
            }
            tsxs("切换成功");
            document.getElementById("xzk2").style.display="none";
        }
        
        
        function pdjs(){
            var sysz=[];
            for(let i=0;i<ksz.length;i++){
                if(ksz[i]==0){
                    sysz.push(i);
                }
            }
            
            if(sysz.length=="0"){
                
                dj();
                
                clearTimeout(jsq2);
            }else{
                jsq2=setTimeout(pdjs,500);
            }
        }
    
    </script>

    
</body>
</html>

感觉井字棋的规则是有局限性的,仅供娱乐。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的井字棋实现,代码如下: HTML: ```html <div class="tic-tac-toe"> <div class="row"> <div class="cell" id="cell-0"></div> <div class="cell" id="cell-1"></div> <div class="cell" id="cell-2"></div> </div> <div class="row"> <div class="cell" id="cell-3"></div> <div class="cell" id="cell-4"></div> <div class="cell" id="cell-5"></div> </div> <div class="row"> <div class="cell" id="cell-6"></div> <div class="cell" id="cell-7"></div> <div class="cell" id="cell-8"></div> </div> </div> ``` CSS: ```css .tic-tac-toe { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-top: 50px; } .row { display: flex; } .cell { width: 100px; height: 100px; border: 2px solid black; font-size: 50px; font-weight: bold; display: flex; justify-content: center; align-items: center; cursor: pointer; } .cell:hover { background-color: #eee; } ``` JS: ```javascript const cells = document.querySelectorAll('.cell'); let currentPlayer = 'X'; let gameEnded = false; function checkWinner() { const winningCombinations = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ]; for (let i = 0; i < winningCombinations.length; i++) { const [a, b, c] = winningCombinations[i]; if (cells[a].textContent === cells[b].textContent && cells[b].textContent === cells[c].textContent && cells[a].textContent !== '') { return cells[a].textContent; } } return ''; } function resetGame() { cells.forEach(cell => { cell.textContent = ''; }); currentPlayer = 'X'; gameEnded = false; } cells.forEach(cell => { cell.addEventListener('click', () => { if (gameEnded || cell.textContent !== '') { return; } cell.textContent = currentPlayer; const winner = checkWinner(); if (winner !== '') { alert(`Winner: ${winner}`); gameEnded = true; return; } if (currentPlayer === 'X') { currentPlayer = 'O'; } else { currentPlayer = 'X'; } }); }); document.querySelector('#reset-button').addEventListener('click', resetGame); ``` 上述代码通过 HTML 和 CSS 创建了一个井字棋的游戏界面,并通过 JavaScript 实现了游戏的逻辑。在点击格子时会切换当前玩家并检查是否有获胜者,当游戏结束时可以通过点击“重置”按钮重新开始游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值