Добавление случайных чисел в массив
есть класс в котором генерируется таблица с ячейками Нужно в эту таблицу добавлять случайные числа от 0 до 9 включительно с помощью рандомной ф-ции
class Sudoku{
// шаг 19 добавм 81 0
constructor (initString = '00000000000000000000000000000000000000000000000000000000000000000000000000000000') {
// шаг 20 превратим в массив
const startValue = initString
.split('')
.filter(x => '0123456789'.includes(x))
// шаг 21 превратим в цифры
.map(x => Number(x))
console.log(startValue);
this.body = [];
// Зададим порядковый номер ячейки
let idCounter = 1;
// пройдемся по строкам
for (let y = 0; y < 9; y++) {
// пройдемся по столбцам
for (let x = 0; x < 9; x++) {
this.body.push({
id: idCounter,
x:x,
y:y,
number: startValue[idCounter -1], // отнимаем чтобы взять первую ячейку п позиции 0
// шаг 9 добавим классы для ячеек с фоуком и без
selected: false,
supported: false,
// шаг 27 добавим поле не важно
important: false,
// шаг 35
error: false,
// шаг 24 поле начала ячейки - является ли это поле началом ? startValue[idCounter -1]
started: startValue[idCounter -1] === 0 ? false : true,
s: parseInt(y / 3) * 3 + parseInt(x / 3)
});
idCounter++;
}
}
}
// Создадим ф-ции быстрого доступа к ячейкам и строка
getRow(n){
const row = [];
for(let i = 0; i < 9; i++){ // у нас 9 строк
row.push(this.body[9 * n + i]); // находим все эленты строки с номером n
}
return row;
}
getColum(n){
const column = [];
for (let i = 0; i < 9; i++) {
column.push(this.body[i * 9 + n]); // находим все эленты колонки с номером n
}
return column;
}
getSegment(n){
const segment = [];
// находми координаты x нашего сегмента
const x = n % 3;
// находми координаты y нашего сегмента
const y = parseInt(n / 3);
// пройдемся 3 раза по ячейкам сегметна dx dy - отклонения от наших ячеек внутри сегмента
for (let dy = 0; dy < 3; dy++) {
for (let dx = 0; dx < 3; dx++) {
segment.push(this.body[
y * 27 + dy * 9 + x * 3 + dx
]);
}
}
return segment;
}
// шаг 8 создаем ф-ции keydownHandler focusHandler blurHandler
keydownHandler(event, cell){
// шаг 26 проверим если ячейка не started
if(!cell.started){
// шаг 15 - сделаем так что бы можно было вводить только один символ цифру!
// console.log(event.key)
// сравниваем если это не одно из чисел
if("0123456789".includes(event.key)){
cell.number = parseInt(event.key)
// шаг 38 удалим error со всх ячеек
if(cell.error){
for(const item of this.body){
item.error = false
}
}
// шаг 34 сделаем невозможным повтор одинаковых цифр в одном сегменте
// добавим в свойствах объекта error
// пройдем по строкам
for(const item of this.getRow(cell.y)){
if(item === cell){
continue
}
if(item.number === cell.number){
item.error = true
cell.error = true
}
}
// тожу самое для ячеек
for(const item of this.getColum(cell.x)){
if(item === cell){
continue
}
if(item.number === cell.number){
item.error = true
cell.error = true
}
}
// тожу самое для сегмента
for(const item of this.getSegment(cell.s)){
if(item === cell){
continue
}
if(item.number === cell.number){
item.error = true
cell.error = true
}
}
}
// шаг 23 добавм возможность удалять цифры
else if(["Backspace", "Delete"].includes(event.key)){
cell.number = 0
// шаг 28 пройдемся по всем ячейкам и уберем important
for(const item of this.body){
item.important = false
}
if(cell.number){
for(const item of this.body){
// если совпадает то делаем true
if(item.number === cell.number){
item.important = true
}
}
}
}
}
// console.log("keydownHandler", event, cell)
event.preventDefault() // отменяет все дейсвия
this.veiwUpdate()
}
focusHandler(event, cell){
// console.log("focusHandler", event, cell)
cell.selected = true
// шаг 11 проходим по всем срокам
for(const item of this.getRow(cell.y)){
item.supported = true
}
// шаг 12 проходим по всем колонкам
for(const item of this.getColum(cell.x)){
item.supported = true
}
// шаг 33 проходим по всем ячейкам
if(cell.number){
for(const item of this.body){
if(item.number === cell.number){
item.important = true
}
}
}
this.veiwUpdate();
}
blurHandler(event, cell){
// console.log("blurHandler", event, cell)
// шаг 14 ставим false
cell.selected = false
// шаг 32 так как мы проходим по всем ячейкам можно удалить два цикла for
// for(const item of this.getRow(cell.y)){
// item.supported = false
// }
// for(const item of this.getColum(cell.x)){
// item.supported = false
// }
// шаг 37 удалим error полсе снятия фокуса
if(cell.error){
cell.number = 0
}
// шаг 31 обходим все ячейки
for(const cell of this.body){
cell.important = false
cell.supported = false
cell.error = false
}
this.veiwUpdate();
}
// Создадим структуру html doc
getHTML(size){ // размер нашего поля
// шаг 6 создадим инпуты
// item - элемент массива
for(const item of this.body){
const imputElement = document.createElement('input');
imputElement.classList.add("sudoku-cell");
imputElement.setAttribute('type', 'text');
// шаг 7 прослушаем нашу ячейку
// нам нежен keydown focus blur
imputElement.addEventListener('keydown', event => this.keydownHandler(event, item))
imputElement.addEventListener('focus', event => this.focusHandler(event, item))
imputElement.addEventListener('blur', event => this.blurHandler(event, item))
// шаг 25 проверим если ячейка started добавляем класс
if(item.started){
imputElement.classList.add("start-cell")
}
item.element = imputElement;
}
const rootElement = document.createElement('div');
rootElement.classList.add("sudoku-game");
// Добавим высоту ширину и размер шрифта
rootElement.style.width = `${size}px`
rootElement.style.height = `${size}px`
rootElement.style["font-size"] = `${size / 20}px`
// шаг 4 создаем 9 сегментов
for (let s = 0; s < 9; s++) {
const segmentElement = document.createElement('div')
segmentElement.classList.add("sudoku-segment")
// шаг 6 пройдемся по ячейкам сегметна
// cell - клетка судоку
for(const cell of this.getSegment(s)){
segmentElement.append(cell.element)
}
rootElement.append(segmentElement);
}
// шаг 22 отобразим содержимое ячеек содержимое
this.veiwUpdate();
return rootElement;
}
veiwUpdate(){
// шаг 13 проходим по всем ячейкам
for(const cell of this.body){
// шаг 30 удалим класс important-cell у всех ячеек
// шаг 35 удалим класс error
cell.element.classList.remove("error", "important-cell", "supported-cell", "selected-cell")
// шаг 16
cell.element.value = cell.number ? cell.number : ''
// добавим условия елси ячейка supported
if(cell.supported){
cell.element.classList.add("supported-cell")
}
if(cell.selected){
cell.element.classList.add("selected-cell")
}
// шаг 29 добавим класс
if(cell.important){
cell.element.classList.add("important-cell")
}
// шаг 36
if(cell.error){
cell.element.classList.add("error")
}
}
}
}
Рандомная функция
function getRandom(min, max){
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor( Math.random() * (max - min) ) + min;
}
console.log( getRandom(0, 10) );
файл в котором вызывается класс
const sudoku = new Sudoku(`
5 0 3 0 0 4 6 7 0
0 9 0 2 5 0 8 3 1
0 0 2 6 0 3 0 0 9
0 2 0 3 7 0 0 1 5
0 0 8 0 2 0 7 6 0
3 0 0 5 6 0 0 0 0
4 6 0 0 0 0 1 0 7
2 8 1 0 4 0 0 0 0
0 0 5 0 9 0 0 8 0
`)
document
.querySelector('#app')
.append(sudoku.getHTML(750)); // 500
============================= задача 1. запушить в массив целые числа от 0 до 9 Заполнить массив числами на 50% на 30% и на 75% как это правильно сделать? у кого какие идеии )) Спасибо заранее
Ответы (1 шт):
Если я правильно понял, то тебе нужно заполнить массив на 30%, 50%, 75% etc. числами отличными от нуля? Если да, то предлагаю такой вариант: Сначала заполняешь массив числами отличными от нуля, после этого заменяешь нужное количество значений на нули.
function zeroFill (arr, percent) {
return arr.map(function(item) {
if (Math.floor(Math.random() * 100 ) >= percent) {
return 0;
}
return item;
});
}
ну и собственно вызываешь функцию, где первый аргумент твой массив с числами, а второй процент заполненности массива числами отличными от нуля. В функцию рандомного получения числа для массива, в параметр min передаешь число 1 , а не 0;