Ein Versuch die Trainingsaufgaben auf jwinf.de (Jugendwettbewerb Informatik) in Java nachzuprogrammieren. Als Gaming Engine kommt die Engine Alpha zum Einsatz.
Die Website jwinf.de läuft auf medal (eine kleine, in Rust geschriebene Plattform für Browser-Wettbewerbe). Die einzelnen Aufgaben sind mit den bebras-modules umgesetzt, die von der Association France-ioi bereit gestellt wird. Die meiste Spiellogik ist in dem Javascript-Module blocklyRobot_lib-1.1.js implementiert.
conditionals_excercises/find_the_destination
conditionals_excercises/find_the_way_to_the_lake
conditionals_excercises/gems_and_obstacles
conditionals_excercises/heat_the_castle
conditionals_excercises/light_all_candles
conditionals_excercises/platforms
loops_excercises/collecting_gems
loops_excercises/securing_the_road
make dependency
https://github.com/France-ioi/bebras-modules/blob/master/pemFioi/quickAlgo/README.md
Eine Trainingsaufgabe ist in einer Javascript- und einer HTML-Datei definiert z. B.
Bedingte Anweisungen – Übungen / Zünde alle Kerzen an
20-DE-13-Kerzen-einfach/task_new.js
function initTask(subTask) {
var cellSide = 60;
subTask.gridInfos = {
hideSaveOrLoad: true,
conceptViewer: false,
contextType: "paint",
//cellSide: cellSide,
actionDelay: 200,
languageStrings: {
blocklyRobot_lib: {
label: {
"onPaint": "auf Kerze",
"dropObject" : "zünde Kerze an"
},
code: {
onPaint: "aufKerze",
dropObject : "zuendeKerzeAn"
},
messages: {
successContainersFilled: "Bravo, der Roboter hat alle Kerzen angezündet!",
failureContainersFilled: "Der Roboter hat die Kerzen nicht korrekt angezündet.",
}
}
},
itemTypes: {
robot: {img: imgPath+"blue_robot.png", side: 85, isRobot: true, offsetX: -10, offsetY: 10, zOrder: 1},
initial_paint: {num: 3, img: "kerze.png", side: 60, isPaint: true, zOrder: 1},
paint: {num: 2, img: "flamme.png", side: 60, isWithdrawable: true, zOrder: 1},
marker: {num: 4, img: "docht.png", side: 60, isContainer: true, containerFilter: function(item) {return item.type === "paint";}, zOrder: 0},
number: { side: 60, zOrder: 2 },
board_background: { num: 5, color: "#ffffff", side: 60, zOrder: 0 },
board: { side: 60, isWritable: true, zOrder: 1 }
},
maxInstructions: {
easy: 10,
medium: 10,
hard: 10,
},
includeBlocks: {
groupByCategory: false,
generatedBlocks: {
robot: {
shared: ["east", "west", "north", "south", "dropObject"],
easy: [],
medium: [],
hard: ["onPaint"]
}
},
standardBlocks: {
includeAll: false,
wholeCategories: {
easy: [],
medium: [],
hard: []
},
singleBlocks: {
shared: ["controls_repeat"],
easy: [],
medium: [],
hard: ["controls_if"] // ["logic_negate", "controls_if_else"]
}
},
pythonAdditionalFunctions: {
shared: ["range"]
},
},
blocklyColourTheme: "bwinf",
ignoreInvalidMoves: false,
checkEndEveryTurn: false,
// checkEndCondition: function(context, lastTurn) {
// var solved = true;
// for (var iRow = 0; iRow < context.tiles.length; iRow++) {
// var row = subTask.data[subTask.level][subTask.iTestCase].tiles[iRow];
// for (var iCol = 0; iCol < row.length; iCol++) {
// var markers = context.getItems(iRow, iCol, {
// isMarker: true
// });
// var paint = context.getItems(iRow, iCol, {
// isPaint: true
// });
// if (paint.length != markers.length) {
// solved = false;
// }
// }
// }
// if (solved) {
// context.success = true;
// throw (window.taskStrings.success);
// }
// if (lastTurn) {
// context.success = false;
// throw (window.taskStrings.failure);
// }
// },
// computeGrade: function(context, message) {
// var rate = 0;
// if (context.success) {
// rate = 1;
// }
// return {
// successRate: rate,
// message: message
// };
// }
};
subTask.data = {
easy: [{
tiles: [
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 4, 1, 1, 1, 1],
[1, 1, 1, 1, 3, 1, 1, 1, 1],
[1, 1, 1, 1, 3, 1, 1, 1, 1],
[1, 1, 1, 1, 3, 1, 1, 1, 1]
],
initItems: [{
row: 5,
col: 1,
type: "robot"
}, ]
}],
medium: [{
tiles: [
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 4, 4, 4, 4, 4, 1, 1],
[1, 1, 3, 3, 3, 3, 3, 1, 1],
[1, 1, 3, 3, 3, 3, 3, 1, 1],
[1, 1, 3, 3, 3, 3, 3, 1, 1],
[1, 1, 3, 3, 3, 3, 3, 1, 1]
],
initItems: [{
row: 5,
col: 1,
type: "robot"
}, ]
}],
hard: [{
tiles: [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 4, 1, 4, 4, 1, 1, 4, 1],
[1, 1, 3, 1, 3, 3, 1, 1, 3, 1],
[1, 1, 3, 1, 3, 3, 1, 1, 3, 1],
[1, 1, 3, 1, 3, 3, 1, 1, 3, 1]
],
initItems: [{
row: 5,
col: 1,
type: "robot"
}, ]
}]
};
initBlocklySubTask(subTask);
displayHelper.thresholdEasy = 120;
displayHelper.thresholdMedium = 240;
}
initWrapper(initTask, ["easy", "medium", "hard"], null, true);
20-DE-13-Kerzen-einfach/index_new.html?channelId=task
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Kerzen anzünden</title>
<script>
window.stringsLanguage = 'de';
window.taskStrings = {
success: "Bravo! Der Roboter hat alle Kerzen angezündet.",
failure: "Dein Roboter hat nicht alle Kerzen angezündet.",
};
</script>
<script class="remove" type="text/javascript" src="../../../_common/modules/pemFioi/importModules-1.4-mobileFirst.js"
id="import-modules"></script>
<script class="remove" type="text/javascript">
var modulesPath = '../../../_common/modules/'
importModules([
'jquery-1.7.1', 'JSON-js', 'raphael-2.2.1', 'beaver-task-2.0', 'jschannel', 'raphaelFactory-1.0', 'delayFactory-1.0', 'simulationFactory-1.0',
'platform-pr', 'buttonsAndMessages', 'beav-1.0', 'installationAPI.01', 'miniPlatform', 'conceptDisplay-1.0', 'conceptViewer-1.0', 'conceptViewer_css-1.0',
'taskStyles-mobileFirst', 'blockly-robot-1.1', 'jwinf_css'
]);
// set Blockly as default language when none is specified through ?language=
importLanguageModules('blockly');
</script>
<script class="remove" type="text/javascript">
var json = {
"id": "20-DE-13-Kerzen-einfach",
"language": "de",
"version": "de.01",
"authors": "JwInf 2020",
"translators": [],
"license": "",
"taskPathPrefix": "",
"modulesPathPrefix": "",
"browserSupport": [],
"fullFeedback": true,
"minWidth": "auto"
};
</script>
<script type="text/javascript" src="task_new.js"></script>
</head>
<body onresize="task.displayedSubTask.updateScale()">
<div id="task">
<h1>Kerzen anzünden</h1>
<img src="marker.png" style="display:none" />
<img src="paint.png" style="display:none" />
<img src="green_robot.png" style="display:none" />
<img src="icon.png" style="display:none" />
<div id="tabsContainer"></div>
<div id="taskContent" style="text-align:left;position:relative">
<div id="taskIntro">
Programmiere den Roboter:<br>
<p>
Der Roboter soll alle Kerzen anzünden.
</p>
<div class="hard">
<p data-lang="blockly">
Der Baustein <img src='aufKerze.png'style="vertical-align: middle" /> gibt <code>True</code> zurück, wenn der Roboter auf einer Kerze <img src='kerze.png' width="50px"/> steht.
</p>
<p data-lang="python">
Die Funktion <code>aufKerze()</code> gibt <code>True</code> zurück, wenn der Roboter auf einer Kerze <img src='kerze.png' width="50px"/> steht.
</p>
</div>
</div>
<div id="gridContainer"></div>
<div id="blocklyLibContent"></div>
</div>
</div><!-- task -->
</body>
</html>