微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】


Posted in Javascript onFebruary 20, 2019

本文实例讲述了微信小程序五子棋游戏的棋盘,重置,对弈实现方法。分享给大家供大家参考,具体如下:

DEMO下载

效果图

微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】

分析

1. 采用微信小程序的canvas制作五子棋;
2. 确定棋盘大小及格数;
3. 绘制棋盘—-通过棋盘宽高和格数计算间距,同时保存坐标点;
4. 黑方和白方下子—-定义一个布尔变量代表各自的身份;
5. 重置棋盘—-重新开始;
6. 通过判断当前棋手,悔棋时进行改变。

绘制棋盘

drawLine(arr){
 arr.forEach(current => {
  this.ctx.setFillStyle(this.lineColor);
  this.ctx.beginPath();
  this.ctx.lineWidth = 1;
  this.ctx.moveTo(current[0].x, current[0].y);
  for (var i = 1; i < current.length; i++) {
  this.ctx.lineTo(current[i].x, current[i].y);
  }
  this.ctx.stroke();
  this.ctx.closePath();
  this.ctx.draw(true);
 });
 }
 drawChessboard(){
 // 每个格子的宽高
 var everyLen = this.everyLen;
 // 标记坐标的个数
 var count = 0;
 // 从纵向保存坐标
 var arrY = [];
 // 双循环计算每个坐标的横纵坐标
 for(var i = 0;i <= this.type; i++){
  var arr = [],arr0 = [];
  for(var j = 0;j <= this.type; j++){
  count++;
  arr.push({
   y: this.margin + i * everyLen,
   x: this.margin + j * everyLen,
   pointX: j,
   pointY: i,
   index: count
  });
  arr0.push({
   x: this.margin + i * everyLen,
   y: this.margin + j * everyLen
  })
  }
  // 清空canvas
  this.ctx.clearRect(0, 0, this.width, this.height);
  // 保存横线坐标和竖线坐标
  this.everyPoint.push(arr);
  arrY.push(arr0);
 }
 // 绘制横向线
 this.drawLine(this.everyPoint);
 // 绘制竖向线
 this.drawLine(arrY);
 }

绘制当前点击坐标的棋子

// 获取当前点击位置的坐标
 getPosition(e){
 return {
  x: e.touches[0].x,
  y: e.touches[0].y
 };
 }
 // 将当前坐标和棋盘坐标数组对比,找到精确坐标
 checkPoint(arr,po){
 for (var i = 0; i < this.everyPoint.length; i++){
  for (var j = 0; j < this.everyPoint[i].length; j++){
  if (Math.abs(this.everyPoint[i][j].x - po.x) < this.everyLen/2 && Math.abs(this.everyPoint[i][j].y - po.y) < this.everyLen/2){
   // 将棋盘精确坐标保存到当前持棋方数组
   arr.push(this.everyPoint[i][j]);
   // 同时删除棋盘坐标数组的该值,表示当前位置已经存在棋子
   this.everyPoint[i].splice(j,1);
   break;
  }
  }
 }
 }
 // 绘制当前坐标棋子
 drawCle(opts,color){
 this.ctx.setFillStyle(color);
 this.ctx.beginPath();
 this.ctx.arc(opts.x, opts.y, this.r, 0, Math.PI * 2, true);
 this.ctx.closePath();
 this.ctx.fill();
 this.ctx.draw(true);
 }
 drawLastPoint(type){
 // 判断是黑方持棋还是白方持棋,进行绘制棋子
 if(type == 'AI'){
  this.AIPoint.forEach((current, index) => {
  this.drawCle(current, '#000000');
  });
 }else{
  this.myPoint.forEach((current, index) => {
  this.drawCle(current, '#ffffff');
  });
 }
 }
 this.page.changeTouchStart = function (e) {
  // 判断游戏是否开始
  if (self.START_GAME){
  // 获取当前坐标
  var newPo = self.getPosition(e);
  // 获取棋盘精确坐标
  if (!self.boolAI && self.boolMy) {
   self.checkPoint(self.myPoint, newPo);
  } else if (self.boolAI && !self.boolMy) {
   self.checkPoint(self.AIPoint, newPo);
  }
  }
 }
 this.page.changeTouchEnd = function (e) {
  if (self.START_GAME) {
  // 绘制棋子
  if (!self.boolAI && self.boolMy) {
   self.boolAI = !self.boolAI;
   self.boolMy = !self.boolMy;
   self.drawLastPoint('PO');
   // 判断白棋是否五子胜利
   if (self.myPoint.length >= 5 && self.checkWinner(self.myPoint)){
   wx.showToast({title: '白棋胜利!'});
   self.START_GAME = false;
   }
  } else if (self.boolAI && !self.boolMy) {
   self.boolAI = !self.boolAI;
   self.boolMy = !self.boolMy;
   self.drawLastPoint('AI');
   // 判断黑棋是否五子胜利
   if(self.AIPoint.length >= 5 && self.checkWinner(self.AIPoint)){
   wx.showToast({ title: '黑棋胜利!' });
   self.START_GAME = false;
   }
  }
  }
 }

