首页 > 其他分享 >canvas人机对战的五子棋,休闲一下

canvas人机对战的五子棋,休闲一下

时间:2023-09-08 21:45:09浏览次数:32  
标签:canvas 15 gradient max 30 五子棋 对战 context var

canvas画布,还是一个比较令人头疼的东西,由于自己用得少,所以觉得还很欠缺,偶然间看到人家写的五子棋,便也顺便学习一下,写个试试,全当练练手,顺便记录一下。

1、先创建canvas,画个棋盘

var context = chess.getContext('2d');
context.strokeStyle = "#dedede";
var drawLine=function(){
   for(var i=0;i<15;i++){
        context.moveTo(15+i*30,15);
        context.lineTo(15+i*30,435);
        context.stroke();
        context.moveTo(15,15+i*30);
        context.lineTo(435,15+i*30);
        context.stroke();
   }
};
drawLine();

 2、然后就是自己落子和电脑对应落子

 var oneStep = function(i,j,me){
            context.beginPath();
            context.arc(15+i*30,15+j*30,13,0,2*Math.PI);
            var gradient = context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0)
            if(me){
                gradient.addColorStop(0,"#0a0a0a");
                gradient.addColorStop(1,"#636766");
            }else{
                gradient.addColorStop(0,"#d1d1d1");
                gradient.addColorStop(1,"#f9f9f9");
            }
            context.fillStyle = gradient;
            context.fill();
            context.closePath();
        };

        chess.onclick=function(e){
            if(over){
                return;
            }
            if(!me){
                return;
            }
            var x= e.offsetX;
            var y= e.offsetY;
            var i = Math.floor(x/30);
            var j = Math.floor(y/30);
            if(chessBoard[i][j] == 0){
                oneStep(i, j,me);
                chessBoard[i][j] = 1;
                for(var k=0;k<count;k++){
                    if(wins[i][j][k]){
                        myWin[k]++;
                        computerWin[k] = 6;
                        if(myWin[k] == 5){
                            msgBox.style.display = "block";
                            msgTxt.innerHTML = "你赢了!";
                            over = true;
                        }
                    }
                }
                if(!over){
                    me = !me;
                    computerAI();
                }
            }
        };

        var computerAI = function(){
            var myScore = [];
            var computerScore = [];
            var max = 0;
            var u = 0, v = 0;

            for(var i = 0;i<15;i++){
                myScore[i]=[];
                computerScore[i]=[];
                for(var j=0;j<15;j++){
                    myScore[i][j] = 0;
                    computerScore[i][j] = 0;
                }
            }
            for(var i = 0;i<15;i++){
                for(var j=0;j<15;j++){
                    if(chessBoard[i][j] == 0){
                        for(var k=0;k<count;k++){
                            if(wins[i][j][k]){
                                if(myWin[k]==1){
                                    myScore[i][j]+=200;
                                }else if(myWin[k]==2){
                                    myScore[i][j]+=400;
                                }else if(myWin[k]==3){
                                    myScore[i][j]+=2000;
                                }else if(myWin[k]==4){
                                    myScore[i][j]+=10000;
                                }
                                if(computerWin[k]==1){
                                    computerScore[i][j]+=300;
                                }else if(computerWin[k]==2){
                                    computerScore[i][j]+=500;
                                }else if(computerWin[k]==3){
                                    computerScore[i][j]+=3000;
                                }else if(computerWin[k]==4){
                                    computerScore[i][j]+=20000;
                                }
                            }
                        }
                    }
                    if(myScore[i][j] > max){
                        max = myScore[i][j];
                        u=i;
                        v=j;
                    }else if(myScore[i][j] == max){
                        if(computerScore[i][j]>computerScore[u][v]){
                            u=i;
                            v=j;
                        }
                    }
                    if(computerScore[i][j]>max){
                        max = computerScore[i][j];
                        u=i;
                        v=j;
                    }else if(computerScore[i][j] == max){
                        if(myScore[i][j] > myScore[u][v]){
                            u=i;
                            v=j;
                        }
                    }
                }
            }
            oneStep(u,v,false);
            chessBoard[u][v] = 2;
            for(var k=0;k<count;k++){
                if(wins[u][v][k]){
                    computerWin[k]++;
                    myWin[k] = 6;
                    if(computerWin[k] == 5){
                        msgBox.style.display = "block";
                        msgTxt.innerHTML = "Computer赢了!";
                        over = true;
                    }
                }
            }
            if(!over){
                me = !me;
            }
        };

