JS五子棋

推荐在HBuilder上写
本文实例为大家分享了js实现五子棋的具体代码,供大家参考,具体内容如下

思路:

1、先用canvas画五子棋的棋盘
2、获取鼠标点击的位置
3、根据鼠标点击的位置判断,并画棋子
4、根据下的棋子判断是否赢了

代码:

<!DOCTYPE html> 
<html> 
<head lang="en"> 
 <meta charset="UTF-8"> 
 <title></title> 
 <style> 
 * { 
  padding: 0; 
  margin: 0; 
 } 
 canvas { 
  margin: 10px; 
  border: 2px solid #000; 
 } 
 #box { 
  display: inline-block; 
  position: absolute; 
  margin-top: 200px; 
  margin-left: 100px; 
 } 
 span { 
  font: 24px "微软雅黑"; 
  display: inline-block; 
  height: 50px; 
 } 
 input { 
  margin-top: 30px; 
  display: block; 
  width: 100px; 
  height: 50px; 
  font: 16px "微软雅黑"; 
  color: #fff; 
  background-color: #0099cc; 
 } 
 </style> 
</head> 
<body> 
<canvas width="640" height="640" id="cas"> 
 您的浏览器不支持canvas,请升级到最新的浏览器 
</canvas> 
<div id="box"> 
 <span id="txt"></span> 
 <input type="button" id="btn" value="重新开始"/> 
  
</div> 
  
<script> 
 var flag = true; //true代表白棋下的棋子,false代表黑棋下的棋子 
 var isWin = false; //判断是否结束,true结束,false没有结束 
 var step = 40; //设置每个格子的宽高都是40 
  
 var txt = document.getElementById("txt"); 
 var btn = document.getElementById("btn"); 
 var cas = document.getElementById("cas");// 获取画布对象 
 var ctx = cas.getContext("2d"); //画布上下文 
  
// 创建图片对象 
 var img_b = new Image(); 
 img_b.src = "imgs/b.png";//设置黑棋图片路径 
 var img_w = new Image(); 
 img_w.src = "imgs/w.png";//设置白棋图片路径 
  
// 用二维数组来保存棋盘,0代表没有走过,1为白棋走过,2为黑棋走过 
 var arr = new Array(15); //声明一个一维数组 
 for (var i = 0; i < 15; i++) { 
 arr[i] = new Array(15); //每个值再声明一个一维数组,这样就组成了一个二维数组 
 for (var j = 0; j < 15; j++) { 
  arr[i][j] = 0; 
 } 
 } 
  
 //绘制棋盘 
 function drawLine() { 
 for (var i = 0; i < cas.width / step; i++) { 
  // 画竖线 
  ctx.moveTo((i + 1) * step, 0); 
  ctx.lineTo((i + 1) * step, cas.height); 
  // 画横线 
  ctx.moveTo(0, (i + 1) * step); 
  ctx.lineTo(cas.width, (i + 1) * step); 
  ctx.stroke(); 
 } 
 } 
 //获取鼠标点击的位置 
 cas.onclick = function (e) { 
 // 先判断游戏是否结束 
 if (isWin) { 
  alert("游戏已经结束,请刷新重新开始!"); 
  return 0; 
 } 
 //判断棋子显示的地方,四条边上不显示棋子, 
 //鼠标点击的位置减去边框距离页面的上和左的距离(10),减去一个格子宽高的一半(20) 
 var x = (e.clientX - 10 - 20) / 40; 
 var y = (e.clientY - 10 - 20) / 40; 
  
 //进行取整来确定棋子最终显示的区域 
 x = parseInt(x); 
 y = parseInt(y); 
 //如果超出棋盘或者在棋盘边界直接返回,边界上不能画棋子 
 if(x < 0 || x >= 15 || y < 0 || y >= 15) { 
  return; 
 } 
 //进行判断该位置是否已经显示过棋子 
 if (arr[x][y] != 0) { 
  alert("你不能在这个位置下棋"); 
  return; 
 } 
 // 判断是显示黑子还是白子 
 if (flag) {//白子 
  flag = false; //将标志置为false,表示下次为黑子 
  drawChess(1, x, y); //调用函数来画棋子 
  
 } else {//黑子 
  flag = true; //将标志置为true,表示下次为白子 
  drawChess(2, x, y); //调用函数来画棋子 
  
 } 
 } 
 //画棋子 
 function drawChess(num, x, y) { 
 //根据x和y确定图片显示位置,让图片显示在十字线中间,因为一个格子为40,图片大小为30,所以40-30/2等于25,所以需要加上25 
 var x0 = x * step + 25; 
 var y0 = y * step + 25; 
 if (num == 1) { 
  //绘制白棋 
  ctx.drawImage(img_w, x0, y0); 
  arr[x][y] = 1; //白子 
 } else if (num == 2) { 
  // 绘制黑棋 
  ctx.drawImage(img_b, x0, y0); 
  arr[x][y] = 2; //黑子 
 } 
 //调用函数判断输赢 
 judge(num, x, y); 
 } 
 //判断输赢 
 function judge(num, x, y) { 
 var n1 = 0, //左右方向 
  n2 = 0, //上下方向 
  n3 = 0, //左上到右下方向 
  n4 = 0; // 右上到左下方向 
 //***************左右方向*************
 //先从点击的位置向左寻找,相同颜色的棋子n1自加,直到不是相同颜色的棋子,则跳出循环 
 for (var i = x; i >= 0; i--) { 
  if (arr[i][y] != num) { 
  break; 
  } 
  n1++; 
 } 
 //然后从点击的位置向右下一个位置寻找,相同颜色的棋子n1自加,直到不是相同颜色的棋子,则跳出循环 
 for (var i = x + 1; i < 15; i++) { 
  if (arr[i][y] != num) { 
  break; 
  } 
  n1++; 
 } 
 //****************上下方向************ 
 for (var i = y; i >= 0; i--) { 
  if (arr[x][i] != num) { 
  break; 
  } 
  n2++; 
 } 
 for (var i = y + 1; i < 15; i++) { 
  if (arr[x][i] != num) { 
  break; 
  } 
  n2++; 
 } 
 //****************左上到右下斜方向*********** 
 for(var i = x, j = y; i >=0, j >= 0; i--, j--) { 
  if (i < 0 || j < 0 || arr[i][j] != num) { 
  break; 
  } 
  n3++; 
 } 
 for(var i = x+1, j = y+1; i < 15, j < 15; i++, j++) { 
  if (i >= 15 || j >= 15 || arr[i][j] != num) { 
  break; 
  } 
  n3++; 
 } 
 //****************右上到左下斜方向*************
 for(var i = x, j = y; i >= 0, j < 15; i--, j++) { 
  if (i < 0 || j >= 15 || arr[i][j] != num) { 
  break; 
  } 
  n4++; 
 } 
 for(var i = x+1, j = y-1; i < 15, j >= 0; i++, j--) { 
  if (i >= 15 || j < 0 || arr[i][j] != num) { 
  break; 
  } 
  n4++; 
 } 
 //用一个定时器来延时,否则会先弹出对话框,然后才显示棋子 
 var str; 
 if (n1 >= 5 || n2 >= 5 || n3 >= 5 || n4 >= 5) { 
  if (num == 1) {//白棋 
  str = "白棋赢了,游戏结束!" 
  } else if (num == 2) {//黑棋 
  str = "黑棋赢了,游戏结束!" 
  } 
  txt.innerHTML = str; 
  isWin = true; 
 } 
 } 
 //重新开始 
 btn.onclick = function() { 
 flag = true; 
 isWin = false; 
  
 for (var i = 0; i < 15; i++) { 
  for (var j = 0; j < 15; j++) { 
  arr[i][j] = 0; 
  } 
 } 
 ctx.clearRect(0, 0, 640, 640); 
 txt.innerHTML = ""; 
 drawLine(); 
 } 
 drawLine(); 
