点をクリックして楽しもう。
遊び方は、あえてプレイヤーにお任せします。
設計
あらかじめ作成したオブジェクトは、数値オブジェクトnumberのみで、その他のオブジェクトは、全てJavaScriptを通じて作成・削除・変更を制御しています。ただし、下記URLの音素材は、事前にアップロードしておきました。
https://www.geogebra.org/material/show/id/zzxwytqu
function getExistingObjIndex(headName,objType){
var allObjNames = ggbApplet.getAllObjectNames(objType);
var targets =allObjNames.filter(function(item){
if(item.indexOf(headName)!=-1) return true;
});
targets.map( function(value, index, array){
array[index] = eval(value.substr(headName.length));
});
return targets;
}
function deleteExistingObj(headName,objType){
var targets = getExistingObjIndex(headName,objType);
for(var k = 0; k < targets.length; k++){
ggbApplet.deleteObject(headName+targets[k]);
}
}
function setSequenceDynamicColor(headName, objType, redScript, greenScript, blueScript, index){
var targets = getExistingObjIndex(headName,objType);
index = RegExp(index,'g');
for(var k = 0; k < targets.length; k++){
ggbApplet.evalCommand('SetDynamicColor['+headName+''+targets[k]+', '+redScript.replace(index,targets[k])+', '+greenScript.replace(index,targets[k])+', '+blueScript.replace(index,targets[k])+']');
}
}
function setGgbScript(objName, handler, script){
var isexist = ggbApplet.exists(objName);
if(isexist){
var objType = ggbApplet.getObjectType(objName);
var onwhat = (handler=='click') ? 'val' : 'onUpdate';
var xmlText = '<element type=\"'+objType+'\" label=\"'+objName+'\"><ggbscript '+onwhat+'=\"'+script+'\"/></element>';
ggbApplet.evalXML(xmlText);
}
}
function setSequenceGgbScript(headName, objType, handler, script, index){
var targets = getExistingObjIndex(headName,objType);
index = RegExp(index,'g');
for(var k = 0; k < targets.length; k++){
setGgbScript(headName+targets[k], handler, script.replace(index,targets[k]));
}
}
function evalSequenceCommand(command,index,time){
index = RegExp(index,'g');
for(var k = 1; k<=time; k++){
ggbApplet.evalCommand(command.replace(index,k));
}
}
function makePOINTs(number){
var radius = 4;
evalSequenceCommand('POINTα=CopyFreeObject[Rotate[(0,'+radius+'),2 π*α /'+number+']]', 'α', number);
}
function makeBOOLs(number){
evalSequenceCommand('BOOLα=true', 'α', number);
}
function isFuncWell(){
var result=0;
var targets = getExistingObjIndex('FUNC','list');
for(var k = 0; k<targets.length; k++)
result += ggbApplet.getValue('Product[FUNC'+targets[k]+']');
if(result==0){return false;}
else{return true;}
}
function makeFUNCs(number){
do {
evalSequenceCommand('FUNCα=CopyFreeObject[Sequence[If[t==α,true,RandomElement[{true, false}]], t, 1, '+number+']]', 'α', number);
} while (isFuncWell())
}
function deleteWorld(){
deleteExistingObj('POINT','point');
deleteExistingObj('BOOL','boolean');
deleteExistingObj('FUNC','list');
deleteExistingObj('SEG','segment');
}
function createWorld(){
var number = ggbApplet.getValue('number');
makePOINTs(number);
makeBOOLs(number);
makeFUNCs(number);
for(var point1 =1; point1<number; point1++){
for(var point2 = 2; point2<=number; point2++){
if(point1!=point2){
ggbApplet.evalCommand('SEG'+point1+'and'+point2+'=Segment[POINT'+point1+',POINT'+point2+']');
ggbApplet.evalCommand('SetConditionToShowObject[SEG'+point1+'and'+point2+',BOOL'+point1+'==true&&BOOL'+point2+'==true]');
ggbApplet.setFixed('SEG'+point1+'and'+point2, false, false);
}
}
}
}
function setScript(){
var targets = getExistingObjIndex('POINT','point');
targets.map( function(value, index, array){
array[index] = 'If[Element[FUNCα,'+value+']==true,SetValue[BOOL'+value+',¬BOOL'+value+']]';
});
var script = '';
targets.map( function(value) {
script += value+'\n';
});
script += 'PlaySound[false]\nPlaySound["#zzxwytqu"]';
setSequenceGgbScript('POINT', 'point', 'click', script, 'α');
}
function setColor(){
setSequenceDynamicColor('POINT', 'point', 'If[BOOLα==true,1,0]', 'If[BOOLα==true,0,0]', 'If[BOOLα==true,1,0]', 'α');
}
deleteWorld();
createWorld();
setScript();
setColor();
以上