package org.teachingkidsprogramming.recipes.quizzes.graders; import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JPanel; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.logo.utils.ColorUtils.PenColors; import org.teachingextensions.logo.utils.LineAndShapeUtils.Paintable; public class TreeQuizGrader implements Paintable { private boolean[] answers; public static int TURTLE_SPEED = 9; private TreeQuizAdapter quiz; private int xTop = 25; private int yTop = 25; private void displayScreen() { QuizUtils.prepareScoringScreen(answers, this, TURTLE_SPEED); drawRewardShape(); } public void grade(TreeQuizAdapter quiz) { this.quiz = quiz; answers = new boolean[]{grade1DoubleLength(), grade2DecreaseTurn(), grade3SetNinety(), grade4AngleFive()}; displayScreen(); } @Override public void paint(Graphics2D g, JPanel caller) { QuizUtils.displayScores(g, 380, answers); drawMaze(g); } private boolean grade1DoubleLength() { quiz.length = 111; quiz.question1(); return quiz.length == 222; } private boolean grade2DecreaseTurn() { quiz.turn = -31; quiz.question2(); return -32 == quiz.turn; } private boolean grade3SetNinety() { quiz.turn = -5; quiz.question3(); return 90 == getAngle(-5); } public Integer getAngle(int key) { Integer v = quiz.angles.get(key); return v == null ? 0 : v; } private boolean grade4AngleFive() { quiz.question4(); return 36 == getAngle(5); } public void drawRewardShape() { TortoiseUtils.setOrientation(xTop - 15, yTop + 15, 90); quiz.length = 15; quiz.question1(); Tortoise.setPenColor(PenColors.Greens.Lime); Tortoise.setPenWidth(2); int[] turns = {0, 90, 0, -90, 90 - 36, -90, 0, 90, -90, 0, 0, 0, -90, -90, 0, 0, 90, 0, 0, 90, 0, 0, 0, 0, 90, 90, -90, 0, -90, 90, -90}; for (int i = 0; i < turns.length; i++) { if (i == 4) { quiz.question4(); quiz.angles.put(i + 1, getAngle(i + 1) + turns[i]); } else if (turns[i] != 90) { quiz.angles.put(i + 1, turns[i]); } else { quiz.turn = i + 1; quiz.question3(); } } quiz.turn = 0; for (int i = 0; i < turns.length; i++) { quiz.question2(); int turn = Math.abs(quiz.turn); int degreesToTheRight = getAngle(turn); Tortoise.turn(degreesToTheRight); Tortoise.move(quiz.length); } } private void drawMaze(Graphics2D g) { g.setColor(PenColors.Grays.DarkGray); g.setStroke(new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); int[][] verticalLines = {{1, 4}, {0, 2, 3, 1}, {2, 1}, {0, 1}, {1, 3}, {1, 2}, {2, 1}, new int[0], {1, 1, 3, 2}, {2, 1}, {0, 4}}; int[][] horizontalLines = {{0, 10}, {2, 1, 5, 4}, {1, 1, 3, 1, 7, 1}, {0, 1, 2, 2, 5, 3, 9, 1}, {1, 2, 4, 3, 8, 1}, {0, 10}}; drawLines(horizontalLines, g, true); drawLines(verticalLines, g, false); } private void drawLines(int[][] lines, Graphics2D g, boolean addToX) { for (int line = 0; line < lines.length; line++) { for (int i = 0; i < lines[line].length; i += 2) { int grid = 30; int p1 = xTop + lines[line][i] * grid; int p2 = yTop + line * grid; int x1 = addToX ? p1 : p2; int y1 = addToX ? p2 : p1; int length = lines[line][i + 1] * grid; int x2 = addToX ? x1 + length : x1; int y2 = addToX ? y1 : y1 + length; g.draw(new Line2D.Double(x1, y1, x2, y2)); } } } }