</script> 
</body> 
</html> 
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个简单的 JavaScript 五子棋游戏实现,供参考: ```html <!DOCTYPE html> <html> <head> <title>JavaScript 五子棋游戏</title> <style type="text/css"> #board { margin: 20px; border: 1px solid #000; width: 600px; height: 600px; } .cell { width: 40px; height: 40px; border: 1px solid #ccc; float: left; cursor: pointer; } .cell.black { background-color: #000; border-radius: 50%; } .cell.white { background-color: #fff; border-radius: 50%; } </style> </head> <body> <div id="board"></div> <script type="text/javascript"> var board = []; var ROWS = 15; var COLS = 15; var CELL_SIZE = 40; var currentPlayer = 1; function initBoard() { var boardDiv = document.getElementById('board'); for (var i = 0; i < ROWS; i++) { board[i] = []; for (var j = 0; j < COLS; j++) { var cell = document.createElement('div'); cell.className = 'cell'; cell.setAttribute('row', i); cell.setAttribute('col', j); cell.onclick = function() { playMove(this.getAttribute('row'), this.getAttribute('col')); }; boardDiv.appendChild(cell); board[i][j] = cell; } boardDiv.appendChild(document.createElement('br')); } } function playMove(row, col) { if (board[row][col].className != 'cell') { return; } board[row][col].className = 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); if (checkWin(row, col)) { alert('Player ' + currentPlayer + ' wins!'); resetGame(); } else { currentPlayer = currentPlayer == 1 ? 2 : 1; } } function checkWin(row, col) { var i, j, count; // 横向 count = 1; for (i = row - 1; i >= 0 && board[i][col].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i--, count++); for (i = row + 1; i < ROWS && board[i][col].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i++, count++); if (count >= 5) { return true; } // 纵向 count = 1; for (j = col - 1; j >= 0 && board[row][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); j--, count++); for (j = col + 1; j < COLS && board[row][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); j++, count++); if (count >= 5) { return true; } // 左上到右下 count = 1; for (i = row - 1, j = col - 1; i >= 0 && j >= 0 && board[i][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i--, j--, count++); for (i = row + 1, j = col + 1; i < ROWS && j < COLS && board[i][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i++, j++, count++); if (count >= 5) { return true; } // 右上到左下 count = 1; for (i = row - 1, j = col + 1; i >= 0 && j < COLS && board[i][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i--, j++, count++); for (i = row + 1, j = col - 1; i < ROWS && j >= 0 && board[i][j].className == 'cell ' + (currentPlayer == 1 ? 'black' : 'white'); i++, j--, count++); if (count >= 5) { return true; } return false; } function resetGame() { board.forEach(function(row) { row.forEach(function(cell) { cell.className = 'cell'; }); }); currentPlayer = 1; } initBoard(); </script> </body> </html> ``` 这个实现比较简单,只是实现了基本的下棋、判断胜负、重置游戏等功能。如果需要更完善的功能,还需要进一步完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天予不洗头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值