反正这玩意儿,掌握技巧后就能老赢,哈哈,可能是写得缺陷比较大吧

想获取完整代码的小伙伴,可以去微信小程序搜索 ‘工具百宝汇’,在“模版-其他”中可以获取网盘分享地址哦

标签:canvas,15,gradient,max,30,五子棋,对战,context,var
From: https://www.cnblogs.com/Immortal-brother/p/17687811.html

相关文章

  • vue项目Canvas给图片改色,返回base64的图片
     (适应于纯色图片)1.vue文件中创建canvas<!--落图图片改色--><canvasid="mycanvas"></canvas>2.创建changeImgColor.js文件letctx=null;letcanvas=null;letbase64Info=null;exportfunctionsetImgColor(url){returnnewPromise((resolve......
  • 在Canvas上进行文本输入及其它html元素操作
    问题使用canvas绘制了一个表格,想要在上面进行编辑操作,但canvas并不支持修改操作思路通过给html元素设置绝对定位,遮盖canvas上的指定位置,所有编辑操作都在元素上进行,也可以将元素的值绘制到canvas上,示例demo如下:点击查看代码<!DOCTYPEHTML><html><style></style><bodys......
  • 借助html2canvas下载图片,有滚动条的情况显示不全的问题
    我自己的遇到的情况是将页面的一个小窗口里边的内容生成图片下载,试了网上搜到的几个方法都没有生效,最后自己用了个取巧的方法:通过调整overflow-y来解决这个问题。downloadItem(){consttargetDom=document.getElementById(`image-${this.dialogNo}`)targetDo......
  • 【230905-5】用Canvas上勾画对数曲线:y=log10_x
    【图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>勾画log10_x</title><styletype="text/css"......
  • #yyds干货盘点#用canvas实现一个简单的画板
    画板的功能修改画笔颜色;修改画笔粗细;橡皮擦;重置画板;撤销上一步;保存成图片;一步步实现<canvasid="myCanvas"width="400"height="400"></canvas>classBoard{constructor(id){this.canvas=document.getElementById(id);this.context=this.canva......
  • android短视频开发,js如何设置canvas绕图形中心旋转
    android短视频开发,js如何设置canvas绕图形中心旋转1.准备一个页面拟写一个页面,用于实验,代码如下 <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initcal-scale=1.0"/><title>......
  • canvas组件
    以下是使用Python的Tkinter库中的Canvas组件的一些常用方法的示例代码: ```pythonimporttkinterastk defcreate_canvas(root):  canvas=tk.Canvas(root)  returncanvas #在Canvas组件上绘制图形defdraw_shape(canvas,shape,**kwargs):  canva......
  • uniapp使用canvas电子签名
    <template><viewclass="draw-page"><viewclass="draw-content"><canvasstyle="width:100%;height:100%"ref="sign"canvas-id="sign"id=&qu......
  • 详情讲解canvas实现电子签名
    签名的实现功能我们要实现签名:1.我们首先要鼠标按下,移动,抬起。经过这三个步骤。我们可以实现一笔或者连笔。按下的时候我们需要移动画笔,可以使用moveTo来移动画笔。e.pageX,e.pageY来获取坐标位置移动的时候我们进行绘制ctx.lineTo(e.pageX,e.pageY)ctx.stroke()......
  • canvas实现签名
    在开源项目中发现canvas实现签名功能以此记录:http://www.youlai.tech/pages/52d5c3/HTML:<divclass="canvas-dom"><el-buttonplaintype="text"style="margin-left:20px;margin-top:20px;font-size:18px;"@click="back">返回<......