#javascript
#javascript
Вопрос:
у меня есть этот Crosswordpuzzle, созданный javascript, и я хочу изменить данные этого массива с помощью object data, я попробовал это, но код выдает много ошибок, мне нужно поместить эти новые данные, потому что первые данные не содержат вопросов crossWordPuzzle. этот код :
crossWordPuzzle.js
const attemptsToFitWords = 5000;
const gridsToMake = 20;
const gridSize = 20;
let usedWords = [];
let generatedGrids = [];
let goodStartingLetters = new Set()
let slots = gridSize * gridSize;
let gridDiv = document.getElementById("grid");
let row = 0;
let column = 0;
for( let slot = 0; slot < slots; slot )
{
let div = document.createElement("input");
div.id = row "_" column;
div.classList.add("slot");
div.style.border = '1px solid #e9e9e9';
div.style.backgroundColor = '#e9e9e9';
gridDiv.appendChild(div);
column ;
if( column >= gridSize )
{
column = 0;
row ;
}
}
let createCrossWordPuzzle = function()
{
let attemptToPlaceWordOnGrid = function(grid, word)
{
let text = getAWordToTry();
for (let row = 0; row < gridSize; row)
{
for (let column = 0; column < gridSize; column)
{
word.text = text;
word.row = row;
word.column = column;
word.vertical = Math.random() >= 0.5;
if ( grid.isLetter( row, column ) )
{
if ( grid.update( word ) )
{
pushUsedWords( word.text );
return true;
}
}
}
}
return false;
}
let getAWordToTry = function()
{
let word = getRandomWord( words );
let goodWord = isGoodWord( word );
while ( usedWords.includes( word ) || !goodWord )
{
word = getRandomWord( words );
goodWord = isGoodWord( word );
}
return word;
}
let getBestGrid = function( grids )
{
let bestGrid = grids[ 0 ];
for(let grid of grids)
{
if ( grid.getIntersections() >= bestGrid.getIntersections() )
{
bestGrid = grid;
}
}
return bestGrid;
}
let isGoodWord = function( word )
{
let goodWord = false;
for(let letter of goodStartingLetters)
{
if( letter === word.charAt(0))
{
goodWord = true;
break;
}
}
return goodWord;
}
let generateGrids = function()
{
generatedGrids = [];
for ( let gridsMade = 0; gridsMade < gridsToMake; gridsMade )
{
let grid = new CrosswordPuzzle();
let word = new Word( getRandomWordOfSize( getUnusedWords(), 9 ),
0, 0, false );
grid.update(word);
pushUsedWords(word.text);
let continuousFails = 0;
for (let attempts = 0; attempts < attemptsToFitWords; attempts)
{
let placed = attemptToPlaceWordOnGrid( grid, word );
if( placed )
{
continuousFails = 0;
}
else
{
continuousFails ;
}
if( continuousFails > 470 )
{
break;
}
}
generatedGrids.push( grid );
if( grid.getIntersections() >= 4 )
{
break;
}
usedWords = [];
}
}
let displayCrosswordPuzzle = function( bestGrid )
{
for (let row = 0; row < gridSize; row)
{
for (let column = 0; column < gridSize; column)
{
let slot = document.getElementById(row "_" column);
if( bestGrid.isLetter(row, column))
{
slot.value = bestGrid.grid[row][column];
slot.style.borderBottom = '1px solid #9a8e9a';
slot.style.borderRight = '1px solid #9a8e9a';
slot.style.backgroundColor = 'rgb(102, 178, 255)';
}
else
{
slot.value = "";
slot.style.border = '1px solid #e9e9e9';
slot.style.backgroundColor = '#e9e9e9';
}
}
}
}
let pushUsedWords = function( text )
{
usedWords.push( text );
text.split('').filter( char => goodStartingLetters.add(char));
}
generateGrids();
let bestGrid = getBestGrid( generatedGrids );
displayCrosswordPuzzle( bestGrid );
}
function getUnusedWords()
{
return words.filter(val => !usedWords.includes(val));
}
function getRandomWordOfSize( wordList, wordSize )
{
let properLengthWords = wordList.filter(val => val.length >= wordSize );
return properLengthWords[getRandomInt(properLengthWords.length)]
}
function getRandomWord( wordList )
{
let words = getUnusedWords();
return words[getRandomInt(words.length)]
}
function getRandomInt( max )
{
return Math.floor(Math.random() * Math.floor(max));
}
console.log(usedWords);
crossWordPuzzleGenerator.js
function CrosswordPuzzle()
{
const emptyCell = '_';
let grid = Array.from(Array( gridSize ), () => new Array( gridSize ))
for( let row = 0; row < gridSize; row )
{
for( let column = 0; column < gridSize; column )
{
grid[row][column] = emptyCell;
}
}
let update = function( word )
{
let updated = false;
if( canBePlaced( word ))
{
addWord( word );
updated = true;
}
return updated;
}
let canBePlaced = function( word )
{
let canBePlaced = true;
if( isValidPosition( word.row, word.column ) amp;amp; fitsOnGrid( word ) )
{
let index = 0;
while( index < word.text.length )
{
let currentRow = word.vertical ? word.row index : word.row;
let currentColumn = !word.vertical ? word.column index : word.column;
if( ( word.text.charAt( index ) === grid[currentRow][currentColumn] ||
emptyCell === grid[currentRow][currentColumn] ) amp;amp;
placementLegal( word, currentRow, currentColumn) )
{
/* words */
let words = [
'احتمال',
'مصارع',
'متهور',
'تفكير',
'مستودع',
'رياضي',
'موقف',
'مقاوم',
'يطير',
'جميلة',
'تاريخ',
'مراكش',
'مستقبل',
'صاع',
'نافذة',
'متحرر',
'مفقود',
'مستطيل',
'سعادة',
'صيد',
'كلاب',
'دولار',
'ناقوس',
'مواطن',
'طرب',
'داخل',
'ذئب',
'طائر',
'ذهب',
'دماغ',
'مذهب',
'قائد',
'مسؤول',
'متعدد',
'يستاؤون',
'ولد',
'رؤوس',
'ريح',
'عقاب',
'طفلة',
'مجرة',
'جزيرة',
'تننين',
'فندق',
'حاسة',
'عرض',
'موقف',
'مغارة',
'يستورد',
'حزن',
'يوم',
'غرفة',
'محامي',
'قديس',
'اسود',
'يقاوم',
'حروف',
'احلام',
'اقطاعي',
'سترة',
'مديونية',
'استيراد',
'مقاتل',
'وساخة',
'انتقادات',
'عادل',
'لجين',
'مستعصية',
'جمارك',
'ريحان',
'مواقيت',
'ناموس',
'اعتيادي',
'جوعان',
'مغناطيس',
'استوزار',
'بنزين',
'رمز',
'تعاويذ',
'تمساح',
"قاطور",
"بنفسجي",
"استعدادات",
"اليمينيوم",
"كروموسومات",
"انتيخريسطوس",
"الأيام",
"إزميل",
"داروين",
"ليس",
"بلاستيك",
"لاتفيا",
"على",
"من",
"الى",
"من",
"السودان",
"في",
"غشت",
"شعبان",
"ريحان",
"حديد",
"طواف",
"رمادي",
"هيونداي",
"جمباز",
"نمر",
"اسرافيل",
"بطاطس",
"صفصاف",
"بطيخ",
"بطريق",
"قرش"
];
}
else
{
canBePlaced = false;
}
index ;
}
}
else
{
canBePlaced = false;
}
return canBePlaced;
}
let getIntersections = function()
{
let intersections = 0;
for (let row = 0; row < gridSize; row )
{
for (let column = 0; column < gridSize; column )
{
if ( isLetter( row, column ) )
{
if ( isValidPosition( row - 1, column ) amp;amp;
isValidPosition( row 1, column ) amp;amp;
isValidPosition( row, column - 1 ) amp;amp;
isValidPosition( row, column 1 ) amp;amp;
isLetter( row - 1, column ) amp;amp;
isLetter( row 1, column ) amp;amp;
isLetter( row, column - 1 ) amp;amp;
isLetter( row, column 1 ) )
{
intersections;
}
}
}
}
return intersections;
}
let placementLegal = function( word, row, column )
{
let illegal = false;
if( word.vertical )
{
illegal = isInterference( row, column 1, row 1, column ) ||
isInterference( row, column - 1, row 1, column ) ||
overwritingVerticalWord( row, column ) ||
invadingTerritory( word, row, column );
}
else
{
illegal = isInterference( row 1, column, row, column 1 ) ||
isInterference( row - 1, column, row, column 1 ) ||
overwritingHorizontalWord( row, column ) ||
invadingTerritory( word, row, column );
}
return !illegal;
}
let invadingTerritory = function( word, row, column )
{
let invading = false;
let empty = isEmptyCell( row, column )
if( word.vertical )
{
let weHaveNeighbors = ( doesCharacterExist( row, column - 1 ) ||
doesCharacterExist( row, column 1 ) ) ||
endOfWord( word, row, column ) amp;amp;
doesCharacterExist( row 1, column );
invading = empty amp;amp; weHaveNeighbors;
}
else
{
let weHaveNeighbors = ( doesCharacterExist( row - 1, column ) ||
doesCharacterExist( row 1, column ) ) ||
endOfWord( word, row, column ) amp;amp;
doesCharacterExist( row, column 1 );
invading = empty amp;amp; weHaveNeighbors;
}
return invading;
}
let endOfWord = function( word, row, column )
{
if( word.vertical )
{
return word.row word.text.length - 1 === row;
}
else
{
return word.column word.text.length - 1 === column;
}
}
let doesCharacterExist = function( row, column )
{
return isValidPosition( row, column ) amp;amp;
isLetter( row, column );
}
let overwritingHorizontalWord = function( row, column )
{
let leftColumn = column - 1;
return ( isValidPosition( row, leftColumn ) amp;amp;
isLetter( row, column ) amp;amp;
isLetter( row, leftColumn ) );
}
let overwritingVerticalWord = function( row, column )
{
let rowAbove = row - 1;
return ( isValidPosition( rowAbove, column ) amp;amp;
isLetter( row, column ) amp;amp;
isLetter( rowAbove, column ) );
}
let isInterference = function( row, column, nextRow, nextColumn )
{
return isValidPosition( row, column ) amp;amp;
isValidPosition( nextRow, nextColumn ) amp;amp;
isLetter( row, column ) amp;amp;
isLetter( nextRow, nextColumn );
}
let isLetter = function( row, column)
{
return grid[row][column] !== emptyCell;
}
let isEmptyCell = function( row, column )
{
return !isLetter( row, column );
}
let addWord = function( word )
{
for (let letterIndex = 0; letterIndex < word.text.length; letterIndex)
{
let row = word.row;
let column = word.column;
if ( word.vertical )
{
row = letterIndex;
}
else
{
column = letterIndex;
}
grid[row][column] = word.text.substring( letterIndex, letterIndex 1 );
}
}
let fitsOnGrid = function( word )
{
if( word.vertical )
{
return word.row word.text.length <= gridSize;
}
else
{
return word.column word.text.length <= gridSize;
}
}
let isValidPosition = function( row, column )
{
return row >= 0 amp;amp; row < gridSize amp;amp; column >= 0 amp;amp; column < gridSize;
}
return {
"grid": grid,
"update": update,
"isLetter": isLetter,
"getIntersections": getIntersections
};
}
word.js
function Word( text, row, column, vertical )
{
this.text = text;
this.row = row;
this.column = column;
this.vertical = vertical;
}
words.js
let words = [
'احتمال',
'مصارع',
'متهور',
'تفكير',
'مستودع',
'رياضي',
'موقف',
'مقاوم',
'يطير',
'جميلة',
'تاريخ',
'مراكش',
'مستقبل',
'صاع',
'نافذة',
'متحرر',
'مفقود',
'مستطيل',
'سعادة',
'صيد',
'كلاب',
'دولار',
'ناقوس',
'مواطن',
'طرب',
'داخل',
'ذئب',
'طائر',
'ذهب',
'دماغ',
'مذهب',
'قائد',
'مسؤول',
'متعدد',
'يستاؤون',
'ولد',
'رؤوس',
'ريح',
'عقاب',
'طفلة',
'مجرة',
'جزيرة',
'تننين',
'فندق',
'حاسة',
'عرض',
'موقف',
'مغارة',
'يستورد',
'حزن',
'يوم',
'غرفة',
'محامي',
'قديس',
'اسود',
'يقاوم',
'حروف',
'احلام',
'اقطاعي',
'سترة',
'مديونية',
'استيراد',
'مقاتل',
'وساخة',
'انتقادات',
'عادل',
'لجين',
'مستعصية',
'جمارك',
'ريحان',
'مواقيت',
'ناموس',
'اعتيادي',
'جوعان',
'مغناطيس',
'استوزار',
'بنزين',
'رمز',
'تعاويذ',
'تمساح',
"قاطور",
"بنفسجي",
"استعدادات",
"اليمينيوم",
"كروموسومات",
"انتيخريسطوس",
"الأيام",
"إزميل",
"داروين",
"ليس",
"بلاستيك",
"لاتفيا",
"على",
"من",
"الى",
"من",
"السودان",
"في",
"غشت",
"شعبان",
"ريحان",
"حديد",
"طواف",
"رمادي",
"هيونداي",
"جمباز",
"نمر",
"اسرافيل",
"بطاطس",
"صفصاف",
"بطيخ",
"بطريق",
"قرش"
];
мои новые данные words1.js
let words = [
{
qId: "01",
question: "من التماسيح",
value: "قاطور"
},
{
qId: "02",
question: "من الألوان",
value: "بنفسجي"
},
{
qId: "03",
question: "من كتب أحمد مصطفى",
value: "أنتيخريسطوس"
},
{
qId: "04",
question: "من كتب طه حسين",
value: "الأيام"
},
{
qId: "05",
question: "من أدوات النجارة",
value: "إزميل"
},
{
qId: "06",
question: "صحب نظرية التطور",
value: "داروين"
},
{
qId: "07",
question: "من أخوات كان",
value: "ليس"
},
{
qId: "08",
question: "مادة بترولية",
value: "بلاستيك"
},
{
qId: "09",
question: "دولة أروبية",
value: "لاتفيا"
},
{
qId: "10",
question: "من حروف الجر",
value: "على"
},{
qId: "11",
question: "من حروف الجر",
value: "من"
},
{
qId: "12",
question: "من حروف الجر",
value: "الى"
},
{
qId: "13",
question: "من حروف الجر",
value: "من"
},
{
qId: "14",
question: "دولة عربية",
value: "السودان"
},
{
qId: "15",
question: "من حروف الجر",
value: "في"
},
{
qId: "16",
question: "من الشهور الميلادية",
value: "غشت"
},
{
qId: "17",
question: "من الشهور العربية",
value: "شعبان"
},
{
qId: "18",
question: "من الورود",
value: "ريحان"
},
{
qId: "19",
question: "من المعادن",
value: "حديد"
},
{
qId: "20",
question: "من مناسك الحج",
value: "طواف"
},{
qId: "21",
question: "من الألوان",
value: "رمادي"
},
{
qId: "22",
question: "من السيارات",
value: "هيونداي"
},
{
qId: "23",
question: "من الرياضات",
value: "جمباز"
},
{
qId: "24",
question: "من السنوريات",
value: "نمر"
},
{
qId: "25",
question: "من الملائكة",
value: "اسرافيل"
},
{
qId: "26",
question: "من الخضر",
value: "بطاطس"
},
{
qId: "27",
question: "من الأشجار",
value: "صفصاف"
},
{
qId: "28",
question: "من الفواكه",
value: "بطيخ"
},
{
qId: "29",
question: "من االطيور",
value: "بطريق"
},
{
qId: "30",
question: "من االاسماك",
value: "قرش"
}
]
Комментарии:
1. Добро пожаловать в SO, вы упомянули, что получаете много ошибок. Какие ошибки вы получаете?
2. crosswordpuzzle.js:359 Неперехваченная ошибка типа: не удается прочитать свойство ‘length’ неопределенного
3. в fitsOnGrid (crosswordpuzzle.js:359) в canBePlaced (crosswordpuzzle.js:28) в Object.update (crosswordpuzzle.js:16)
4. в generateGrids (crosswordpuzzlegenerator.js: 106) в createCrossWordPuzzle (crosswordpuzzlegenerator.js:166) в HTMLButtonElement.onclick (crosswordpuzzlegenerator.html:17)
5. Чао, я понимаю вашу проблему: по сути, вам нужно изменить все строки, в которых вы вызываете
words.filter
, на что-то, что принимает новую форму данных. Но таким образом помочь вам невозможно. Слишком много кода для отладки. У вас есть репозиторий github для совместного использования? codesandbox? Есть с чем поработать…