五子棋胜利方判断

五子棋胜利就是横向、纵向、45度斜线方向、135度斜线方向连成五个颜色相同的棋子,为了更加清楚的表示,我将四个方向的判断做四个函数处理。

checkTransverse(arr,po){//横向检查
 var len = arr.length - 1;
 var count = 1;
 // 东
 for(var i = 1; i < this.CHESS_LEN ; i++){
  for (var j = 0; j < len; j++){
  if(arr[j].pointX == po.pointX - i && arr[j].pointY == po.pointY){
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true;}
 // 西
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX + i && arr[j].pointY == po.pointY) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 }
 checkPortrait(arr,po){//纵向检查
 var len = arr.length - 1;
 var count = 1;
 // 南
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX && arr[j].pointY == po.pointY - i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 // 北
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX && arr[j].pointY == po.pointY + i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 }
 checkNortheast(arr,po){//45度
 var len = arr.length - 1;
 var count = 1;
 // 西南
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX - i && arr[j].pointY == po.pointY - i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 // 东北
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX + i && arr[j].pointY == po.pointY + i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 }
 checkNorthwest(arr,po){//135度
 var len = arr.length - 1;
 var count = 1;
 // 西北
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX - i && arr[j].pointY == po.pointY + i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 // 东南
 for (var i = 1; i < this.CHESS_LEN; i++) {
  for (var j = 0; j < len; j++) {
  if (arr[j].pointX == po.pointX + i && arr[j].pointY == po.pointY - i) {
   count++;
  }
  }
 }
 if (count == this.CHESS_LEN) { return true; }
 }
 checkWinner(arr){
 var currentPo = arr[arr.length - 1];
 var win1 = this.checkTransverse(arr, currentPo);
 var win2 = this.checkPortrait(arr, currentPo);
 var win3 = this.checkNortheast(arr, currentPo);
 var win4 = this.checkNorthwest(arr, currentPo);
 if (win1 || win2 || win3 || win4){
  return true;
 }else{
  return false;
 }
 }

重置棋盘

resetChessBoard(){
 this.page.setData({ isHide: false });
 this.init();
}
this.page.changeReset = function(e){
 self.resetChessBoard();
}

注意

1. 绘制棋盘前必须清空canvas,方便最后的重新开始和重置棋盘;
2. 对当前棋子的坐标四个方向的判断,采用的原始坐标而不是计算后的绘制坐标;
3. 在判断持棋人时,各自采用一个值,方便添加悔棋功能。

只是实现了简单的对下五子棋功能,后续添加悔棋、记分、记时等功能!

同时向判断胜利的函数可以合并为一进行优化!

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
js利用数组length属性清空和截短数组的小例子
Jan 15 Javascript
jquery中对于批量deferred的处理方法
Jan 22 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
jquery实现最简单的滑动菜单效果代码
Sep 12 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
jQuery常用选择器详解
Jul 17 jQuery
Angular5中调用第三方js插件的方法
Feb 26 Javascript
GOJS+VUE实现流程图效果
Dec 01 Javascript
vue模仿网易云音乐的单页面应用
Apr 24 Javascript
vue 虚拟DOM的原理
Oct 03 Javascript
详解关于element级联选择器数据回显问题
Feb 20 #Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 #Javascript
echarts实现词云自定义形状的示例代码
Feb 20 #Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 #Javascript
详解webpack 最简打包结果分析
Feb 20 #Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 #jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 #jQuery
You might like
PHP MSSQL 存储过程的方法
2008/12/24 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
sina的lightbox效果。
2007/01/09 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
js Date概念详细介绍
2013/11/22 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
vue-router定义元信息meta操作
2020/12/07 Vue.js
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
pandas apply多线程实现代码
2020/08/17 Python
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
小学师德师风演讲稿
2014/09/02 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
初中团委工作总结
2015/08/13 职场文书
爱国教育主题班会
2015/08/14 职场文书
详解MySQL的半同步
2021/04/22 MySQL