uni app 写了一个连连看

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3006

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 利用uni app 写了个连连看,还没有路径展示,由于近来工作比力忙,没有时间取完善。大佬看到了可以改改加上路径然后写到品评大概开源一下。(绘制的有坐标。注掉坐标代码即可)不喜勿喷,接待大佬完善
  1. <template>
  2.         <view class="container">
  3.                 <view class="grid">
  4.                         <view class="contentone">
  5.                                 <canvas class="canvas_cla" style="z-index: 1;" canvas-id="myCanvas" id="myCanvas"
  6.                                         @click="canvas_click"></canvas>
  7.                         </view>
  8.                 </view>
  9.         </view>
  10. </template>
  11. <script>
  12.         export default {
  13.                 data() {
  14.                         return {
  15.                                 datalist: [],
  16.                                 //行
  17.                                 rows: 18,
  18.                                 //列
  19.                                 clos: 10,
  20.                                 size: 35,
  21.                                 ctx: null,
  22.                                 firstclick: true,
  23.                                 clickdata: {},
  24.                                 twodata: {},
  25.                                 centerdata: {},
  26.                                 TowardEnum: {
  27.                                         NONE: null,
  28.                                         UP: {
  29.                                                 row: -1,
  30.                                                 clo: 0
  31.                                         },
  32.                                         RIGHT: {
  33.                                                 row: 0,
  34.                                                 clo: 1
  35.                                         },
  36.                                         DOWN: {
  37.                                                 row: 1,
  38.                                                 clo: 0
  39.                                         },
  40.                                         LEFT: {
  41.                                                 row: 0,
  42.                                                 clo: -1
  43.                                         }
  44.                                 },
  45.                         };
  46.                 },
  47.                 onReady() {
  48.                         this.ctx = uni.createCanvasContext('myCanvas');
  49.                         this.init()
  50.                 },
  51.                 methods: {
  52.                         canvas_click: function(e) {
  53.                                 let clickX = e.detail.x
  54.                                 let clickY = e.detail.y
  55.                                 for (var i = 0; i < this.datalist.length; i++) {
  56.                                         let data = this.datalist[i]
  57.                                         for (var j = 0; j < data.length; j++) {
  58.                                                 let item = data[j]
  59.                                                 if (item.name != "") {
  60.                                                         if (clickX > item.x && clickX < item.x + item.size) {
  61.                                                                 if (clickY > item.y && clickY < item.y + item.size) {
  62.                                                                         if (this.firstclick) {
  63.                                                                                 item.color = "#f00"
  64.                                                                                 this.firstclick = false
  65.                                                                                 this.clickdata = item
  66.                                                                                 console.log(JSON.stringify(item))
  67.                                                                                 this.drawpai()
  68.                                                                         } else {
  69.                                                                                 if (this.clickdata.code != item.code) {
  70.                                                                                         this.twodata = item
  71.                                                                                         this.firstclick = true
  72.                                                                                         item.color = "#f00"
  73.                                                                                         console.log(JSON.stringify(item))
  74.                                                                                         this.jisuan(item)
  75.                                                                                 }
  76.                                                                         }
  77.                                                                         return; // 点击后退出循环,避免重复处理
  78.                                                                 }
  79.                                                         }
  80.                                                 }
  81.                                         }
  82.                                 }
  83.                         },
  84.                         deleflag() {
  85.                                 for (var i = 0; i < this.datalist.length; i++) {
  86.                                         let data = this.datalist[i]
  87.                                         for (var j = 0; j < data.length; j++) {
  88.                                                 let item = data[j]
  89.                                                 if (item.name != "") {
  90.                                                         item.color = "#fff"
  91.                                                 }
  92.                                         }
  93.                                 }
  94.                                 this.drawpai()
  95.                         },
  96.                         jisuan: function(item) {
  97.                                 // 示例调用
  98.                                 if (this.checkLink(this.clickdata.row, this.clickdata.clo, 0, this.TowardEnum.NONE, [], 1)) { //可以消除
  99.                                         //相邻
  100.                                         this.clickdata.name = ""
  101.                                         this.clickdata.color = "#efefef"
  102.                                         item.name = ""
  103.                                         item.color = "#efefef"
  104.                                         this.drawpai()
  105.                                         console.log("消除")
  106.                                 } else {
  107.                                         this.deleflag()
  108.                                 }
  109.                         },
  110.                         getLocaiton: function(row, clo) {
  111.                                 return "" + row + "," + clo;
  112.                         },
  113.                         checkLink: function(row, clo, changeTimes, nowToward, path, flag) { //当前小方块,转弯次数,路径方向(0123上右下左),所过路径
  114.                                 if (this.twodata.row == row && this.twodata.clo == clo && changeTimes <= 3) {
  115.                                         console.log("消除", JSON.stringify(path))
  116.                                         return true;
  117.                                 }
  118.                                 if (changeTimes > 3 || row < 0 || clo < 0 || row > this.rows - 1 || clo > this.clos - 1 || path
  119.                                         .indexOf(this
  120.                                                 .getLocaiton(row, clo)) > -1 || (this.datalist[row][clo].name != '' && row != this.clickdata
  121.                                                 .row && clo != this.clickdata.clo)) {
  122.                                         path.pop();
  123.                                         // // 如果回溯到起点且没有找到路径,则返回false
  124.                                         // if (path.length === 0) {
  125.                                         //         return false;
  126.                                         // }
  127.                                         // console.log("33333333", JSON.stringify(path), row, clo, changeTimes, nowToward, )
  128.                                         // // 否则,尝试从上一个点向其他方向继续搜索
  129.                                         // let prevRow = parseInt(path[path.length - 1].split(',')[0]);
  130.                                         // let prevClo = parseInt(path[path.length - 1].split(',')[1]);
  131.                                         // console.log(prevRow, prevClo, row, clo)
  132.                                         // nowToward = this.getDirection(prevRow, prevClo, row, clo); // 计算当前应该尝试的方向
  133.                                         // console.log("44444444", nowToward)
  134.                                         // console.log("555555555", changeTimes + (nowToward === this.TowardEnum[
  135.                                         //         this.prevDirectionToCurrent(nowToward)] ? 0 : 1))
  136.                                         // console.log("666666", nowToward === this.TowardEnum[this.prevDirectionToCurrent(nowToward)] ? 0 :
  137.                                         //         1)
  138.                                         // return this.checkLink(prevRow, prevClo, changeTimes + (nowToward === this.TowardEnum[
  139.                                         //         this.prevDirectionToCurrent(nowToward)] ? 0 : 1), nowToward, path, 2);
  140.                                         return false;
  141.                                 }
  142.                                 if (flag == 2 && this.datalist[row][clo].name != '') {
  143.                                         path.pop();
  144.                                         return false;
  145.                                 }
  146.                                 // 递归调用checkLink函数,尝试四个方向
  147.                                 path.push(this.getLocaiton(row, clo));
  148.                                 return this.checkLink(row - 1, clo, nowToward === this.TowardEnum.UP ? changeTimes : changeTimes + 1,
  149.                                                 this.TowardEnum.UP, path, 2) // UP
  150.                                         ||
  151.                                         this.checkLink(row, clo + 1, nowToward === this.TowardEnum.RIGHT ? changeTimes : changeTimes + 1,
  152.                                                 this.TowardEnum.RIGHT, path, 2) // RIGHT
  153.                                         ||
  154.                                         this.checkLink(row + 1, clo, nowToward === this.TowardEnum.DOWN ? changeTimes : changeTimes + 1,
  155.                                                 this.TowardEnum.DOWN, path, 2) // DOWN
  156.                                         ||
  157.                                         this.checkLink(row, clo - 1, nowToward === this.TowardEnum.LEFT ? changeTimes : changeTimes + 1,
  158.                                                 this.TowardEnum.LEFT, path, 2); // LEFT
  159.                                 // path.push(this.getLocaiton(row, clo));
  160.                                 // return this.checkLink(row - 1, clo, nowToward == this.TowardEnum.UP ? changeTimes : changeTimes + 1,
  161.                                 //                 this.TowardEnum.UP, path, 2) //UP
  162.                                 //         ||
  163.                                 //         this.checkLink(row, clo + 1, nowToward == this.TowardEnum.RIGHT ? changeTimes : changeTimes + 1,
  164.                                 //                 this.TowardEnum.RIGHT, path, 2) //RIGHT
  165.                                 //         ||
  166.                                 //         this.checkLink(row + 1, clo, nowToward == this.TowardEnum.DOWN ? changeTimes : changeTimes + 1,
  167.                                 //                 this.TowardEnum.DOWN, path, 2) //DOWN
  168.                                 //         ||
  169.                                 //         this.checkLink(row, clo - 1, nowToward == this.TowardEnum.LEFT ? changeTimes : changeTimes + 1,
  170.                                 //                 this.TowardEnum.LEFT, path, 2) //LEFT
  171.                         },
  172.                         // 辅助函数:根据前一个点和当前点的位置计算方向
  173.                         getDirection: function(prevRow, prevClo, row, clo) {
  174.                                 console.log(prevRow, prevClo, row, clo)
  175.                                 if (row === prevRow && clo === prevClo + 1) return 'RIGHT';
  176.                                 if (row === prevRow && clo === prevClo - 1) return 'LEFT';
  177.                                 if (row === prevRow + 1 && clo === prevClo) return 'DOWN';
  178.                                 if (row === prevRow - 1 && clo === prevClo) return 'UP';
  179.                                 return null; // 不应该出现的情况
  180.                         },
  181.                         // 辅助函数:将字符串方向转换为枚举值
  182.                         prevDirectionToCurrent: function(direction) {
  183.                                 switch (direction) {
  184.                                         case 'RIGHT':
  185.                                                 return 'LEFT';
  186.                                         case 'LEFT':
  187.                                                 return 'RIGHT';
  188.                                         case 'DOWN':
  189.                                                 return 'UP';
  190.                                         case 'UP':
  191.                                                 return 'DOWN';
  192.                                         default:
  193.                                                 return null;
  194.                                 }
  195.                         },
  196.                         init: function() {
  197.                                 var values = ["A", "B", "C", "D", "E", "F", "G", "H"]
  198.                                 var datas = [];
  199.                                 for (var i = 0; i < this.rows - 2; i++) {
  200.                                         datas = datas.concat(values)
  201.                                 }
  202.                                 datas = this.shuffle(datas)
  203.                                 var datalist = []
  204.                                 for (var i = 0; i < this.rows; i++) {
  205.                                         var mydatas = []
  206.                                         for (var j = 0; j < this.clos; j++) {
  207.                                                 var data = {}
  208.                                                 if (i != 0 && j != 0 && i != this.rows - 1 && j != this.clos - 1) {
  209.                                                         let item = datas.pop()
  210.                                                         data.name = item
  211.                                                         data.y = i * this.size + 2
  212.                                                         data.x = j * this.size + 2
  213.                                                         data.size = this.size
  214.                                                         data.color = "#fff"
  215.                                                         data.row = i
  216.                                                         data.clo = j
  217.                                                         data.code = "m-" + i + "-" + j
  218.                                                 } else {
  219.                                                         data.name = ''
  220.                                                         data.y = i * this.size + 2
  221.                                                         data.x = j * this.size + 2
  222.                                                         data.size = this.size
  223.                                                         data.color = "#efefef"
  224.                                                         data.row = i
  225.                                                         data.clo = j
  226.                                                         data.code = "m-" + i + "-" + j
  227.                                                 }
  228.                                                 mydatas.push(data)
  229.                                         }
  230.                                         datalist.push(mydatas)
  231.                                 }
  232.                                 this.datalist = datalist
  233.                                 console.log(JSON.stringify(this.datalist))
  234.                                 this.drawpai()
  235.                         },
  236.                         drawpai: function() {
  237.                                 for (var i = 0; i < this.datalist.length; i++) {
  238.                                         let data = this.datalist[i]
  239.                                         for (var j = 0; j < data.length; j++) {
  240.                                                 let item = data[j]
  241.                                                 // 设置边框颜色、线宽和正方形大小
  242.                                                 this.ctx.setStrokeStyle('#fff');
  243.                                                 this.ctx.setLineWidth(4);
  244.                                                 // 绘制正方形边框
  245.                                                 // this.ctx.strokeRect(item.x, item.y, item.size, item.size);
  246.                                                 // 设置填充颜色和填充正方形
  247.                                                 this.ctx.setFillStyle(item.color); // 灰色填充
  248.                                                 this.ctx.fillRect(item.x, item.y, item.size - 4, item.size - 4); // 减去边框宽度以避免重叠
  249.                                                 // 设置文字样式和位置,并绘制文字
  250.                                                 this.ctx.setFontSize(10);
  251.                                                 this.ctx.setFillStyle('#000000'); // 文字颜色
  252.                                                 const text = item.name;
  253.                                                 const textWidth = this.ctx.measureText(text).width; // 测量文字宽度
  254.                                                 this.ctx.fillText(text, item.x + (item.size - textWidth) / 2, item.y + item.size / 2 +
  255.                                                         4); // 文字垂直居中,并稍微向下偏移以避免与边框重叠
  256.                                                 this.ctx.setFontSize(10);
  257.                                                 this.ctx.fillText(item.row + "-" + item.clo, item.x + 10, item.y +
  258.                                                         10); // 文字垂直居中,并稍微向下偏移以避免与边框重叠
  259.                                         }
  260.                                 }
  261.                                 // 将绘制内容绘制到 Canvas 上
  262.                                 this.ctx.draw()
  263.                         },
  264.                         //将数组打乱
  265.                         // 打乱数组的函数
  266.                         shuffle: function(array) {
  267.                                 let currentIndex = array.length,
  268.                                         temporaryValue, randomIndex;
  269.                                 // 当还剩有元素未洗牌时
  270.                                 while (0 !== currentIndex) {
  271.                                         // 选取一个剩下的元素
  272.                                         randomIndex = Math.floor(Math.random() * currentIndex);
  273.                                         currentIndex -= 1;
  274.                                         // 并与当前元素交换
  275.                                         temporaryValue = array[currentIndex];
  276.                                         array[currentIndex] = array[randomIndex];
  277.                                         array[randomIndex] = temporaryValue;
  278.                                 }
  279.                                 return array;
  280.                         },
  281.                         convertToArray2D: function(array1D, rows, clos) {
  282.                                 console.log(array1D.length, rows, clos)
  283.                                 if (array1D.length !== rows * clos) {
  284.                                         throw new Error('一维数组的长度必须与指定的行列数相乘的结果相等');
  285.                                 }
  286.                                 let array2D = [];
  287.                                 for (let i = 0; i < array1D.length; i += clos) {
  288.                                         array2D.push(array1D.slice(i, i + clos));
  289.                                 }
  290.                                 return array2D;
  291.                         },
  292.                 }
  293.         };
  294. </script>
  295. <style>
  296.         .canvas_cla {
  297.                 width: 100vw;
  298.                 height: 100vh;
  299.         }
  300.         .contentone {
  301.                 width: 100vw;
  302.                 height: 100vh;
  303.                 position: absolute;
  304.                 display: flex;
  305.                 justify-content: center;
  306.         }
  307. </style>
复制代码
 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表