uniapp js 数独小游戏 9*9 (自己看控制台打印)

<template>
  <view> 4567</view>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
// import { taskDetail, memberInfo } from '@/api/hmm'
// import store from '@/store'
// import { transformTimeTwo } from '@/utils/hmm'
const sdNum = ref(9)
const rowList = ref([])
const rowListNew = ref([])
const rightList = ref([])
onShow(() => {
  generateShuDu()
})
// 初始化数独
const generateArr = () => {
  const arr = []
  for (let i = 0; i < sdNum.value; i++) {
    arr[i] = []
    for (let j = 0; j < sdNum.value; j++) {
      arr[i][j] = 0
    }
  }
  console.log(arr)
  return arr
}
// 生成1-9的随机整数
const generateRandom = () => {
  //   return Math.floor(Math.random() * 9 + 1)
  return Math.floor(Math.random() * sdNum.value + 1)
}
const generateShuDu = () => {
  const arr = generateArr()
  console.log(11122233)
  console.log(arr)

  //生成数独
  for (let i = 0; i < sdNum.value; i++) {
    let time = 0
    for (let j = 0; j < sdNum.value; j++) {
      arr[i][j] = time === sdNum.value ? 0 : generateRandom()
      if (arr[i][j] === 0) {
        // 不是第一列,则倒退一列
        if (j > 0) {
          j -= 2
          continue
        } else {
          // 是第一列,则倒退到上一行的最后一列
          i--
          j = Number(sdNum.value) - 1
          continue
        }
      }
      if (isCorret(arr, i, j)) {
        time = 0 // 初始化time,为下一次填充做准备
      } else {
        time++ // 次数增加1
        j-- // 继续填充当前格
      }
    }
  }
  rightList.value = JSON.parse(JSON.stringify(arr))
  console.log('rightList')
  console.log(rightList.value)

  //  随机删除部分数独内容
  delSomeList(arr)
}
// 是否满足行、列和3X3区域不重复的要求
const isCorret = (arr, row, col) => {
  return checkRow(arr, row) && checkLine(arr, col) && checkNine(arr, row, col)
}
// 检测行是否符合标准
const checkRow = (arr, row) => {
  for (let j = 0; j < Number(sdNum.value) - 1; j++) {
    if (arr[row][j] === 0) {
      continue
    }
    for (let k = j + 1; k < sdNum.value; k++) {
      if (arr[row][j] === arr[row][k]) {
        return false
      }
    }
  }
  return true
}
// 检测列是否符合标准
const checkLine = (arr, col) => {
  for (let j = 0; j < Number(sdNum.value) - 1; j++) {
    if (arr[j][col] === 0) {
      continue
    }
    for (let k = j + 1; k < sdNum.value; k++) {
      if (arr[j][col] === arr[k][col]) {
        return false
      }
    }
  }
  return true
}
// 检测3X3是否符合标准
const checkNine = (arr, row, col) => {
  // 获得左上角的坐标
  const j = Math.floor(row / 3) * 3
  const k = Math.floor(col / 3) * 3
  // 循环比较
  for (let i = 0; i < Number(sdNum.value) - 1; i++) {
    if (arr[j + Math.floor(i / 3)][k + (i % 3)] === 0) {
      continue
    }
    for (let m = i + 1; m < sdNum.value; m++) {
      if (
        arr[j + Math.floor(i / 3)][k + Math.round(i % 3)] ===
        arr[j + Math.floor(m / 3)][k + Math.round(m % 3)]
      ) {
        return false
      }
    }
  }
  return true
}
// 随机删除部分数独内容
const delSomeList = (arr) => {
  //   const randomNum = Math.floor(Math.random() * 30) + 50
  //   for (let a = 0; a < randomNum; a++) {
  //     const i = Math.floor(Math.random() * sdNum.value)
  //     const j = Math.floor(Math.random() * sdNum.value)
  //     arr[i][j] = ''
  //   }
  rowList.value = JSON.parse(JSON.stringify(arr))
  rowListNew.value = JSON.parse(JSON.stringify(arr))
  console.log(111)
  console.log(rowList.value)
  console.log(rowListNew.value)
}
</script>

<style lang="scss"></style>
posted @   风雪中de冲破  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示