前两天用canvas画了个“井字游戏”棋盘,基于这个制作了井字游戏功能,游戏功能较为简单,纯属练习。
演示地址:https://www.xueyidian.cn/demo/%E4%BA%95%E5%AD%97%E6%B8%B8%E6%88%8F.html
源码如下:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>井字游戏</title> <style> body{padding: 0;margin: 0;} #well{float: left; cursor: pointer;} .tip{margin: 80px 0 0 40px;float: left; width: 490px;} .tip p{line-height: 30px;} .red{color: #cd192e;} .blue{color: #1943cd;} .fz30{font-size: 30px; vertical-align: top;} .state{display: block; clear: both; margin: 20px 0 0 120px;} </style> </head> <body> <canvas id="well" width="400" height="400" onClick="startWell()"></canvas> <div class="tip"> <h1>井字游戏</h1> <p><span class="red">红方</span>和<span class="blue">蓝方</span>轮流下棋子(<span class="red">红方</span>先下),点击方格下棋,一方连成一排获胜,刷新可重新开始。</p> <p><span class="red">红:<span class="fz30">×</span></span></p> <p><span class="blue">蓝:<span class="fz30">○</span></span></p> </div> <div class="state">当前状态:<span id="st">轮到<span id="state" class="red">红方</span>下棋</span></div> <script> var well = document.getElementById("well"); var wlc = well.getContext("2d"); var bw = 3; //线的宽度 var m = 80; //棋盘的外边距 var w = 300; //棋盘宽度 var h = w; //棋盘高度,与宽度保持一致 var p = w * 0.07; //网格的内边距 var r = w / 3 / 2 - p; //圆棋子的半径 var state = true; //true为红方先行,falsh则为蓝方 var s = document.getElementById("state"); var st = document.getElementById("st"); var red = new Array(); //记录红方下棋 var blue = new Array();//记录蓝方下棋 var result = 0; //游戏结果 0为在游戏中,1为红方赢,2为蓝方赢,3位平局 var win = new Array( //胜利条件 new Array(0,1,2), new Array(3,4,5), new Array(6,7,8), new Array(0,3,6), new Array(1,4,7), new Array(2,5,8), new Array(0,4,8), new Array(2,4,6) ); function chessboard(wlc){ //画外部线框 wlc.lineWidth = bw; wlc.strokeRect(m, m, w, h); //开始画网格 wlc.beginPath(); //画第一列线 wlc.moveTo(m + w * 1 / 3, m); wlc.lineTo(m + w * 1 / 3, m + h); //画第二列线 wlc.moveTo(m + w * 2 / 3, m); wlc.lineTo(m + w * 2 / 3, m + h); //画第一行线 wlc.moveTo(m, m + h * 1 / 3); wlc.lineTo(m + w, m + h * 1 / 3); //画第二行线 wlc.moveTo(m, m + h * 2 / 3); wlc.lineTo(m + w, m + h * 2 / 3); wlc.stroke(); } function xPiece(wlc, path){ var shang = parseInt(path / 3); //判断Y轴位置 1 var yu = path % 3; //判断X轴位置 0 var m1xS = m + w / 3 * yu + p; //第一条斜线的开始点X轴 var m1yS = m + h / 3 * shang + p; //第一条斜线的开始点Y轴 var m1xE = m + w / 3 * yu + p + r * 2; //第一条斜线的结束点X轴 var m1yE = m + h / 3 * shang + p + r * 2; //第一条斜线的结束点Y轴 var m2xS = m + w / 3 * yu + p + r * 2; //第二条斜线的开始点X轴 var m2yS = m + h / 3 * shang + p; //第二条斜线的开始点Y轴 var m2xE = m + w / 3 * yu + p; //第二条斜线的结束点X轴 var m2yE = m + h / 3 * shang + p + r * 2; //第二条斜线的结束点Y轴 //开始画叉 wlc.beginPath(); wlc.strokeStyle = "#cd192e"; wlc.moveTo(m1xS, m1yS); wlc.lineTo(m1xE, m1yE); wlc.moveTo(m2xS, m2yS); wlc.lineTo(m2xE, m2yE); wlc.stroke(); } function roundPiece(wlc, path){ var shang = parseInt(path / 3); //判断Y轴位置 1 var yu = path % 3; //判断X轴位置 0 var x = m + w / 3 * yu + w / 6; //计算X轴 var y = m + h / 3 * shang + h / 6; //计算Y轴 wlc.beginPath(); wlc.strokeStyle = "#1943cd"; wlc.arc(x, y, r, 0, 2 * Math.PI); wlc.stroke(); } chessboard(wlc); //画棋盘 function drawWell(){ // xPiece(wlc,1); //画叉棋子 // xPiece(wlc,6); //画叉棋子 // xPiece(wlc,4); //画叉棋子 // xPiece(wlc,8); //画叉棋子 // // roundPiece(wlc, 0); //画圆棋子 // roundPiece(wlc, 2); //画圆棋子 // roundPiece(wlc, 3); //画圆棋子 // roundPiece(wlc, 5); //画圆棋子 // roundPiece(wlc, 7); //画圆棋子 } function startWell(){ //标准的获取鼠标点击相对于canvas画布的坐标公式 var box = well.getBoundingClientRect(); var x = (event.clientX + (-box.left)) * well.width / box.width - m; var y = (event.clientY + (-box.top)) * well.height / box.height - m; var xIndex = parseInt(x / (w / 3)); var yIndex = parseInt(y / (h / 3)); var index = xIndex + yIndex * 3; if(x < w && y < w && result == 0){ if(red.indexOf(index) == -1 && blue.indexOf(index) == -1){ if(state){ xPiece(wlc, index); red.push(index); red.sort(); s.innerHTML = "蓝方"; s.className = "blue"; state = false; }else{ roundPiece(wlc, index); blue.push(index); blue.sort(); s.innerHTML = "红方"; s.className = "red"; state = true; } for(var i = 0,len = win.length; i < len; i++){ if(red.toString().indexOf(win[i].toString()) != -1){ alert('红方赢'); st.innerHTML = "红方赢"; result = 1; break; }else if(blue.toString().indexOf(win[i].toString()) != -1){ alert('蓝方赢'); st.innerHTML = "蓝方赢"; result = 2; break; }else if(red.length + blue.length == 9){ alert('平局'); st.innerHTML = "平局"; result = 3; break; } } } } //console.log(red.length); //console.log(blue); } </script> </body> </html>
楼主可以做出类似https://www.shiyouhome.com这个网站的游戏吗?可以的话,咱们可以合作。