File indexing completed on 2024-04-28 15:07:51
0001 /* GCompris - GnumchEquality.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Manuel Tondeur <manueltondeur@gmail.com> 0004 * 0005 * Authors: 0006 * Joe Neeman (spuzzzzzzz@gmail.com) (GTK+ version) 0007 * Manuel Tondeur <manueltondeur@gmail.com> (Qt Quick port) 0008 * 0009 * SPDX-License-Identifier: GPL-3.0-or-later 0010 */ 0011 .pragma library 0012 .import QtQuick 2.12 as Quick 0013 .import "qrc:/gcompris/src/core/core.js" as Core 0014 0015 var numberOfLevel 0016 var main 0017 var bonus 0018 var type 0019 var operator 0020 var modelCells 0021 var levels 0022 var useMultipleDataset 0023 var items 0024 var primeNumbers = [2, 3, 5, 7, 11, 13, 17, 19, 23] 0025 0026 function start(items_, type_, useMultipleDataset_) { 0027 items = items_ 0028 levels = items.levels 0029 useMultipleDataset = useMultipleDataset_ 0030 bonus = items.bonus 0031 type = type_ 0032 operator = items.operator 0033 modelCells = items.modelCells 0034 numberOfLevel = (useMultipleDataset) ? levels.length : 8 0035 items.currentLevel = Core.getInitialLevel(numberOfLevel) 0036 } 0037 0038 function stop() { 0039 } 0040 0041 function initLevel() { 0042 if(type === "equality" || type === "inequality") { 0043 operator = levels[items.currentLevel].operator 0044 } 0045 fillAllGrid(); 0046 } 0047 0048 function nextLevel() { 0049 items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel); 0050 } 0051 0052 function previousLevel() { 0053 items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel); 0054 } 0055 0056 function getGoal() { 0057 var goal = 0 0058 if (useMultipleDataset) { 0059 goal = levels[items.currentLevel].goal 0060 } 0061 else { 0062 if (type == "multiples") { 0063 goal = items.currentLevel + 2 0064 } else if (type == "factors") { 0065 var goalsFactor = [4, 6, 8, 10, 12, 15, 18, 20] 0066 goal = goalsFactor[items.currentLevel] 0067 } else if (type == "primes") { 0068 goal = primeNumbers[items.currentLevel + 1] + 1 0069 } 0070 } 0071 0072 return goal 0073 } 0074 0075 function genNumber() { 0076 if (Math.random() < 0.5) { 0077 // Choose a good number 0078 return (getGoal()) 0079 } else { 0080 // Choose a bad number 0081 var sign = Math.random() - 0.5 0082 sign = sign / Math.abs(sign) 0083 var number = getGoal() + (sign * Math.floor(((Math.random() * (getGoal() - 1)) + 1))) 0084 return number 0085 } 0086 } 0087 0088 function genMultiple() { 0089 var number = getGoal() * Math.floor(Math.random() * 6 + 1) 0090 if (Math.random() < 0.5) { 0091 // Choose a good number 0092 return number 0093 } else { 0094 // Choose a bad number 0095 return number - 1 0096 } 0097 } 0098 0099 function genFactor() { 0100 var goodOnes = [] 0101 var badOnes = [] 0102 for (var div = 1; div < getGoal() + 1; ++div) { 0103 if (getGoal() % div == 0) { 0104 goodOnes.push(div) 0105 } else { 0106 badOnes.push(div) 0107 } 0108 } 0109 0110 if (Math.random() < 0.5) { 0111 // Choose a good number 0112 return goodOnes[Math.floor(Math.random() * goodOnes.length)] 0113 } else { 0114 // Choose a bad number 0115 return badOnes[Math.floor(Math.random() * badOnes.length)] 0116 } 0117 } 0118 0119 function genPrime() { 0120 var badNumbers = [1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22] 0121 if (Math.random() < 0.5) { 0122 // Choose a good number 0123 var goodOnes = [] 0124 for (var it = 0; it < primeNumbers.length; ++it) { 0125 if (getGoal() < primeNumbers[it]) 0126 break 0127 0128 goodOnes.push(primeNumbers[it]) 0129 } 0130 return goodOnes[Math.floor(Math.random() * goodOnes.length)] 0131 } else { 0132 // Choose a bad number 0133 var badOnes = [] 0134 for (var it = 0; it < badNumbers.length; ++it) { 0135 if (getGoal() < badNumbers[it]) 0136 break 0137 0138 badOnes.push(badNumbers[it]) 0139 } 0140 return badOnes[Math.floor(Math.random() * badOnes.length)] 0141 } 0142 } 0143 0144 function genTime() { 0145 // generate a time in millisecond between 3,000 and 10,000 0146 var time = Math.floor(((Math.random() * 10) + 3)) * 1000 0147 return time 0148 } 0149 0150 function splitDivisionNumber(term) { 0151 var term1 = term * Math.floor(Math.random() * 6 + 1) 0152 var term2 = term1 / term 0153 0154 return [term1, term2] 0155 } 0156 0157 function splitMultiplicationNumber(term) { 0158 var factors = [] 0159 for (var div = 1; div < term + 1; ++div) { 0160 if (getGoal() % div == 0) { 0161 factors.push(div) 0162 } 0163 } 0164 var term1 = factors[Math.floor(Math.random() * factors.length)] 0165 var term2 = Math.floor(term / term1); 0166 0167 if (Math.random() < 0.5) { 0168 return [term1, term2] 0169 } else { 0170 return [term2, term1] 0171 } 0172 } 0173 0174 0175 function splitPlusNumber(term) { 0176 // Check if the term is odd 0177 var odd = term % 2 0178 0179 var term1 = Math.floor(term / 2) 0180 var term2 = term1 + odd 0181 0182 // Shift randomly the terms 0183 var shift = Math.floor((Math.random() * term1)) 0184 term1 += shift 0185 term2 -= shift 0186 0187 // Switch randomly the terms 0188 if (Math.random() < 0.5) { 0189 return [term1, term2] 0190 } else { 0191 return [term2, term1] 0192 } 0193 } 0194 0195 function splitMinusNumber(term) { 0196 var term1 = term 0197 var term2 = 0 0198 0199 // Shift randomly the terms 0200 var shift = Math.floor((Math.random() * (term + 1))) 0201 term1 += shift 0202 term2 += shift 0203 0204 return [term1, term2] 0205 } 0206 0207 function genPosition(direction, cellWidth, cellHeight) { 0208 var randomNumber = Math.floor(Math.random() * 5) 0209 0210 if (direction == 0) { 0211 return [6 * randomNumber, 0, cellHeight * randomNumber] 0212 } else if (direction == 2) { 0213 return [randomNumber, cellWidth * randomNumber, 0] 0214 } else if (direction == 1) { 0215 return [6 * randomNumber + 5, cellWidth * 5, cellHeight * randomNumber] 0216 } else if (direction == 3) { 0217 return [30 + randomNumber, cellWidth * randomNumber, cellHeight * 5] 0218 } 0219 } 0220 0221 function genMonster() { 0222 var monsters = ["Reggie", "Diaper", "Eater", "Fraidy", "Smarty", "Reggie"] 0223 var allowedMonsters = items.currentLevel % 7 0224 return monsters[Math.floor(Math.random()*allowedMonsters)] 0225 } 0226 0227 function fillAllGrid() { 0228 modelCells.clear() 0229 if (type == "equality" || type == "inequality") { 0230 for (var it = 0; it < 36; it++) { 0231 var terms 0232 if (operator === " + ") { 0233 terms = splitPlusNumber( 0234 genNumber()) 0235 } else if (operator === " - ") { 0236 terms = splitMinusNumber( 0237 genNumber()) 0238 } else if(operator === " * ") { 0239 terms = splitMultiplicationNumber( 0240 genNumber()) 0241 } else if(operator === " / ") { 0242 terms = splitDivisionNumber( 0243 genNumber()) 0244 } 0245 0246 modelCells.append({ 0247 number1: terms[0], 0248 number2: terms[1], 0249 show: true 0250 }) 0251 } 0252 } else if (type == "primes") { 0253 for (var it = 0; it < 36; it++) { 0254 modelCells.append({"number1": genPrime(), "number2": -1, "show": true}); 0255 } 0256 } else if (type == "factors") { 0257 for (var it = 0; it < 36; it++) { 0258 modelCells.append({"number1": genFactor(), "number2": -1, "show": true}); 0259 } 0260 } else if (type == "multiples") { 0261 for (var it = 0; it < 36; it++) { 0262 modelCells.append({"number1": genMultiple(), "number2": -1, "show": true}); 0263 } 0264 } 0265 } 0266 0267 function isExpressionEqualsToGoal(position){ 0268 if (operator === " + ") { 0269 if ((modelCells.get(position).number1 + modelCells.get( 0270 position).number2) == (getGoal())) { 0271 return true 0272 } else { 0273 return false 0274 } 0275 } else if (operator === " - ") { 0276 if ((modelCells.get(position).number1 - modelCells.get( 0277 position).number2) == (getGoal())) { 0278 return true 0279 } else { 0280 return false 0281 } 0282 } else if (operator === " * ") { 0283 if ((modelCells.get(position).number1 * modelCells.get( 0284 position).number2) === (getGoal())) { 0285 return true 0286 } else { 0287 return false 0288 } 0289 } else if (operator === " / ") { 0290 if ((modelCells.get(position).number1 / modelCells.get( 0291 position).number2) === (getGoal())) { 0292 return true 0293 } else { 0294 return false 0295 } 0296 } 0297 } 0298 0299 function isAnswerCorrect(position) { 0300 if (type === "equality") { 0301 return isExpressionEqualsToGoal(position) 0302 } else if (type === "inequality") { 0303 return (!isExpressionEqualsToGoal(position)) 0304 } else if (type === "multiples") { 0305 if ((modelCells.get(position).number1 / getGoal()) % 1 == 0) { 0306 return true 0307 } else { 0308 return false 0309 } 0310 } else if (type === "factors") { 0311 if ((getGoal() / modelCells.get(position).number1) % 1 == 0) { 0312 return true 0313 } else { 0314 return false 0315 } 0316 } else if (type == "primes") { 0317 for (var it = 0; it < primeNumbers.length; ++it) { 0318 if (primeNumbers[it] == modelCells.get(position).number1) 0319 return true 0320 } 0321 return false 0322 } 0323 }