uniapp js 数独小游戏 n*n 看控制台的打印
game.vue
<template>
<view> 4567</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { onShow } from '@dcloudio/uni-app'
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) => {
if (sdNum.value != 9) {
return checkRow(arr, row) && checkLine(arr, col)
} else {
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 < 8; i++) {
if (arr[j + Math.floor(i / 3)][k + (i % 3)] === 0) {
continue
}
for (let m = i + 1; m < 9; 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) => {
// 随机隐藏的个数 randomNum
// const randomNum = Math.floor(Math.random() * 30) + 50
const randomNum = Math.floor(Math.random() * 10) + 4
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>