diff options
author | pmoxhay <pmoxhay@earthlink.net> | 2009-06-05 11:43:37 (GMT) |
---|---|---|
committer | pmoxhay <pmoxhay@earthlink.net> | 2009-06-05 11:43:37 (GMT) |
commit | 89d634579e872666a0b536a94bc406dbf1715ce2 (patch) | |
tree | c58c10bb0dbefbd5d3ea74c518c5ca0caf5c8143 | |
parent | b9f59225110d47cb04962d7e482c7738bdbeffe3 (diff) |
Doesn't repeat recently used problems.
Fix bug with line segment drops getting rejected.
Progresses to next level once >, <, = problems
for a given level are solved correctly.
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | amountproblem.py | 25 | ||||
-rw-r--r-- | areaproblem.py | 73 | ||||
-rw-r--r-- | compare3lesson.py | 66 | ||||
-rw-r--r-- | cuttingproblem.py | 31 | ||||
-rw-r--r-- | draggableobject.py | 26 | ||||
-rw-r--r-- | lengthproblem.py | 53 | ||||
-rw-r--r-- | linesegmentdroptarget.py | 27 | ||||
-rw-r--r-- | linesegmentmovableobject.py | 6 | ||||
-rw-r--r-- | linesegmentobject.py | 10 | ||||
-rw-r--r-- | massproblem.py | 26 | ||||
-rw-r--r-- | movableobject.py | 54 | ||||
-rw-r--r-- | signsdroptarget.py | 12 | ||||
-rw-r--r-- | volumeobject.py | 3 | ||||
-rw-r--r-- | volumeproblem.py | 52 |
15 files changed, 307 insertions, 159 deletions
@@ -19,7 +19,7 @@ Compare3 Lesson + Display intersection between Shapes in a different color? IntersectionObject maybe? - Mass comparison: fit into answer box. - Fix drawing of mass parallelopipeds (ThreeDObjects). -+ Fix behavior of line segments (drops getting rejected). +- Fix behavior of line segments (drops getting rejected). + Volume comparison: fit into answer box. + Amount comparison: fit into answer box (maybe make wider and reposition). + Amount comparison: refine appearance of object groups. diff --git a/amountproblem.py b/amountproblem.py index f2327dc..bea98cd 100644 --- a/amountproblem.py +++ b/amountproblem.py @@ -38,6 +38,8 @@ class AmountProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -74,11 +76,14 @@ class AmountProblem(Problem): original_position2_model = Vector(1000, 200) # The total number of problems. - n_problems = 8 + self.n_problems = 8 # Choose a random problem. shape_scheme = random.randrange(0,6) - problem_number = random.randrange(0,n_problems) + + # Choose a random problem. + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) self.n_shape1 = 8 self.n_shape2 = 7 @@ -94,35 +99,35 @@ class AmountProblem(Problem): #problem_number = 1 #print "problem_number =", problem_number - if problem_number == 0: + if self.problem_number == 0: self.n_shape1 = 6 self.n_shape2 = 6 self.shape1_in_pair = False - elif problem_number == 1: + elif self.problem_number == 1: self.n_shape1 = 6 self.n_shape2 = 6 self.shape1_in_pair = True - elif problem_number == 2: + elif self.problem_number == 2: self.n_shape1 = 6 self.n_shape2 = 5 self.shape1_in_pair = False - elif problem_number == 3: + elif self.problem_number == 3: self.n_shape1 = 6 self.n_shape2 = 5 self.shape1_in_pair = True - elif problem_number == 4: + elif self.problem_number == 4: self.n_shape1 = 4 self.n_shape2 = 4 self.shape1_in_pair = False - elif problem_number == 5: + elif self.problem_number == 5: self.n_shape1 = 4 self.n_shape2 = 4 self.shape1_in_pair = True - elif problem_number == 6: + elif self.problem_number == 6: self.n_shape1 = 4 self.n_shape2 = 3 self.shape1_in_pair = False - elif problem_number == 7: + elif self.problem_number == 7: self.n_shape1 = 4 self.n_shape2 = 3 self.shape1_in_pair = True diff --git a/areaproblem.py b/areaproblem.py index ca03632..bc3c6cc 100644 --- a/areaproblem.py +++ b/areaproblem.py @@ -35,6 +35,8 @@ class AreaProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -103,12 +105,6 @@ class AreaProblem(Problem): SMALL_IRREG_PENTAGON_SHAPE_2 = self.smaller(IRREG_PENTAGON_SHAPE_2) LARGE_IRREG_PENTAGON_SHAPE_2 = self.larger(IRREG_PENTAGON_SHAPE_2) - ## Choose two random letter to represent the two quantities - #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - #letter2 = letter1 - #while letter2 == letter1: - # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - # Standard initial positions for the shapes. upper_left_position = Vector(300, 300) lower_right_position = Vector(900, 400) @@ -126,112 +122,113 @@ class AreaProblem(Problem): (0, math.pi/4), (math.pi/4, 0), (0, math.pi/4), (math.pi/4, 0), (0, 0), (math.pi/2, 0), (0, math.pi/2) ]) # The total number of problems. - n_problems = 30 + self.n_problems = 30 # Choose a random problem. - problem_number = random.randrange(0,n_problems) + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) # Uncomment to test a particular problem. #problem_number = 0 # Define the various problems. - if problem_number == 0: + if self.problem_number == 0: object1 = SQUARE_SHAPE object2 = LARGE_SQUARE_SHAPE - elif problem_number == 1: + elif self.problem_number == 1: object1 = SMALL_SQUARE_SHAPE object2 = SQUARE_SHAPE - elif problem_number == 2: + elif self.problem_number == 2: object1 = SQUARE_SHAPE object2 = SQUARE_SHAPE - elif problem_number == 3: + elif self.problem_number == 3: object1 = RECTANGLE_SHAPE object2 = LARGE_RECTANGLE_SHAPE - elif problem_number == 4: + elif self.problem_number == 4: object1 = SMALL_RECTANGLE_SHAPE object2 = RECTANGLE_SHAPE - elif problem_number == 5: + elif self.problem_number == 5: object1 = RECTANGLE_SHAPE object2 = RECTANGLE_SHAPE - elif problem_number == 6: + elif self.problem_number == 6: object1 = TRIANGLE_SHAPE object2 = LARGE_TRIANGLE_SHAPE - elif problem_number == 7: + elif self.problem_number == 7: object1 = SMALL_TRIANGLE_SHAPE object2 = TRIANGLE_SHAPE - elif problem_number == 8: + elif self.problem_number == 8: object1 = TRIANGLE_SHAPE object2 = TRIANGLE_SHAPE - elif problem_number == 9: + elif self.problem_number == 9: object1 = RT_ANGLE_TRAPEZOID_SHAPE object2 = LARGE_RT_ANGLE_TRAPEZOID_SHAPE - elif problem_number == 10: + elif self.problem_number == 10: object1 = SMALL_RT_ANGLE_TRAPEZOID_SHAPE object2 = RT_ANGLE_TRAPEZOID_SHAPE - elif problem_number == 11: + elif self.problem_number == 11: object1 = RT_ANGLE_TRAPEZOID_SHAPE object2 = RT_ANGLE_TRAPEZOID_SHAPE - elif problem_number == 12: + elif self.problem_number == 12: object1 = TRAPEZOID_SHAPE object2 = LARGE_TRAPEZOID_SHAPE - elif problem_number == 13: + elif self.problem_number == 13: object1 = SMALL_TRAPEZOID_SHAPE object2 = TRAPEZOID_SHAPE - elif problem_number == 14: + elif self.problem_number == 14: object1 = TRAPEZOID_SHAPE object2 = TRAPEZOID_SHAPE - elif problem_number == 15: + elif self.problem_number == 15: object1 = PARALLELOGRAM_SHAPE object2 = LARGE_PARALLELOGRAM_SHAPE - elif problem_number == 16: + elif self.problem_number == 16: object1 = SMALL_PARALLELOGRAM_SHAPE object2 = PARALLELOGRAM_SHAPE - elif problem_number == 17: + elif self.problem_number == 17: object1 = PARALLELOGRAM_SHAPE object2 = PARALLELOGRAM_SHAPE - elif problem_number == 18: + elif self.problem_number == 18: object1 = IRREG_TRIANGLE_SHAPE_1 object2 = LARGE_IRREG_TRIANGLE_SHAPE_1 - elif problem_number == 19: + elif self.problem_number == 19: object1 = SMALL_IRREG_TRIANGLE_SHAPE_1 object2 = IRREG_TRIANGLE_SHAPE_1 - elif problem_number == 20: + elif self.problem_number == 20: object1 = IRREG_TRIANGLE_SHAPE_1 object2 = IRREG_TRIANGLE_SHAPE_1 - elif problem_number == 21: + elif self.problem_number == 21: object1 = IRREG_QUADRIATERAL_SHAPE_1 object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_1 - elif problem_number == 22: + elif self.problem_number == 22: object1 = self.smaller(SMALL_SQUARE_SHAPE) object2 = self.smaller(SQUARE_SHAPE) - elif problem_number == 23: + elif self.problem_number == 23: object1 = IRREG_QUADRIATERAL_SHAPE_1 object2 = IRREG_QUADRIATERAL_SHAPE_1 - elif problem_number == 24: + elif self.problem_number == 24: object1 = IRREG_QUADRIATERAL_SHAPE_2 object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_2 - elif problem_number == 25: + elif self.problem_number == 25: object1 = self.larger(self.larger(IRREG_QUADRIATERAL_SHAPE_2)) object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_2 - elif problem_number == 26: + elif self.problem_number == 26: object1 = IRREG_QUADRIATERAL_SHAPE_2 object2 = IRREG_QUADRIATERAL_SHAPE_2 - elif problem_number == 27: + elif self.problem_number == 27: object1 = IRREG_PENTAGON_SHAPE_1 object2 = LARGE_IRREG_PENTAGON_SHAPE_1 - elif problem_number == 28: + elif self.problem_number == 28: object1 = self.larger(LARGE_IRREG_PENTAGON_SHAPE_2) object2 = LARGE_IRREG_PENTAGON_SHAPE_2 - elif problem_number == 29: + elif self.problem_number == 29: object1 = IRREG_PENTAGON_SHAPE_1 object2 = IRREG_PENTAGON_SHAPE_1 diff --git a/compare3lesson.py b/compare3lesson.py index e40a627..7bbeed5 100644 --- a/compare3lesson.py +++ b/compare3lesson.py @@ -66,6 +66,9 @@ class Compare3Lesson(ObjectArea): self.last_alphabetical_letter1 = 'A' self.last_alphabetical_letter2 = 'A' + self.problem_number = -1 + self.recently_used = [-1, -1, -1, -1, -1, -1, -1, -1] + self.progress = ProgressObject(Vector(10, 700), 30) self.add_object(self.progress) @@ -79,6 +82,10 @@ class Compare3Lesson(ObjectArea): self.moons_visible = False self.n_errors = 0 + self.n_equals_problems_correct = 0 + self.n_greater_than_problems_correct = 0 + self.n_less_than_problems_correct = 0 + #TODO- Put this code in the ShapeObjects themselves. def check_problem_solved(self): @@ -138,9 +145,30 @@ class Compare3Lesson(ObjectArea): self.problem_type ='cutting' #print "... so self.problem_type is now: ", self.problem_type + + self.recently_used = [] + + if self.problem_type == 'length': + n_problems = 18 + elif self.problem_type == 'amount': + n_problems = 8 + elif self.problem_type == 'mass': + n_problems = 9 + elif self.problem_type == 'volume': + n_problems = 12 + elif self.problem_type == 'cutting': + n_problems = 12 + else: + n_problems = 30 + + for i in range(0, n_problems - 3): + self.recently_used.append(-1) + + #print "" + #print "self.recently_used = ", self.recently_used # Uncomment this to choose a particular problem type. - #self.problem_type = 'amount' + #self.problem_type = 'length' if self.problem_type == 'length': self.problem = LengthProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) ) @@ -154,6 +182,15 @@ class Compare3Lesson(ObjectArea): self.problem = CuttingProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) ) else: self.problem = AreaProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) ) + + # Choose a random problem. + while (self.problem_number in self.recently_used): + self.problem_number = self.problem.problem_number + + #print "self.problem_number = ", self.problem_number + self.recently_used.insert(0, self.problem_number) + self.recently_used.pop() + #print "Now self.recently_used = ", self.recently_used self.answer = self.problem.find_answer() self.problem_solved_stage1() @@ -205,6 +242,7 @@ class Compare3Lesson(ObjectArea): self.problem.shape2.calculate_bounds() def pose_problem_stage2(self): + #print "pose_problem_stage2 called" self.stage = 2 self.instructions.text = 'Show the result using line segments' #print "pose_problem_stage2: string to call find_answer" @@ -341,12 +379,34 @@ class Compare3Lesson(ObjectArea): self.instructions.text = 'The ' + quantity_name + ' ' + self.letter1.symbol + ' is ' \ + text + ' the ' + quantity_name + ' ' + self.letter2.symbol - if (self.n_errors == 0): + if (self.n_errors == 0 and self.n_equals_problems_correct > 0 \ + and self.n_greater_than_problems_correct > 0 and self.n_less_than_problems_correct > 0): self.level += 1 - print "self.level is now:", self.level + #print "self.level is now:", self.level + self.recently_used = [-1, -1, -1, -1, -1, -1, -1, -1] self.progress.take_a_step() + self.n_equals_problems_correct = 0 + self.n_greater_than_problems_correct = 0 + self.n_less_than_problems_correct = 0 + #else: + # print "" + # print "n_equals_problems_correct =", self.n_equals_problems_correct + # print "n_greater_than_problems_correct =", self.n_greater_than_problems_correct + # print "n_less_than_problems_correct =", self.n_less_than_problems_correct self.pose_next_problem_arrow() + + def increment_n_equals_problems_correct(self): + if self.n_errors == 0: + self.n_equals_problems_correct += 1 + + def increment_n_greater_than_problems_correct(self): + if self.n_errors == 0: + self.n_greater_than_problems_correct += 1 + + def increment_n_less_than_problems_correct(self): + if self.n_errors == 0: + self.n_less_than_problems_correct += 1 def pose_next_problem_arrow(self): # Put it all in an answer box. diff --git a/cuttingproblem.py b/cuttingproblem.py index 2185c78..e846d62 100644 --- a/cuttingproblem.py +++ b/cuttingproblem.py @@ -62,6 +62,8 @@ class CuttingProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -126,10 +128,11 @@ class CuttingProblem(Problem): (original_angle1, original_angle2) = (0, 0) # The total number of problems. - n_problems = 12 + self.n_problems = 12 # Choose a random problem. - problem_number = random.randrange(0,n_problems) + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) # Uncomment to test a particular problem. #problem_number = 0 @@ -138,76 +141,76 @@ class CuttingProblem(Problem): self.sub_shapes2_points = [ ] # Define the various problems. - if problem_number == 0: + if self.problem_number == 0: object1 = SQUARE_SHAPE object2 = TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(0, 200) ], [ Vector(200, 0), Vector(200, 200), Vector(0, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ] - elif problem_number == 1: + elif self.problem_number == 1: object1 = LARGE_SQUARE_SHAPE object2 = TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(250, 0), Vector(0, 250) ], [ Vector(250, 0), Vector(250, 250), Vector(0, 250) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ] - elif problem_number == 2: + elif self.problem_number == 2: object1 = SQUARE_SHAPE object2 = LARGE_TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(0, 200) ], [ Vector(200, 0), Vector(200, 200), Vector(0, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(250, -250), Vector(250, 0) ], [ Vector(250, 0), Vector(250, -250), Vector(500, 0) ] ] - elif problem_number == 3: + elif self.problem_number == 3: object1 = SQUARE_SHAPE object2 = RECTANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 100), Vector(0, 100) ], [ Vector(200, 0), Vector(400, 0), Vector(400, 100), Vector(200, 100) ] ] - elif problem_number == 4: + elif self.problem_number == 4: object1 = SQUARE_SHAPE object2 = SMALL_RECTANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175, 0), Vector(175, 75), Vector(0, 75) ], [ Vector(175, 0), Vector(350, 0), Vector(350, 75), Vector(175, 75) ] ] - elif problem_number == 5: + elif self.problem_number == 5: object1 = SQUARE_SHAPE object2 = LARGE_RECTANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(225, 0), Vector(225, 125), Vector(0, 125) ], [ Vector(225, 0), Vector(450, 0), Vector(450, 125), Vector(225, 125) ] ] - elif problem_number == 6: + elif self.problem_number == 6: object1 = PARALLELOGRAM_SHAPE object2 = TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ] - elif problem_number == 7: + elif self.problem_number == 7: object1 = PARALLELOGRAM_SHAPE object2 = LARGE_TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(250, -250), Vector(250, 0) ], [ Vector(250, 0), Vector(250, -250), Vector(500, 0) ] ] - elif problem_number == 8: + elif self.problem_number == 8: object1 = PARALLELOGRAM_SHAPE object2 = SMALL_TRIANGLE_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175, -175), Vector(175, 0) ], [ Vector(175, 0), Vector(175, -175), Vector(350, 0) ] ] - elif problem_number == 9: + elif self.problem_number == 9: object1 = TRAPEZOID_SHAPE object2 = RECTANGLE_2_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(0, 150), Vector(-150, 150) ], [ Vector(0, 0), Vector(150, 0), Vector(300, 150), Vector(0, 150) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(150,0), Vector(300, 150), Vector(0, 150)], [ Vector(300, 150), Vector(150, 150), Vector(150, 0) ] ] - elif problem_number == 10: + elif self.problem_number == 10: object1 = TRAPEZOID_SHAPE object2 = LARGE_RECTANGLE_2_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) self.sub_shapes1_points = [ [ Vector(0, 0), Vector(0, 150), Vector(-150, 150) ], [ Vector(0, 0), Vector(150, 0), Vector(300, 150), Vector(0, 150) ] ] self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175,0), Vector(350, 175), Vector(0, 175)], [ Vector(175, 0), Vector(350, 175), Vector(175, 175) ] ] - elif problem_number == 11: + elif self.problem_number == 11: object1 = TRAPEZOID_SHAPE object2 = SMALL_RECTANGLE_2_SHAPE (original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) ) diff --git a/draggableobject.py b/draggableobject.py index 360e30b..bdf2063 100644 --- a/draggableobject.py +++ b/draggableobject.py @@ -13,6 +13,9 @@ # # You should have received a copy of the GNU General Public License # along with Math. If not, see <http://www.gnu.org/licenses/>. + +DEBUG = False + from objectarea import Object from droptargetobject import DropTargetObject from vector import Vector @@ -79,31 +82,48 @@ class DraggableObject(Object): i += 1 if o.contains(self.get_bounds()) and not o.full: o.hilite = True - #print "DraggableObject: DropTarget's hilite set to True, queue draw" + if DEBUG: + print "DraggableObject: DropTarget's hilite set to True, queue draw" o.queue_draw() else: o.hilite = False - #print "DraggableObject: DropTarget's hilite set to False, queue draw" + if DEBUG: + print "DraggableObject: DropTarget's hilite set to False, queue draw" o.queue_draw() # End the drag. elif event.type == gtk.gdk.BUTTON_RELEASE: + if DEBUG: + print "DraggableObject: BUTTON_RELEASE" self.dragged = False + if self.container: self.container.snap_to_grid(self) b = False #Check whether the drop is inside a drop target. + if DEBUG: + print "DraggableObject: has ", len(self.drop_targets), "drop targets" + for o in self.drop_targets: - if o.contains(self.get_bounds()): + #if o.contains(self.get_bounds()): + # Try this: 6/4/09 + if o.hilite: b = True + if DEBUG: + print "DraggableObject: trying to call processDrop" if o.processDrop(self): return True if not b: + if DEBUG: + print "DraggableObject: not in a DropTarget" o.hilite = False self.drop_origin.reset() + else: + if DEBUG: + print "DraggableObject: IS in a DropTarget!" # If drag is not already in progress. elif self.contains_point(epos): diff --git a/lengthproblem.py b/lengthproblem.py index 9965233..3c503e4 100644 --- a/lengthproblem.py +++ b/lengthproblem.py @@ -35,6 +35,8 @@ class LengthProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -68,13 +70,7 @@ class LengthProblem(Problem): LENGTH_13 = [ Vector(0, 0), Vector(50, 0), Vector(50, 500), Vector(0, 500) ] LENGTH_14 = [ Vector(0, 0), Vector(50, 0), Vector(50, 525), Vector(0, 525) ] LENGTH_15 = [ Vector(0, 0), Vector(50, 0), Vector(50, 550), Vector(0, 550) ] - - ## Choose two random letter to represent the two quantities - #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - #letter2 = letter1 - #while letter2 == letter1: - # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - + # Standard initial positions for the shapes. upper_left_position = Vector(300, 300) lower_right_position = Vector(900, 400) @@ -92,75 +88,76 @@ class LengthProblem(Problem): (0, math.pi/4), (math.pi/4, 0), (0, math.pi/4), (math.pi/4, 0), (0, 0), (math.pi/2, 0), (0, math.pi/2) ]) # The total number of problems. - n_problems = 18 + self.n_problems = 18 # Choose a random problem. - problem_number = random.randrange(0, n_problems) + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) # Uncomment to test a particular problem. - #problem_number = 0 + #problem_number = 3 # Define the various problems. - if problem_number == 0: + if self.problem_number == 0: object1 = LENGTH_1 object2 = LENGTH_1 - elif problem_number == 1: + elif self.problem_number == 1: object1 = LENGTH_3 object2 = LENGTH_3 - elif problem_number == 2: + elif self.problem_number == 2: object1 = LENGTH_5 object2 = LENGTH_5 - elif problem_number == 3: + elif self.problem_number == 3: object1 = LENGTH_1 object2 = LENGTH_3 - elif problem_number == 4: + elif self.problem_number == 4: object1 = LENGTH_2 object2 = LENGTH_4 - elif problem_number == 5: + elif self.problem_number == 5: object1 = LENGTH_7 object2 = LENGTH_7 - elif problem_number == 6: + elif self.problem_number == 6: object1 = LENGTH_3 object2 = LENGTH_5 - elif problem_number == 7: + elif self.problem_number == 7: object1 = LENGTH_4 object2 = LENGTH_6 - elif problem_number == 8: + elif self.problem_number == 8: object1 = LENGTH_5 object2 = LENGTH_7 - elif problem_number == 9: + elif self.problem_number == 9: object1 = LENGTH_6 object2 = LENGTH_8 - elif problem_number == 10: + elif self.problem_number == 10: object1 = LENGTH_9 object2 = LENGTH_9 - elif problem_number == 11: + elif self.problem_number == 11: object1 = LENGTH_7 object2 = LENGTH_9 - elif problem_number == 12: + elif self.problem_number == 12: object1 = LENGTH_8 object2 = LENGTH_10 - elif problem_number == 13: + elif self.problem_number == 13: object1 = LENGTH_9 object2 = LENGTH_11 - elif problem_number == 14: + elif self.problem_number == 14: object1 = LENGTH_10 object2 = LENGTH_12 - elif problem_number == 15: + elif self.problem_number == 15: object1 = LENGTH_11 object2 = LENGTH_11 - elif problem_number == 16: + elif self.problem_number == 16: object1 = LENGTH_11 object2 = LENGTH_13 - elif problem_number == 17: + elif self.problem_number == 17: object1 = LENGTH_0 object2 = LENGTH_2 diff --git a/linesegmentdroptarget.py b/linesegmentdroptarget.py index 82d6dfc..fd80510 100644 --- a/linesegmentdroptarget.py +++ b/linesegmentdroptarget.py @@ -19,6 +19,8 @@ from droptargetobject import DropTargetObject from linesegmentobject import LineSegmentObject
from linesegmentmovableobject import LineSegmentMovableObject
+DEBUG = False
+
class LineSegmentDropTarget(DropTargetObject):
"""Drop target which line segments can be dropped."""
@@ -41,6 +43,11 @@ class LineSegmentDropTarget(DropTargetObject): self.answer = 'equal'
def draw(self, cr):
+ #cr.set_source_rgb(0, 1, 1)
+ #self_bounds_mn, self_bounds_mx = self.get_bounds()
+ #cr.rectangle(self_bounds_mn.x, self_bounds_mn.y, self_bounds_mx.x - self_bounds_mn.x, self_bounds_mx.y - self_bounds_mn.y)
+ #cr.fill()
+
cr.rectangle(self.pos.x, self.pos.y, self.size.x, self.size.y)
cr.set_source_rgb(0, 0, 0)
@@ -63,7 +70,7 @@ class LineSegmentDropTarget(DropTargetObject): return i
def get_bounds(self):
- return self.pos - Vector (2, 2), self.pos + self.size
+ return self.pos - Vector(2,2), self.pos + self.size
def contains(self, other_bounds):
self_bounds_mn, self_bounds_mx = self.get_bounds()
@@ -78,10 +85,16 @@ class LineSegmentDropTarget(DropTargetObject): return False
def processDrop(self, draggable_object):
- #print "processDrop called on object at ", self.pos
+ if DEBUG:
+ print "LineSegmentDropTarget: processDrop called on object at ", self.pos
if not isinstance(draggable_object, LineSegmentObject) and not isinstance(draggable_object, LineSegmentMovableObject):
+ if DEBUG:
+ print "LineSegmentDropTarget: not a LineSegmentMovableObject"
return False
+ else:
+ if DEBUG:
+ print "LineSegmentDropTarget: IS LineSegmentMovableObject!"
if self.full:
self.drop_origin.reset()
@@ -113,14 +126,16 @@ class LineSegmentDropTarget(DropTargetObject): movable_object.selectable = True
movable_object.drop_targets = self.drop_targets
movable_object.drop_origin = self.drop_origin
- self.container.add_object(movable_object)
+ if self.container:
+ self.container.add_object(movable_object)
self.contents = movable_object
self.full = True
self.hilite = False
self.queue_draw()
- if self.drop_origin:
- self.container.select_object(self.drop_origin.line1)
+ if self.drop_origin:
+ if self.container:
+ self.container.select_object(self.drop_origin.line1)
else:
if draggable_object.length == 100:
@@ -155,7 +170,7 @@ class LineSegmentDropTarget(DropTargetObject): if not self.answer_correct() and self.all_drop_targets_full():
self.reset_all_drop_targets()
self.container.register_error()
- elif self.answer_correct():
+ elif self.answer_correct():
self.container.selected_object = None
self.freeze_drop_targets()
self.container.finish_problem_stage2()
diff --git a/linesegmentmovableobject.py b/linesegmentmovableobject.py index 30fbd10..b363878 100644 --- a/linesegmentmovableobject.py +++ b/linesegmentmovableobject.py @@ -13,6 +13,9 @@ # # You should have received a copy of the GNU General Public License # along with Math. If not, see <http://www.gnu.org/licenses/>. + +DEBUG = False + from objectarea import Object from draggableobject import DraggableObject from vector import Vector @@ -26,6 +29,9 @@ class LineSegmentMovableObject(MovableObject): def __init__(self, pos, length, drop_targets, container): MovableObject.__init__(self) + + if DEBUG: + print "LineSegmentMovableObject: constructor called " self.pos = pos self.length = length diff --git a/linesegmentobject.py b/linesegmentobject.py index 71f17ba..c9a3647 100644 --- a/linesegmentobject.py +++ b/linesegmentobject.py @@ -13,6 +13,9 @@ #
# You should have received a copy of the GNU General Public License
# along with Math. If not, see <http://www.gnu.org/licenses/>.
+
+DEBUG = False
+
from objectarea import Object
from draggableobject import DraggableObject
from vector import Vector
@@ -40,7 +43,12 @@ class LineSegmentObject(DraggableObject): self.drop_targets = drop_targets
self.container = container
- def draw(self, cr):
+ def draw(self, cr):
+ #cr.set_source_rgb(1, 0, 1)
+ #self_bounds_mn, self_bounds_mx = self.get_bounds()
+ #cr.rectangle(self_bounds_mn.x, self_bounds_mn.y, self_bounds_mx.x - self_bounds_mn.x, self_bounds_mx.y - self_bounds_mn.y)
+ #cr.fill()
+
cr.move_to(self.pos.x - 25, self.pos.y + self.length - self.line_segment_length)
cr.line_to(self.pos.x + 25, self.pos.y+ self.length - self.line_segment_length)
diff --git a/massproblem.py b/massproblem.py index 411321c..4499323 100644 --- a/massproblem.py +++ b/massproblem.py @@ -37,6 +37,8 @@ class MassProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -54,57 +56,59 @@ class MassProblem(Problem): (color1, color2) = random.choice([(Color.RED, Color.BLUE), (Color.BLUE, Color.RED)]) # The total number of problems. - n_problems = 9 + self.n_problems = 9 + # Choose a random problem. - problem_number = random.randrange(0,n_problems) + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) # Uncomment to test a particular problem. #problem_number = 0 # Define the various problems. - if problem_number == 0: + if self.problem_number == 0: size1 = 'short' size2 = 'short' self.mass1 = 1 self.mass2 = 2 - elif problem_number == 1: + elif self.problem_number == 1: size1 = 'short' size2 = 'short' self.mass1 = 2 self.mass2 = 1 - elif problem_number == 2: + elif self.problem_number == 2: size1 = 'short' size2 = 'short' self.mass1 = 1 self.mass2 = 1 - elif problem_number == 3: + elif self.problem_number == 3: size1 = 'tall' size2 = 'short' self.mass1 = 1 self.mass2 = 2 - elif problem_number == 4: + elif self.problem_number == 4: size1 = 'tall' size2 = 'short' self.mass1 = 2 self.mass2 = 1 - elif problem_number == 5: + elif self.problem_number == 5: size1 = 'tall' size2 = 'short' self.mass1 = 1 self.mass2 = 2 - elif problem_number == 6: + elif self.problem_number == 6: size1 = 'tall' size2 = 'tall' self.mass1 = 1 self.mass2 = 2 - elif problem_number == 7: + elif self.problem_number == 7: size1 = 'tall' size2 = 'tall' self.mass1 = 2 self.mass2 = 1 - elif problem_number == 8: + elif self.problem_number == 8: size1 = 'tall' size2 = 'tall' self.mass1 = 1 diff --git a/movableobject.py b/movableobject.py index e382901..91e308d 100644 --- a/movableobject.py +++ b/movableobject.py @@ -17,6 +17,8 @@ from objectarea import Object from droptargetobject import DropTargetObject from vector import Vector +DEBUG = False + import gtk, math class MovableObject(Object): @@ -90,16 +92,22 @@ class MovableObject(Object): return boolean def on_mouse(self, event): - #print "MovableObject: on_mouse called)" + if DEBUG: + print "MovableObject: on_mouse called" + if not self.selectable: - #print "MovableObject: on_mouse returning because not selectable: ", self + if DEBUG: + print "MovableObject: not self.selectable" return - - #print "MovableObject: on_mouse continuing...:", self - + else: + if DEBUG: + print "MovableObject: IS self.selectable!" + epos = Vector(event.x, event.y) - #print "Movable Object: self.drag_type =", self.drag_type + if DEBUG: + print "MovableObject: self.drag_type =", self.drag_type + # Process in progress dragging, if active. if self.drag_type: if self.drag_type == 'rotate': @@ -134,7 +142,10 @@ class MovableObject(Object): o.queue_draw() elif event.type == gtk.gdk.BUTTON_RELEASE: - #print "movable object: BUTTON_RELEASE" + + if DEBUG: + print "MovableObject: BUTTON_RELEASE: ", self + if self.container: self.container.drag_object.dragged = False @@ -147,20 +158,39 @@ class MovableObject(Object): #Check whether the drop is inside a drop target. for o in self.drop_targets: has_drop_target = True - #print "movable object: has a drop target" + + if DEBUG: + print "MovableObject: has a drop target" + if o.contains(self.get_bounds()): inside_drop_target = True - #print "movable object: is inside target" + if DEBUG: + print "MovableObject: is inside target" + #if not has_drop_target: - #print "movable object: try to call processDrop" + if DEBUG: + print "MovableObject: try to call processDrop" + if o.processDrop(self): - #print "movable object: finished calling processDrop" + if DEBUG: + print "MovableObject: finished calling processDrop" return True self.drag_type = None - if has_drop_target and not inside_drop_target : + if not has_drop_target: + if DEBUG: + print "MovableObject: No drop target" + else: + if DEBUG: + print "MovableObject: Has a drop target" + + if has_drop_target and not inside_drop_target: + + if DEBUG: + print "MovableObject: has_drop_target and not inside_drop_target" + self.container.remove_object(self) if self.drop_origin: self.drop_origin.select_primary_object() diff --git a/signsdroptarget.py b/signsdroptarget.py index 938366c..6c2506e 100644 --- a/signsdroptarget.py +++ b/signsdroptarget.py @@ -127,7 +127,9 @@ class SignsDropTarget(DropTargetObject): movable_object.drop_targets = self.drop_targets
movable_object.drop_origin = self.drop_origin
- self.container.add_object(movable_object)
+ if self.container:
+ self.container.add_object(movable_object)
+
self.contents = movable_object
self.full = True
self.hilite = False
@@ -143,6 +145,14 @@ class SignsDropTarget(DropTargetObject): elif self.answer_correct():
self.container.selected_object = None
self.freeze_drop_targets()
+
+ if self.answer == 'greater':
+ self.container.increment_n_greater_than_problems_correct()
+ elif self.answer == 'equal':
+ self.container.increment_n_equals_problems_correct()
+ elif self.answer == 'less':
+ self.container.increment_n_less_than_problems_correct()
+
self.container.finish_problem_stage3()
if self.drop_origin:
diff --git a/volumeobject.py b/volumeobject.py index 88599ff..8f4c3c4 100644 --- a/volumeobject.py +++ b/volumeobject.py @@ -22,10 +22,9 @@ import gtk, math class VolumeObject(MovableObject):
"""Quasi three-dimensional container object."""
- def __init__(self, color, symbol, pos, height = 400, lower_radius = 50, upper_radius = 100):
+ def __init__(self, symbol, pos, height = 400, lower_radius = 50, upper_radius = 100):
MovableObject.__init__(self)
- self.color = color
self.symbol = symbol
self.height = height
diff --git a/volumeproblem.py b/volumeproblem.py index 3299a2a..730f97f 100644 --- a/volumeproblem.py +++ b/volumeproblem.py @@ -36,6 +36,8 @@ class VolumeProblem(Problem): self.letter1 = letter1 self.letter2 = letter2 + self.problem_number = -1 + self.generate_problem() self.show_problem() @@ -49,27 +51,19 @@ class VolumeProblem(Problem): #self.pan2_position = Vector(725, 500) def generate_problem(self): - # Choose two random colors. - (color1, color2) = random.choice([(Color.RED, Color.BLUE), (Color.BLUE, Color.RED), \ - (Color.RED, Color.GREEN), (Color.GREEN, Color.RED), \ - (Color.BLUE, Color.GREEN), (Color.GREEN, Color.BLUE)]) - - ## Choose two random letter to represent the two quantities - #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - #letter2 = letter1 - #while letter2 == letter1: - # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T']) - + # The total number of problems. - n_problems = 3 + self.n_problems = 12 + # Choose a random problem. - problem_number = random.randrange(0,n_problems) + while (self.problem_number in self.container.recently_used): + self.problem_number = random.randrange(0, self.n_problems) # Uncomment to test a particular problem. #problem_number = 0 # Define the various problems. - if problem_number == 0: + if self.problem_number == 0: # First volume is a cylinder. self.height1 = 230.0 self.lower_radius1 = 75 @@ -83,7 +77,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 1: + elif self.problem_number == 1: # First volume is a cylinder. self.height1 = 230.0 self.lower_radius1 = 75 @@ -97,7 +91,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 2: + elif self.problem_number == 2: # First volume is a cylinder. self.height1 = 230.0 self.lower_radius1 = 75 @@ -111,7 +105,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 3: + elif self.problem_number == 3: # First volume is a cylinder. self.height1 = 200.0 self.lower_radius1 = 90 @@ -125,7 +119,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 4: + elif self.problem_number == 4: # First volume is a cylinder. self.height1 = 200.0 self.lower_radius1 = 90 @@ -139,7 +133,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 5: + elif self.problem_number == 5: # First volume is a cylinder. self.height1 = 200.0 self.lower_radius1 = 90 @@ -153,7 +147,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 6: + elif self.problem_number == 6: # First volume is a cylinder. self.height1 = 180.0 self.lower_radius1 = 87 @@ -167,7 +161,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 7: + elif self.problem_number == 7: # First volume is a cylinder. self.height1 = 180.0 self.lower_radius1 = 87 @@ -181,7 +175,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 8: + elif self.problem_number == 8: # First volume is a cylinder. self.height1 = 180.0 self.lower_radius1 = 87 @@ -195,7 +189,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 9: + elif self.problem_number == 9: # First volume is a cone. self.height1 = 120.0 self.lower_radius1 = 45 @@ -209,7 +203,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 10: + elif self.problem_number == 10: # First volume is a cone. self.height1 = 120.0 self.lower_radius1 = 45 @@ -223,7 +217,7 @@ class VolumeProblem(Problem): self.height2 = self.calculate_height_for_equal_volume(1.1* volume1, self.lower_radius2, self.upper_radius2) volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2) - elif problem_number == 11: + elif self.problem_number == 11: # First volume is a cone. self.height1 = 120.0 self.lower_radius1 = 45 @@ -249,11 +243,11 @@ class VolumeProblem(Problem): # Switch the shapes half the time (so we get > as well as < problems). if random.choice([0,1]) == 0: - self.shape1 = VolumeObject(color1, self.letter1, original_position1, self.height1, self.lower_radius1, self.upper_radius1) - self.shape2 = VolumeObject(color2, self.letter2, original_position2, self.height2, self.lower_radius2, self.upper_radius2) + self.shape1 = VolumeObject(self.letter1, original_position1, self.height1, self.lower_radius1, self.upper_radius1) + self.shape2 = VolumeObject(self.letter2, original_position2, self.height2, self.lower_radius2, self.upper_radius2) else: - self.shape1 = VolumeObject(color1, self.letter2, original_position1, self.height1, self.lower_radius1, self.upper_radius1) - self.shape2 = VolumeObject(color2, self.letter1, original_position2, self.height2, self.lower_radius2, self.upper_radius2) + self.shape1 = VolumeObject(self.letter2, original_position1, self.height1, self.lower_radius1, self.upper_radius1) + self.shape2 = VolumeObject(self.letter1, original_position2, self.height2, self.lower_radius2, self.upper_radius2) self.faucet_object = FaucetObject(Vector(0, 100)) self.container.add_object(self.faucet_object) |