From 4270648743b45e6c469f796cc051a65edeb2218f Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Fri, 21 Aug 2020 13:08:09 -0500 Subject: [PATCH 01/29] feat: add ArraySound class as ArrayView dependency This simple implementation plays a constant sound that is only implemented on bubble sort as the arithmetic average of the two values being compared. --- levels/bubble_sort.gd | 3 +++ project.godot | 6 ++++++ views/array_sound.gd | 28 ++++++++++++++++++++++++++++ views/array_view.gd | 4 ++++ 4 files changed, 41 insertions(+) create mode 100644 views/array_sound.gd diff --git a/levels/bubble_sort.gd b/levels/bubble_sort.gd index 97cab92..8b8e913 100644 --- a/levels/bubble_sort.gd +++ b/levels/bubble_sort.gd @@ -48,3 +48,6 @@ func get_effect(i): if i >= _end: return EFFECTS.DIMMED return EFFECTS.NONE + +func get_frac(): + return (array.frac(_index) + array.frac(_index + 1)) / 2.0 diff --git a/project.godot b/project.godot index 2d4a05c..e5619ac 100644 --- a/project.godot +++ b/project.godot @@ -14,6 +14,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://models/array_model.gd" }, { +"base": "Node", +"class": "ArraySound", +"language": "GDScript", +"path": "res://views/array_sound.gd" +}, { "base": "HBoxContainer", "class": "ArrayView", "language": "GDScript", @@ -86,6 +91,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "ArrayModel": "", +"ArraySound": "", "ArrayView": "", "BinaryTreeModel": "", "BogoSort": "", diff --git a/views/array_sound.gd b/views/array_sound.gd new file mode 100644 index 0000000..af2479b --- /dev/null +++ b/views/array_sound.gd @@ -0,0 +1,28 @@ +class_name ArraySound +extends Node + +const SAMPLE_HZ = 44100 +const MIN_HZ = 110 +const MAX_HZ = 440 + +var frac: float +var player = AudioStreamPlayer.new() +var _phase = 0.0 +var _playback: AudioStreamGeneratorPlayback + +func _fill_buffer(pulse_hz): + var increment = pulse_hz / SAMPLE_HZ + for i in range(_playback.get_frames_available()): + _playback.push_frame(Vector2.ONE * sin(_phase * TAU)) + _phase = fmod(_phase + increment, 1.0) + +func _process(delta): + _fill_buffer(MIN_HZ + (MAX_HZ - MIN_HZ) * frac) + +func _init(): + add_child(player) + player.stream = AudioStreamGenerator.new() + player.stream.buffer_length = 0.05 + player.stream.mix_rate = SAMPLE_HZ + _playback = player.get_stream_playback() + player.play() diff --git a/views/array_view.gd b/views/array_view.gd index 70468e2..3d556d6 100644 --- a/views/array_view.gd +++ b/views/array_view.gd @@ -16,6 +16,7 @@ var _rects = [] var _positions = [] var _pointer = Polygon2D.new() var _pointer_size: int +var _sound = ArraySound.new() onready var _separation = 128 / _level.array.size func _init(level): @@ -23,6 +24,7 @@ func _init(level): add_child(_level) # NOTE: This is necessary for it to read input add_child(_tween) # NOTE: This is necessary for it to animate add_child(_pointer) + add_child(_sound) _pointer.hide() func _ready(): @@ -65,6 +67,7 @@ func _ready(): _pointer.show() func _process(delta): + _sound.frac = _level.get_frac() if _pointer.visible: var pointed = _level.get_pointer() var height = rect_size.y - _pointer_size * 2 @@ -76,6 +79,7 @@ func _process(delta): func _on_ComparisonSort_done(): set_process(false) + _sound.player.stop() _pointer.hide() for i in range(_rects.size()): _rects[i].color = ComparisonSort.EFFECTS.NONE From 1b4bcd7c607dca182182b47ff4f52c89a75a0660 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Fri, 21 Aug 2020 13:24:35 -0500 Subject: [PATCH 02/29] feat: add sounds for all sorts In general, the frequency scales with the current element(s) being compared. --- levels/bogo_sort.gd | 3 +++ levels/cocktail_sort.gd | 3 +++ levels/comb_sort.gd | 3 +++ levels/cycle_sort.gd | 3 +++ levels/insertion_sort.gd | 3 +++ levels/merge_sort.gd | 7 +++++++ levels/odd_even_sort.gd | 3 +++ levels/quick_sort.gd | 3 +++ levels/selection_sort.gd | 3 +++ levels/shell_sort.gd | 3 +++ 10 files changed, 34 insertions(+) diff --git a/levels/bogo_sort.gd b/levels/bogo_sort.gd index fdeac81..666bf12 100644 --- a/levels/bogo_sort.gd +++ b/levels/bogo_sort.gd @@ -19,3 +19,6 @@ func next(action): func get_effect(i): return EFFECTS.NONE + +func get_frac(): + return array.frac(0) diff --git a/levels/cocktail_sort.gd b/levels/cocktail_sort.gd index 0254244..1c3af51 100644 --- a/levels/cocktail_sort.gd +++ b/levels/cocktail_sort.gd @@ -56,3 +56,6 @@ func get_effect(i): if i < _sorted and _forwards == true or i < _sorted - 1 or i >= array.size - _sorted: return EFFECTS.DIMMED return EFFECTS.NONE + +func get_frac(): + return (array.frac(_index) + array.frac(_index + 1)) / 2.0 diff --git a/levels/comb_sort.gd b/levels/comb_sort.gd index 0cda389..57c3015 100644 --- a/levels/comb_sort.gd +++ b/levels/comb_sort.gd @@ -46,3 +46,6 @@ func get_effect(i): if i >= _end: return EFFECTS.DIMMED return EFFECTS.NONE + +func get_frac(): + return (array.frac(_index) + array.frac(_index + _gap)) / 2.0 diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 082b195..97c9f17 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -48,3 +48,6 @@ func get_effect(i): func get_pointer(): return _pointer + +func get_frac(): + return array.frac(_index) diff --git a/levels/insertion_sort.gd b/levels/insertion_sort.gd index 569431d..c7d9712 100644 --- a/levels/insertion_sort.gd +++ b/levels/insertion_sort.gd @@ -50,3 +50,6 @@ func _grow(): if _end == array.size: emit_signal("done") _index = _end + +func get_frac(): + return (array.frac(_index - 1) + array.frac(_index)) / 2.0 diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index 8117b10..1de05d7 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -82,3 +82,10 @@ func _get_middle(): func _get_end(): """Get the index of one past the right subarray's tail.""" return _sub_no * _sub_size + _sub_size + +func get_frac(): + if _left == _get_middle(): + return array.frac(_right) + if _right == _get_end(): + return array.frac(_left) + return (array.frac(_left) + array.frac(_right)) / 2.0 diff --git a/levels/odd_even_sort.gd b/levels/odd_even_sort.gd index fe42671..66ff88e 100644 --- a/levels/odd_even_sort.gd +++ b/levels/odd_even_sort.gd @@ -40,3 +40,6 @@ func get_effect(i): if i == _index or i == _index + 1: return EFFECTS.HIGHLIGHTED return EFFECTS.NONE + +func get_frac(): + return (array.frac(_index) + array.frac(_index + 1)) / 2.0 diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index 3fab846..f9c621f 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -77,3 +77,6 @@ func get_effect(i): func get_pointer(): return _pointer + +func get_frac(): + return array.frac(_index) diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index 32bfbc7..b569693 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -52,3 +52,6 @@ func get_effect(i): func get_pointer(): return _min + +func get_frac(): + return array.frac(_index) diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index cc1675a..b05aa6b 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -58,3 +58,6 @@ func _grow(): _begin = 0 _end = _gap + _begin _index = _gap + _begin + +func get_frac(): + return (array.frac(_index - _gap) + array.frac(_index)) / 2.0 From 8fc061ad8518fe4e01079a7ebc0cee81a38e504d Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 22 Aug 2020 11:52:40 -0500 Subject: [PATCH 03/29] feat: change sine wave to triangle wave This gives the sound a more pleasant, lively, chiptune feeling. --- views/array_sound.gd | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/views/array_sound.gd b/views/array_sound.gd index af2479b..e716548 100644 --- a/views/array_sound.gd +++ b/views/array_sound.gd @@ -3,7 +3,7 @@ extends Node const SAMPLE_HZ = 44100 const MIN_HZ = 110 -const MAX_HZ = 440 +const MAX_HZ = 880 var frac: float var player = AudioStreamPlayer.new() @@ -13,7 +13,7 @@ var _playback: AudioStreamGeneratorPlayback func _fill_buffer(pulse_hz): var increment = pulse_hz / SAMPLE_HZ for i in range(_playback.get_frames_available()): - _playback.push_frame(Vector2.ONE * sin(_phase * TAU)) + _playback.push_frame(Vector2.ONE * triangle(_phase)) _phase = fmod(_phase + increment, 1.0) func _process(delta): @@ -26,3 +26,7 @@ func _init(): player.stream.mix_rate = SAMPLE_HZ _playback = player.get_stream_playback() player.play() + +func triangle(x): + """Generate a triangle wave from the given phase.""" + return 2 / PI * asin(sin(PI * x)) From d40e5aeaedd0e70402a1db12e32af32c86ef452c Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 22 Aug 2020 12:16:08 -0500 Subject: [PATCH 04/29] feat: add ability to toggle sound via hotkey --- project.godot | 5 +++++ scenes/levels.tscn | 4 ++-- views/array_sound.gd | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/project.godot b/project.godot index e5619ac..bcca320 100644 --- a/project.godot +++ b/project.godot @@ -192,6 +192,11 @@ smaller={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) ] } +sound_toggle={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":77,"unicode":0,"echo":false,"script":null) + ] +} [rendering] diff --git a/scenes/levels.tscn b/scenes/levels.tscn index a7fc2c9..b35a711 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -48,11 +48,11 @@ margin_right = 263.0 [node name="Label" type="Label" parent="LevelSelect/LevelsBorder"] margin_left = 20.0 -margin_top = 577.0 +margin_top = 555.0 margin_right = 283.0 margin_bottom = 640.0 size_flags_vertical = 8 -text = "Use the WASD keys to adjust the size and speed of the simulation." +text = "Use the WASD keys to adjust the size and speed of the simulation, and M to toggle sound." autowrap = true [node name="Preview" type="VBoxContainer" parent="LevelSelect"] diff --git a/views/array_sound.gd b/views/array_sound.gd index e716548..6555330 100644 --- a/views/array_sound.gd +++ b/views/array_sound.gd @@ -30,3 +30,10 @@ func _init(): func triangle(x): """Generate a triangle wave from the given phase.""" return 2 / PI * asin(sin(PI * x)) + +func _input(event): + if event.is_action_pressed("sound_toggle"): + # Prevent event from propagating to ComparisonSort trigger + get_tree().set_input_as_handled() + var bus = AudioServer.get_bus_index("Master") + AudioServer.set_bus_mute(bus, not AudioServer.is_bus_mute(bus)) From be42b5660720facf343c53a8db432a832ddc4f54 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Mon, 24 Aug 2020 15:24:30 -0500 Subject: [PATCH 05/29] feat: remove tier system It added a lot of complexity and is imperfect and possibly confusing for little benefit. --- levels/comparison_sort.gd | 3 --- scripts/levels.gd | 26 ++++++------------------- scripts/play.gd | 22 +++++++-------------- scripts/score.gd | 40 ++++++--------------------------------- 4 files changed, 19 insertions(+), 72 deletions(-) diff --git a/levels/comparison_sort.gd b/levels/comparison_sort.gd index 81cc66d..65400ca 100644 --- a/levels/comparison_sort.gd +++ b/levels/comparison_sort.gd @@ -16,8 +16,6 @@ var DESCRIPTION = _get_header().split(" ")[1] var CONTROLS = _get_header().split(" ")[2] var array: ArrayModel -var moves = 0 -var test = _get_header().split(" ")[0] var _timer = Timer.new() @@ -39,7 +37,6 @@ func _ready(): func _input(event): """Pass input events for checking and take appropriate action.""" if event.is_pressed(): - moves += 1 return next(event.as_text()) func next(action): diff --git a/scripts/levels.gd b/scripts/levels.gd index f4a2548..7f2f374 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -30,13 +30,9 @@ func _ready(): button.connect("focus_entered", self, "_on_Button_focus_entered") button.connect("pressed", self, "_on_Button_pressed", [level]) buttons.add_child(button) - var score = HBoxContainer.new() - var time = Label.new() - time.align = Label.ALIGN_RIGHT - time.size_flags_horizontal = Control.SIZE_EXPAND_FILL - var tier = Label.new() - score.add_child(time) - score.add_child(tier) + var score = Label.new() + score.align = Label.ALIGN_RIGHT + score.size_flags_horizontal = Control.SIZE_EXPAND_FILL scores.add_child(score) # Autofocus last played level for button in buttons.get_children(): @@ -50,21 +46,11 @@ func _ready(): func _on_Button_focus_entered(size=_level.array.size): # Update high scores - var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons + var container = $LevelsBorder/Levels/LevelsContainer for i in range(LEVELS.size()): - var score = $LevelsBorder/Levels/LevelsContainer/Scores.get_child(i) - var name = buttons.get_child(i).text + var name = container.get_node("Buttons").get_child(i).text var time = GlobalScore.get_time(name, size) - if time == INF: - score.get_child(0).text = "" - score.get_child(1).text = "INF" - score.get_child(1).add_color_override( - "font_color", GlobalTheme.GREEN) - else: - score.get_child(0).text = "%.3f" % time - score.get_child(1).text = GlobalScore.get_tier(name, size) - score.get_child(1).add_color_override( - "font_color", GlobalScore.get_color(name, size)) + container.get_node("Scores").get_child(i).text = "INF" if time == INF else "%.3f" % time # Pause a bit to show completely sorted array if _level.array.is_sorted(): # Prevent race condition caused by keyboard input during pause diff --git a/scripts/play.gd b/scripts/play.gd index 33dabfe..9c8d5b1 100644 --- a/scripts/play.gd +++ b/scripts/play.gd @@ -30,9 +30,7 @@ func _input(event): func _on_Level_done(level): set_process(false) - var name = level.NAME - var size = level.array.size - var score = get_score() + var time = get_score() var moves = level.moves var restart = Button.new() restart.text = "RESTART LEVEL" @@ -42,24 +40,18 @@ func _on_Level_done(level): var back = Button.new() back.text = "BACK TO LEVEL SELECT" back.connect("pressed", self, "_on_Button_pressed", ["levels"]) - var time = Label.new() - time.text = "%.3f" % score - time.align = Label.ALIGN_RIGHT - time.size_flags_horizontal = Control.SIZE_EXPAND_FILL - var tier = Label.new() - tier.text = GlobalScore.calculate_tier(score, moves) - tier.align = Label.ALIGN_RIGHT - tier.add_color_override( - "font_color", GlobalScore.calculate_color(score, moves)) + var score = Label.new() + score.text = "%.3f" % time + score.align = Label.ALIGN_RIGHT + score.size_flags_horizontal = Control.SIZE_EXPAND_FILL $HUDBorder/HUD/Level.queue_free() $HUDBorder/HUD/Score.queue_free() $HUDBorder/HUD.add_child(restart) $HUDBorder/HUD.add_child(separator) $HUDBorder/HUD.add_child(back) - $HUDBorder/HUD.add_child(time) - $HUDBorder/HUD.add_child(tier) + $HUDBorder/HUD.add_child(score) restart.grab_focus() - GlobalScore.save_score(name, size, score, moves) + GlobalScore.save_score(level.NAME, level.array.size, time) func _on_Button_pressed(scene): GlobalScene.change_scene("res://scenes/" + scene + ".tscn", diff --git a/scripts/score.gd b/scripts/score.gd index a19eeb3..5265bc0 100644 --- a/scripts/score.gd +++ b/scripts/score.gd @@ -4,15 +4,7 @@ Common helper library for scoring functions. extends Node -const TIERS = ["F", "D", "C", "B", "A", "S"] -const COLORS = [ - Color("f44336"), - Color("ff9800"), - Color("ffeb3b"), - Color("4caf50"), - Color("03a9f4"), - Color("e040fb"), -] +const VERSION = 0 # Increment when changing save file format var _save: Dictionary @@ -24,39 +16,19 @@ func _init(): func get_time(name, size): if name in _save and str(size) in _save[name]: - return _save[name][str(size)][0] + return _save[name][str(size)] return INF -func get_tier(name, size): - if name in _save and str(size) in _save[name]: - return _save[name][str(size)][1] - return "" - -func get_color(name, size): - var tier = get_tier(name, size) - return Color.black if tier.empty() else COLORS[TIERS.find(tier)] - -func calculate_tier(time, moves): - return TIERS[min(int(moves / time), TIERS.size() - 1)] - -func calculate_color(time, moves): - return COLORS[TIERS.find(calculate_tier(time, moves))] - -func save_score(name, size, time, moves): +func save_score(name, size, time): if not name in _save: _save[name] = {} if not str(size) in _save[name]: - _save[name][str(size)] = [INF, ""] - var prev_time = get_time(name, size) - var prev_tier = get_tier(name, size) - var tier = calculate_tier(time, moves) - var tier_index = TIERS.find(tier) - if (prev_tier.empty() or tier_index > TIERS.find(prev_tier) - or tier_index == TIERS.find(prev_tier) and time < prev_time): - _save[name][str(size)] = [time, tier] + _save[name][str(size)] = INF + _save[name][str(size)] = min(time, get_time(name, size)) _save() func _save(): + _save["VERSION"] = VERSION var file = File.new() file.open("user://save.json", File.WRITE) file.store_line(to_json(_save)) From 3d43161367ae5b702113cdeb1e43a55bf2e921e2 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 25 Aug 2020 17:02:29 -0500 Subject: [PATCH 06/29] feat: add level name header --- scenes/levels_redesign.gd | 36 +++++++++++++ scenes/levels_redesign.tscn | 101 ++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 scenes/levels_redesign.gd create mode 100644 scenes/levels_redesign.tscn diff --git a/scenes/levels_redesign.gd b/scenes/levels_redesign.gd new file mode 100644 index 0000000..d41439d --- /dev/null +++ b/scenes/levels_redesign.gd @@ -0,0 +1,36 @@ +extends VBoxContainer + +const LEVELS = [ + BubbleSort, + InsertionSort, + SelectionSort, + MergeSort, + QuickSort, + CocktailSort, + ShellSort, + CombSort, + CycleSort, + OddEvenSort, +] + +var _index = 0 +var _level: ComparisonSort + +func _ready(): + _level = LEVELS[_index].new(ArrayModel.new()) + $Names/Current.text = "< " + _level.NAME + " >" + +func _switch_level(index): + if index == -1: + _index = LEVELS.size() - 1 + elif index == LEVELS.size(): + _index = 0 + else: + _index = index + _ready() + +func _input(event): + if event.is_action_pressed("ui_left", true): + _switch_level(_index - 1) + if event.is_action_pressed("ui_right", true): + _switch_level(_index + 1) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn new file mode 100644 index 0000000..d9331c2 --- /dev/null +++ b/scenes/levels_redesign.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://assets/theme.theme" type="Theme" id=1] +[ext_resource path="res://scenes/levels_redesign.gd" type="Script" id=2] + +[node name="Viewport" type="MarginContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Levels" type="VBoxContainer" parent="."] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1260.0 +margin_bottom = 700.0 +script = ExtResource( 2 ) + +[node name="Names" type="HBoxContainer" parent="Levels"] +margin_right = 1240.0 +margin_bottom = 19.0 + +[node name="Current" type="Label" parent="Levels/Names"] +margin_right = 1240.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = "< CURRENT >" +align = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="Levels"] +margin_top = 27.0 +margin_right = 1240.0 +margin_bottom = 134.0 + +[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer"] +margin_right = 616.0 +margin_bottom = 107.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="Levels/HBoxContainer/MarginContainer"] +margin_left = 20.0 +margin_top = 44.0 +margin_right = 596.0 +margin_bottom = 63.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="Levels/HBoxContainer"] +margin_left = 624.0 +margin_right = 1240.0 +margin_bottom = 107.0 +size_flags_horizontal = 3 + +[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer"] +margin_right = 616.0 +margin_bottom = 40.0 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="Levels/HBoxContainer/VBoxContainer"] +margin_top = 48.0 +margin_right = 616.0 +margin_bottom = 107.0 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 200.0 +margin_bottom = 59.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 180.0 +margin_bottom = 39.0 +size_flags_horizontal = 3 + +[node name="MarginContainer2" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 208.0 +margin_right = 408.0 +margin_bottom = 59.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer2"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 180.0 +margin_bottom = 39.0 +size_flags_horizontal = 3 + +[node name="MarginContainer3" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 416.0 +margin_right = 616.0 +margin_bottom = 59.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer3"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 180.0 +margin_bottom = 39.0 +size_flags_horizontal = 3 From c08b9c0a3754bbb708cb4968c2d708453e38d4c7 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 25 Aug 2020 17:46:16 -0500 Subject: [PATCH 07/29] feat: add preview display with feature parity Supports adjusting size and speed just like the old design. --- scenes/levels_redesign.gd | 36 ------------ scenes/levels_redesign.tscn | 107 +++++++++++++++++++++++------------- scenes/menu.tscn | 30 +++++----- scenes/play.tscn | 32 +++++------ scripts/levels_redesign.gd | 71 ++++++++++++++++++++++++ scripts/menu.gd | 2 +- scripts/play.gd | 4 +- views/array_sound.gd | 2 +- 8 files changed, 173 insertions(+), 111 deletions(-) delete mode 100644 scenes/levels_redesign.gd create mode 100644 scripts/levels_redesign.gd diff --git a/scenes/levels_redesign.gd b/scenes/levels_redesign.gd deleted file mode 100644 index d41439d..0000000 --- a/scenes/levels_redesign.gd +++ /dev/null @@ -1,36 +0,0 @@ -extends VBoxContainer - -const LEVELS = [ - BubbleSort, - InsertionSort, - SelectionSort, - MergeSort, - QuickSort, - CocktailSort, - ShellSort, - CombSort, - CycleSort, - OddEvenSort, -] - -var _index = 0 -var _level: ComparisonSort - -func _ready(): - _level = LEVELS[_index].new(ArrayModel.new()) - $Names/Current.text = "< " + _level.NAME + " >" - -func _switch_level(index): - if index == -1: - _index = LEVELS.size() - 1 - elif index == LEVELS.size(): - _index = 0 - else: - _index = index - _ready() - -func _input(event): - if event.is_action_pressed("ui_left", true): - _switch_level(_index - 1) - if event.is_action_pressed("ui_right", true): - _switch_level(_index + 1) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn index d9331c2..149eea9 100644 --- a/scenes/levels_redesign.tscn +++ b/scenes/levels_redesign.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://assets/theme.theme" type="Theme" id=1] -[ext_resource path="res://scenes/levels_redesign.gd" type="Script" id=2] +[ext_resource path="res://scripts/levels_redesign.gd" type="Script" id=2] +[ext_resource path="res://scripts/border.gd" type="Script" id=3] [node name="Viewport" type="MarginContainer"] anchor_right = 1.0 @@ -18,84 +19,116 @@ margin_right = 1260.0 margin_bottom = 700.0 script = ExtResource( 2 ) -[node name="Names" type="HBoxContainer" parent="Levels"] +[node name="NamesContainer" type="MarginContainer" parent="Levels"] margin_right = 1240.0 -margin_bottom = 19.0 +margin_bottom = 59.0 +script = ExtResource( 3 ) -[node name="Current" type="Label" parent="Levels/Names"] -margin_right = 1240.0 +[node name="Names" type="HBoxContainer" parent="Levels/NamesContainer"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1220.0 +margin_bottom = 39.0 + +[node name="Previous" type="Label" parent="Levels/NamesContainer/Names"] +margin_right = 557.0 margin_bottom = 19.0 size_flags_horizontal = 3 -text = "< CURRENT >" +text = "<" +align = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Current" type="Label" parent="Levels/NamesContainer/Names"] +margin_left = 565.0 +margin_right = 635.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 1, 0.690196, 0, 1 ) +text = "CURRENT" align = 1 -[node name="HBoxContainer" type="HBoxContainer" parent="Levels"] -margin_top = 27.0 +[node name="Next" type="Label" parent="Levels/NamesContainer/Names"] +margin_left = 643.0 +margin_right = 1200.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = ">" + +[node name="Info" type="HBoxContainer" parent="Levels"] +margin_top = 67.0 margin_right = 1240.0 -margin_bottom = 134.0 +margin_bottom = 680.0 +size_flags_vertical = 3 -[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer"] +[node name="CodeContainer" type="MarginContainer" parent="Levels/Info"] margin_right = 616.0 -margin_bottom = 107.0 +margin_bottom = 613.0 size_flags_horizontal = 3 +script = ExtResource( 3 ) -[node name="Label" type="Label" parent="Levels/HBoxContainer/MarginContainer"] +[node name="Code" type="Label" parent="Levels/Info/CodeContainer"] margin_left = 20.0 -margin_top = 44.0 +margin_top = 20.0 margin_right = 596.0 -margin_bottom = 63.0 +margin_bottom = 593.0 +size_flags_vertical = 3 -[node name="VBoxContainer" type="VBoxContainer" parent="Levels/HBoxContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="Levels/Info"] margin_left = 624.0 margin_right = 1240.0 -margin_bottom = 107.0 +margin_bottom = 613.0 size_flags_horizontal = 3 -[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer"] +[node name="Display" type="MarginContainer" parent="Levels/Info/VBoxContainer"] margin_right = 616.0 -margin_bottom = 40.0 +margin_bottom = 302.0 size_flags_vertical = 3 +script = ExtResource( 3 ) -[node name="HBoxContainer" type="HBoxContainer" parent="Levels/HBoxContainer/VBoxContainer"] -margin_top = 48.0 +[node name="HBoxContainer" type="HBoxContainer" parent="Levels/Info/VBoxContainer"] +margin_top = 310.0 margin_right = 616.0 -margin_bottom = 107.0 +margin_bottom = 613.0 size_flags_vertical = 3 -[node name="MarginContainer" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +[node name="MarginContainer" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] margin_right = 200.0 -margin_bottom = 59.0 +margin_bottom = 303.0 size_flags_horizontal = 3 -[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer"] +[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer"] margin_left = 20.0 -margin_top = 20.0 +margin_top = 142.0 margin_right = 180.0 -margin_bottom = 39.0 +margin_bottom = 161.0 size_flags_horizontal = 3 -[node name="MarginContainer2" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +[node name="MarginContainer2" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] margin_left = 208.0 margin_right = 408.0 -margin_bottom = 59.0 +margin_bottom = 303.0 size_flags_horizontal = 3 -[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer2"] +[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer2"] margin_left = 20.0 -margin_top = 20.0 +margin_top = 142.0 margin_right = 180.0 -margin_bottom = 39.0 +margin_bottom = 161.0 size_flags_horizontal = 3 -[node name="MarginContainer3" type="MarginContainer" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer"] +[node name="MarginContainer3" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] margin_left = 416.0 margin_right = 616.0 -margin_bottom = 59.0 +margin_bottom = 303.0 size_flags_horizontal = 3 -[node name="Label" type="Label" parent="Levels/HBoxContainer/VBoxContainer/HBoxContainer/MarginContainer3"] +[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer3"] margin_left = 20.0 -margin_top = 20.0 +margin_top = 142.0 margin_right = 180.0 -margin_bottom = 39.0 +margin_bottom = 161.0 size_flags_horizontal = 3 + +[node name="Timer" type="Timer" parent="Levels"] +[connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 0c692e5..e347d85 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -5,10 +5,8 @@ [ext_resource path="res://scripts/border.gd" type="Script" id=3] [node name="Viewport" type="MarginContainer"] -anchor_left = 0.000711028 -anchor_top = 0.00126399 -anchor_right = 1.00071 -anchor_bottom = 1.00126 +anchor_right = 1.0 +anchor_bottom = 1.0 theme = ExtResource( 2 ) custom_constants/margin_right = 40 custom_constants/margin_top = 30 @@ -21,20 +19,20 @@ __meta__ = { [node name="MainMenu" type="VBoxContainer" parent="."] margin_left = 40.0 margin_top = 30.0 -margin_right = 1239.0 -margin_bottom = 689.0 +margin_right = 1240.0 +margin_bottom = 690.0 script = ExtResource( 1 ) [node name="Title" type="Label" parent="MainMenu"] -margin_right = 1199.0 +margin_right = 1200.0 margin_bottom = 19.0 text = "Human Computer Simulator" uppercase = true [node name="Display" type="MarginContainer" parent="MainMenu"] margin_top = 27.0 -margin_right = 1199.0 -margin_bottom = 624.0 +margin_right = 1200.0 +margin_bottom = 625.0 size_flags_vertical = 3 script = ExtResource( 3 ) __meta__ = { @@ -42,15 +40,15 @@ __meta__ = { } [node name="Spacing" type="Control" parent="MainMenu"] -margin_top = 632.0 -margin_right = 1199.0 -margin_bottom = 632.0 +margin_top = 633.0 +margin_right = 1200.0 +margin_bottom = 633.0 [node name="Buttons" type="HBoxContainer" parent="MainMenu"] -margin_left = 289.0 -margin_top = 640.0 -margin_right = 909.0 -margin_bottom = 659.0 +margin_left = 290.0 +margin_top = 641.0 +margin_right = 910.0 +margin_bottom = 660.0 size_flags_horizontal = 4 custom_constants/separation = 500 diff --git a/scenes/play.tscn b/scenes/play.tscn index ba04115..6f13145 100644 --- a/scenes/play.tscn +++ b/scenes/play.tscn @@ -8,41 +8,37 @@ anchor_right = 1.0 anchor_bottom = 1.0 theme = ExtResource( 2 ) -custom_constants/margin_right = 30 -custom_constants/margin_top = 30 -custom_constants/margin_left = 30 -custom_constants/margin_bottom = 30 __meta__ = { "_edit_use_anchors_": false } [node name="GameDisplay" type="VBoxContainer" parent="."] -margin_left = 30.0 -margin_top = 30.0 -margin_right = 1250.0 -margin_bottom = 690.0 +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1260.0 +margin_bottom = 700.0 script = ExtResource( 1 ) [node name="HUDBorder" type="MarginContainer" parent="GameDisplay"] -margin_right = 1220.0 +margin_right = 1240.0 margin_bottom = 59.0 script = ExtResource( 3 ) [node name="HUD" type="HBoxContainer" parent="GameDisplay/HUDBorder"] margin_left = 20.0 margin_top = 20.0 -margin_right = 1200.0 +margin_right = 1220.0 margin_bottom = 39.0 [node name="Level" type="Label" parent="GameDisplay/HUDBorder/HUD"] -margin_right = 586.0 +margin_right = 596.0 margin_bottom = 19.0 size_flags_horizontal = 3 text = "LEVEL" [node name="Score" type="Label" parent="GameDisplay/HUDBorder/HUD"] -margin_left = 594.0 -margin_right = 1180.0 +margin_left = 604.0 +margin_right = 1200.0 margin_bottom = 19.0 size_flags_horizontal = 3 text = "0.000" @@ -50,16 +46,16 @@ align = 2 [node name="Display" type="MarginContainer" parent="GameDisplay"] margin_top = 67.0 -margin_right = 1220.0 -margin_bottom = 660.0 +margin_right = 1240.0 +margin_bottom = 680.0 size_flags_vertical = 3 script = ExtResource( 3 ) [node name="Label" type="Label" parent="GameDisplay/Display"] margin_left = 20.0 -margin_top = 287.0 -margin_right = 1200.0 -margin_bottom = 306.0 +margin_top = 297.0 +margin_right = 1220.0 +margin_bottom = 316.0 text = "ready..." align = 1 diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd new file mode 100644 index 0000000..d7c9b90 --- /dev/null +++ b/scripts/levels_redesign.gd @@ -0,0 +1,71 @@ +extends VBoxContainer + +const LEVELS = [ + BubbleSort, + InsertionSort, + SelectionSort, + MergeSort, + QuickSort, + CocktailSort, + ShellSort, + CombSort, + CycleSort, + OddEvenSort, +] + +const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time +const MAX_WAIT = 4 +const MIN_SIZE = 8 +const MAX_SIZE = 256 + +var _index = 0 +var _level: ComparisonSort +var _size = ArrayModel.DEFAULT_SIZE + +func _ready(): + _level = LEVELS[_index].new(ArrayModel.new(_size)) + _level.connect("done", self, "_on_ComparisonSort_done") + $NamesContainer/Names/Current.text = _level.NAME + for child in $Info/VBoxContainer/Display.get_children(): + child.queue_free() + $Info/VBoxContainer/Display.add_child(ArrayView.new(_level)) + $Timer.start() + +func _switch_level(index): + if index == -1: + _index = LEVELS.size() - 1 + elif index == LEVELS.size(): + _index = 0 + else: + _index = index + _ready() + +func _input(event): + if event.is_action_pressed("ui_cancel"): + GlobalScene.change_scene("res://scenes/menu.tscn") + if event.is_action_pressed("ui_left", true): + _switch_level(_index - 1) + if event.is_action_pressed("ui_right", true): + _switch_level(_index + 1) + if event.is_action_pressed("bigger"): + _size = min(_size * 2, MAX_SIZE) + _ready() + if event.is_action_pressed("smaller"): + _size = max(_size / 2, MIN_SIZE) + _ready() + if event.is_action_pressed("faster"): + $Timer.wait_time = max($Timer.wait_time / 2, MIN_WAIT) + if event.is_action_pressed("slower"): + $Timer.wait_time = min($Timer.wait_time * 2, MAX_WAIT) + if event.is_action_pressed("ui_accept"): + GlobalScene.change_scene("res://scenes/play.tscn", + {"level": LEVELS[_index], "size": _size}) + +func _on_ComparisonSort_done(): + $Timer.stop() + yield(get_tree().create_timer(1), "timeout") + if _level.array.is_sorted(): + _ready() + +func _on_Timer_timeout(): + _level.next(null) diff --git a/scripts/menu.gd b/scripts/menu.gd index e533747..c94c120 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -8,7 +8,7 @@ func _ready(): $Display.add_child(ArrayView.new(_level)) func _on_Start_pressed(): - GlobalScene.change_scene("res://scenes/levels.tscn") + GlobalScene.change_scene("res://scenes/levels_redesign.tscn") func _on_Credits_pressed(): GlobalScene.change_scene("res://scenes/credits.tscn") diff --git a/scripts/play.gd b/scripts/play.gd index 9c8d5b1..18634ea 100644 --- a/scripts/play.gd +++ b/scripts/play.gd @@ -26,7 +26,7 @@ func get_score(): func _input(event): if event.is_action_pressed("ui_cancel"): - _on_Button_pressed("levels") + _on_Button_pressed("levels_redesign") func _on_Level_done(level): set_process(false) @@ -39,7 +39,7 @@ func _on_Level_done(level): separator.text = " / " var back = Button.new() back.text = "BACK TO LEVEL SELECT" - back.connect("pressed", self, "_on_Button_pressed", ["levels"]) + back.connect("pressed", self, "_on_Button_pressed", ["levels_redesign"]) var score = Label.new() score.text = "%.3f" % time score.align = Label.ALIGN_RIGHT diff --git a/views/array_sound.gd b/views/array_sound.gd index 6555330..e5e7c85 100644 --- a/views/array_sound.gd +++ b/views/array_sound.gd @@ -22,7 +22,7 @@ func _process(delta): func _init(): add_child(player) player.stream = AudioStreamGenerator.new() - player.stream.buffer_length = 0.05 + player.stream.buffer_length = 0.1 player.stream.mix_rate = SAMPLE_HZ _playback = player.get_stream_playback() player.play() From b74fed6bfca377c92e45dc03b39c113c4eb02eac Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 27 Aug 2020 18:12:53 -0500 Subject: [PATCH 08/29] feat: add placeholder stats and high scores GUI --- scenes/levels_redesign.tscn | 83 ++++++++++++++++++++++++++----------- scripts/levels_redesign.gd | 6 +-- scripts/play.gd | 1 - 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn index 149eea9..05c8eef 100644 --- a/scenes/levels_redesign.tscn +++ b/scenes/levels_redesign.tscn @@ -55,78 +55,111 @@ margin_bottom = 19.0 size_flags_horizontal = 3 text = ">" -[node name="Info" type="HBoxContainer" parent="Levels"] +[node name="Level" type="HBoxContainer" parent="Levels"] margin_top = 67.0 margin_right = 1240.0 margin_bottom = 680.0 size_flags_vertical = 3 -[node name="CodeContainer" type="MarginContainer" parent="Levels/Info"] +[node name="CodeContainer" type="MarginContainer" parent="Levels/Level"] margin_right = 616.0 margin_bottom = 613.0 size_flags_horizontal = 3 script = ExtResource( 3 ) -[node name="Code" type="Label" parent="Levels/Info/CodeContainer"] +[node name="Code" type="Label" parent="Levels/Level/CodeContainer"] margin_left = 20.0 margin_top = 20.0 margin_right = 596.0 margin_bottom = 593.0 size_flags_vertical = 3 -[node name="VBoxContainer" type="VBoxContainer" parent="Levels/Info"] +[node name="Info" type="VBoxContainer" parent="Levels/Level"] margin_left = 624.0 margin_right = 1240.0 margin_bottom = 613.0 size_flags_horizontal = 3 -[node name="Display" type="MarginContainer" parent="Levels/Info/VBoxContainer"] +[node name="Display" type="MarginContainer" parent="Levels/Level/Info"] margin_right = 616.0 margin_bottom = 302.0 size_flags_vertical = 3 script = ExtResource( 3 ) -[node name="HBoxContainer" type="HBoxContainer" parent="Levels/Info/VBoxContainer"] +[node name="Footer" type="HBoxContainer" parent="Levels/Level/Info"] margin_top = 310.0 margin_right = 616.0 margin_bottom = 613.0 size_flags_vertical = 3 -[node name="MarginContainer" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] -margin_right = 200.0 +[node name="Meta" type="VBoxContainer" parent="Levels/Level/Info/Footer"] +margin_right = 304.0 margin_bottom = 303.0 size_flags_horizontal = 3 -[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer"] +[node name="StatsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] +margin_right = 304.0 +margin_bottom = 125.0 +script = ExtResource( 3 ) + +[node name="Stats" type="Label" parent="Levels/Level/Info/Footer/Meta/StatsContainer"] margin_left = 20.0 -margin_top = 142.0 -margin_right = 180.0 -margin_bottom = 161.0 +margin_top = 20.0 +margin_right = 284.0 +margin_bottom = 105.0 size_flags_horizontal = 3 - -[node name="MarginContainer2" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] -margin_left = 208.0 -margin_right = 408.0 +text = "Best-case time: +Average-case time: +Worst-case time: +Worst-case space:" + +[node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] +margin_top = 133.0 +margin_right = 304.0 margin_bottom = 303.0 -size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 3 ) -[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer2"] +[node name="Scores" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer"] margin_left = 20.0 -margin_top = 142.0 -margin_right = 180.0 -margin_bottom = 161.0 +margin_top = 20.0 +margin_right = 284.0 +margin_bottom = 150.0 + +[node name="Sizes" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +margin_right = 30.0 +margin_bottom = 129.0 +text = " +8 +16 +32 +64 +128" + +[node name="Times" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +margin_left = 38.0 +margin_right = 264.0 +margin_bottom = 129.0 size_flags_horizontal = 3 +text = "HIGH SCORES +INF +INF +INF +INF +INF" +align = 1 -[node name="MarginContainer3" type="MarginContainer" parent="Levels/Info/VBoxContainer/HBoxContainer"] -margin_left = 416.0 +[node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer"] +margin_left = 312.0 margin_right = 616.0 margin_bottom = 303.0 size_flags_horizontal = 3 +script = ExtResource( 3 ) -[node name="Label" type="Label" parent="Levels/Info/VBoxContainer/HBoxContainer/MarginContainer3"] +[node name="Controls" type="Label" parent="Levels/Level/Info/Footer/ControlsContainer"] margin_left = 20.0 margin_top = 142.0 -margin_right = 180.0 +margin_right = 284.0 margin_bottom = 161.0 size_flags_horizontal = 3 diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd index d7c9b90..fe9c9b2 100644 --- a/scripts/levels_redesign.gd +++ b/scripts/levels_redesign.gd @@ -16,7 +16,7 @@ const LEVELS = [ const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time const MAX_WAIT = 4 const MIN_SIZE = 8 -const MAX_SIZE = 256 +const MAX_SIZE = 128 var _index = 0 var _level: ComparisonSort @@ -26,9 +26,9 @@ func _ready(): _level = LEVELS[_index].new(ArrayModel.new(_size)) _level.connect("done", self, "_on_ComparisonSort_done") $NamesContainer/Names/Current.text = _level.NAME - for child in $Info/VBoxContainer/Display.get_children(): + for child in $Level/Info/Display.get_children(): child.queue_free() - $Info/VBoxContainer/Display.add_child(ArrayView.new(_level)) + $Level/Info/Display.add_child(ArrayView.new(_level)) $Timer.start() func _switch_level(index): diff --git a/scripts/play.gd b/scripts/play.gd index 18634ea..0ad6cf9 100644 --- a/scripts/play.gd +++ b/scripts/play.gd @@ -31,7 +31,6 @@ func _input(event): func _on_Level_done(level): set_process(false) var time = get_score() - var moves = level.moves var restart = Button.new() restart.text = "RESTART LEVEL" restart.connect("pressed", self, "_on_Button_pressed", ["play"]) From 7671115930cd59cb9c395b53a67cc4b3c0fc4fdf Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Fri, 28 Aug 2020 17:09:38 -0500 Subject: [PATCH 09/29] feat: implement score loading --- scenes/levels_redesign.tscn | 59 ++++++++++++++++++++++++++----------- scripts/levels_redesign.gd | 10 +++++++ 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn index 05c8eef..fc44264 100644 --- a/scenes/levels_redesign.tscn +++ b/scenes/levels_redesign.tscn @@ -82,19 +82,19 @@ size_flags_horizontal = 3 [node name="Display" type="MarginContainer" parent="Levels/Level/Info"] margin_right = 616.0 -margin_bottom = 302.0 +margin_bottom = 276.0 size_flags_vertical = 3 script = ExtResource( 3 ) [node name="Footer" type="HBoxContainer" parent="Levels/Level/Info"] -margin_top = 310.0 +margin_top = 284.0 margin_right = 616.0 margin_bottom = 613.0 size_flags_vertical = 3 [node name="Meta" type="VBoxContainer" parent="Levels/Level/Info/Footer"] margin_right = 304.0 -margin_bottom = 303.0 +margin_bottom = 329.0 size_flags_horizontal = 3 [node name="StatsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] @@ -116,51 +116,74 @@ Worst-case space:" [node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] margin_top = 133.0 margin_right = 304.0 -margin_bottom = 303.0 +margin_bottom = 329.0 size_flags_vertical = 3 script = ExtResource( 3 ) -[node name="Scores" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer"] +[node name="Scores" type="VBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer"] margin_left = 20.0 margin_top = 20.0 margin_right = 284.0 -margin_bottom = 150.0 +margin_bottom = 176.0 -[node name="Sizes" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +[node name="Header" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +margin_right = 264.0 +margin_bottom = 41.0 + +[node name="Size" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Header"] +margin_right = 40.0 +margin_bottom = 41.0 +text = "SIZE +----" + +[node name="Time" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Header"] +margin_left = 48.0 +margin_right = 264.0 +margin_bottom = 41.0 +size_flags_horizontal = 3 +text = "HIGH SCORE +----------" +align = 2 + +[node name="Data" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +margin_top = 49.0 +margin_right = 264.0 +margin_bottom = 156.0 + +[node name="Sizes" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Data"] margin_right = 30.0 -margin_bottom = 129.0 -text = " -8 +margin_bottom = 107.0 +text = "8 16 32 64 128" -[node name="Times" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] +[node name="Times" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Data"] margin_left = 38.0 margin_right = 264.0 -margin_bottom = 129.0 +margin_bottom = 107.0 size_flags_horizontal = 3 -text = "HIGH SCORES -INF +text = "INF INF INF INF INF" -align = 1 +align = 2 +uppercase = true [node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer"] margin_left = 312.0 margin_right = 616.0 -margin_bottom = 303.0 +margin_bottom = 329.0 size_flags_horizontal = 3 script = ExtResource( 3 ) [node name="Controls" type="Label" parent="Levels/Level/Info/Footer/ControlsContainer"] margin_left = 20.0 -margin_top = 142.0 +margin_top = 155.0 margin_right = 284.0 -margin_bottom = 161.0 +margin_bottom = 174.0 size_flags_horizontal = 3 [node name="Timer" type="Timer" parent="Levels"] diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd index fe9c9b2..674b9b4 100644 --- a/scripts/levels_redesign.gd +++ b/scripts/levels_redesign.gd @@ -30,6 +30,16 @@ func _ready(): child.queue_free() $Level/Info/Display.add_child(ArrayView.new(_level)) $Timer.start() + _load_scores(_level) + +func _load_scores(level): + var data = $Level/Info/Footer/Meta/ScoresContainer/Scores/Data + data.get_node("Times").text = "" + for i in data.get_node("Sizes").text.split("\n"): + var time = str(GlobalScore.get_time(level.NAME, int(i))) + data.get_node("Times").text += time + if int(i) != MAX_SIZE: + data.get_node("Times").text += "\n" func _switch_level(index): if index == -1: From 85dfe671e8a9a5bbe637c825f82c7304d93e71db Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Fri, 28 Aug 2020 17:43:04 -0500 Subject: [PATCH 10/29] feat: implement help modal in main menu --- scenes/menu.tscn | 57 ++++++++++++++++++++++++++++++++++++++++++------ scripts/menu.gd | 12 +++++++++- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/scenes/menu.tscn b/scenes/menu.tscn index e347d85..651f267 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -5,8 +5,10 @@ [ext_resource path="res://scripts/border.gd" type="Script" id=3] [node name="Viewport" type="MarginContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 +anchor_left = 0.00078125 +anchor_top = 0.00138889 +anchor_right = 1.00078 +anchor_bottom = 1.00139 theme = ExtResource( 2 ) custom_constants/margin_right = 40 custom_constants/margin_top = 30 @@ -39,35 +41,76 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="Instructions" type="MarginContainer" parent="MainMenu/Display"] +visible = false +margin_left = 480.0 +margin_top = 201.0 +margin_right = 720.0 +margin_bottom = 397.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource( 3 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="MainMenu/Display/Instructions"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 220.0 +margin_bottom = 176.0 + +[node name="Label" type="Label" parent="MainMenu/Display/Instructions/VBoxContainer"] +margin_right = 200.0 +margin_bottom = 129.0 +size_flags_horizontal = 4 +text = "W - bigger +A - slower +S - smaller +D - faster +M - toggle sound +F - big preview mode" + +[node name="Button" type="Button" parent="MainMenu/Display/Instructions/VBoxContainer"] +margin_top = 137.0 +margin_right = 200.0 +margin_bottom = 156.0 +text = "OK" + [node name="Spacing" type="Control" parent="MainMenu"] margin_top = 633.0 margin_right = 1200.0 margin_bottom = 633.0 [node name="Buttons" type="HBoxContainer" parent="MainMenu"] -margin_left = 290.0 +margin_left = 20.0 margin_top = 641.0 -margin_right = 910.0 +margin_right = 1180.0 margin_bottom = 660.0 size_flags_horizontal = 4 custom_constants/separation = 500 +[node name="Help" type="Button" parent="MainMenu/Buttons"] +margin_right = 40.0 +margin_bottom = 19.0 +text = "HELP" + [node name="Start" type="Button" parent="MainMenu/Buttons"] -margin_right = 50.0 +margin_left = 540.0 +margin_right = 590.0 margin_bottom = 19.0 size_flags_horizontal = 4 text = "START" flat = true [node name="Credits" type="Button" parent="MainMenu/Buttons"] -margin_left = 550.0 -margin_right = 620.0 +margin_left = 1090.0 +margin_right = 1160.0 margin_bottom = 19.0 text = "CREDITS" [node name="Timer" type="Timer" parent="."] wait_time = 0.25 autostart = true +[connection signal="pressed" from="MainMenu/Display/Instructions/VBoxContainer/Button" to="MainMenu" method="_on_Button_pressed"] +[connection signal="pressed" from="MainMenu/Buttons/Help" to="MainMenu" method="_on_Help_pressed"] [connection signal="pressed" from="MainMenu/Buttons/Start" to="MainMenu" method="_on_Start_pressed"] [connection signal="pressed" from="MainMenu/Buttons/Credits" to="MainMenu" method="_on_Credits_pressed"] [connection signal="timeout" from="Timer" to="MainMenu" method="_on_Timer_timeout"] diff --git a/scripts/menu.gd b/scripts/menu.gd index c94c120..9095f26 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -5,7 +5,7 @@ var _level = BogoSort.new(ArrayModel.new()) func _ready(): $Buttons/Start.grab_focus() randomize() - $Display.add_child(ArrayView.new(_level)) + $Display.add_child(ArrayView.new(_level), true) func _on_Start_pressed(): GlobalScene.change_scene("res://scenes/levels_redesign.tscn") @@ -13,6 +13,11 @@ func _on_Start_pressed(): func _on_Credits_pressed(): GlobalScene.change_scene("res://scenes/credits.tscn") +func _on_Help_pressed(): + $Display/Instructions.show() + $Display/HBoxContainer.hide() + $Display/Instructions/VBoxContainer/Button.grab_focus() + func _on_Timer_timeout(): _level.next(null) @@ -20,3 +25,8 @@ func _input(event): # If not in a browser, close the app if event.is_action_pressed("ui_cancel") and OS.get_name() != "HTML5": get_tree().quit() + +func _on_Button_pressed(): + $Display/Instructions.hide() + $Display/HBoxContainer.show() + $Buttons/Start.grab_focus() From a971c3eda86f95e3be322e2c926ffb3e85e2a128 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 29 Aug 2020 17:51:22 -0500 Subject: [PATCH 11/29] refactor: simplify interface Removed the stats box for time and space complexity to allow for future average-of-five scoring system. --- scenes/levels_redesign.tscn | 113 ++++++++++++++++-------------------- scenes/menu.tscn | 74 ++++++++++++++--------- scripts/levels_redesign.gd | 6 +- scripts/menu.gd | 6 +- 4 files changed, 101 insertions(+), 98 deletions(-) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn index fc44264..9364ec4 100644 --- a/scenes/levels_redesign.tscn +++ b/scenes/levels_redesign.tscn @@ -61,96 +61,95 @@ margin_right = 1240.0 margin_bottom = 680.0 size_flags_vertical = 3 -[node name="CodeContainer" type="MarginContainer" parent="Levels/Level"] +[node name="Left" type="MarginContainer" parent="Levels/Level"] margin_right = 616.0 margin_bottom = 613.0 size_flags_horizontal = 3 script = ExtResource( 3 ) -[node name="Code" type="Label" parent="Levels/Level/CodeContainer"] +[node name="Code" type="Label" parent="Levels/Level/Left"] margin_left = 20.0 margin_top = 20.0 margin_right = 596.0 margin_bottom = 593.0 size_flags_vertical = 3 +text = "\"\"\" +This is a description for the level in the form of psuedocode. +\"\"\" -[node name="Info" type="VBoxContainer" parent="Levels/Level"] +def algorithm(parameter): + return result" +autowrap = true + +[node name="Right" type="VBoxContainer" parent="Levels/Level"] margin_left = 624.0 margin_right = 1240.0 margin_bottom = 613.0 size_flags_horizontal = 3 -[node name="Display" type="MarginContainer" parent="Levels/Level/Info"] +[node name="Display" type="MarginContainer" parent="Levels/Level/Right"] margin_right = 616.0 -margin_bottom = 276.0 +margin_bottom = 431.0 size_flags_vertical = 3 script = ExtResource( 3 ) -[node name="Footer" type="HBoxContainer" parent="Levels/Level/Info"] -margin_top = 284.0 +[node name="Info" type="HBoxContainer" parent="Levels/Level/Right"] +margin_top = 439.0 margin_right = 616.0 margin_bottom = 613.0 -size_flags_vertical = 3 -[node name="Meta" type="VBoxContainer" parent="Levels/Level/Info/Footer"] -margin_right = 304.0 -margin_bottom = 329.0 +[node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] +margin_right = 405.0 +margin_bottom = 174.0 size_flags_horizontal = 3 - -[node name="StatsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] -margin_right = 304.0 -margin_bottom = 125.0 +size_flags_stretch_ratio = 2.0 script = ExtResource( 3 ) -[node name="Stats" type="Label" parent="Levels/Level/Info/Footer/Meta/StatsContainer"] +[node name="Controls" type="Label" parent="Levels/Level/Right/Info/ControlsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 284.0 -margin_bottom = 105.0 +margin_right = 385.0 +margin_bottom = 154.0 +size_flags_vertical = 1 +text = "These are the controls for the level." +autowrap = true + +[node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] +margin_left = 413.0 +margin_right = 616.0 +margin_bottom = 174.0 size_flags_horizontal = 3 -text = "Best-case time: -Average-case time: -Worst-case time: -Worst-case space:" - -[node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Info/Footer/Meta"] -margin_top = 133.0 -margin_right = 304.0 -margin_bottom = 329.0 -size_flags_vertical = 3 script = ExtResource( 3 ) -[node name="Scores" type="VBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer"] +[node name="Scores" type="VBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 284.0 -margin_bottom = 176.0 +margin_right = 183.0 +margin_bottom = 154.0 -[node name="Header" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] -margin_right = 264.0 -margin_bottom = 41.0 +[node name="Header" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] +margin_right = 163.0 +margin_bottom = 19.0 -[node name="Size" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Header"] +[node name="Size" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] margin_right = 40.0 -margin_bottom = 41.0 -text = "SIZE -----" +margin_bottom = 19.0 +text = "SIZE" -[node name="Time" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Header"] +[node name="Time" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] margin_left = 48.0 -margin_right = 264.0 -margin_bottom = 41.0 +margin_right = 163.0 +margin_bottom = 19.0 size_flags_horizontal = 3 -text = "HIGH SCORE -----------" +text = "HIGH SCORE" align = 2 -[node name="Data" type="HBoxContainer" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores"] -margin_top = 49.0 -margin_right = 264.0 -margin_bottom = 156.0 +[node name="Data" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] +margin_top = 27.0 +margin_right = 163.0 +margin_bottom = 134.0 -[node name="Sizes" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Data"] +[node name="Sizes" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] margin_right = 30.0 margin_bottom = 107.0 text = "8 @@ -159,9 +158,9 @@ text = "8 64 128" -[node name="Times" type="Label" parent="Levels/Level/Info/Footer/Meta/ScoresContainer/Scores/Data"] +[node name="Times" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] margin_left = 38.0 -margin_right = 264.0 +margin_right = 163.0 margin_bottom = 107.0 size_flags_horizontal = 3 text = "INF @@ -172,19 +171,5 @@ INF" align = 2 uppercase = true -[node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Info/Footer"] -margin_left = 312.0 -margin_right = 616.0 -margin_bottom = 329.0 -size_flags_horizontal = 3 -script = ExtResource( 3 ) - -[node name="Controls" type="Label" parent="Levels/Level/Info/Footer/ControlsContainer"] -margin_left = 20.0 -margin_top = 155.0 -margin_right = 284.0 -margin_bottom = 174.0 -size_flags_horizontal = 3 - [node name="Timer" type="Timer" parent="Levels"] [connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 651f267..c89f1a5 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -21,19 +21,19 @@ __meta__ = { [node name="MainMenu" type="VBoxContainer" parent="."] margin_left = 40.0 margin_top = 30.0 -margin_right = 1240.0 +margin_right = 1239.0 margin_bottom = 690.0 script = ExtResource( 1 ) [node name="Title" type="Label" parent="MainMenu"] -margin_right = 1200.0 +margin_right = 1199.0 margin_bottom = 19.0 text = "Human Computer Simulator" uppercase = true [node name="Display" type="MarginContainer" parent="MainMenu"] margin_top = 27.0 -margin_right = 1200.0 +margin_right = 1199.0 margin_bottom = 625.0 size_flags_vertical = 3 script = ExtResource( 3 ) @@ -41,48 +41,66 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="Instructions" type="MarginContainer" parent="MainMenu/Display"] +[node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] visible = false -margin_left = 480.0 -margin_top = 201.0 -margin_right = 720.0 -margin_bottom = 397.0 +margin_left = 504.0 +margin_top = 197.0 +margin_right = 694.0 +margin_bottom = 401.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) -[node name="VBoxContainer" type="VBoxContainer" parent="MainMenu/Display/Instructions"] +[node name="Instructions" type="VBoxContainer" parent="MainMenu/Display/InstructionsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 220.0 -margin_bottom = 176.0 +margin_right = 170.0 +margin_bottom = 184.0 +custom_constants/separation = 16 -[node name="Label" type="Label" parent="MainMenu/Display/Instructions/VBoxContainer"] -margin_right = 200.0 +[node name="Controls" type="HBoxContainer" parent="MainMenu/Display/InstructionsContainer/Instructions"] +margin_right = 150.0 +margin_bottom = 129.0 +custom_constants/separation = 20 + +[node name="Keys" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] +margin_right = 10.0 margin_bottom = 129.0 size_flags_horizontal = 4 -text = "W - bigger -A - slower -S - smaller -D - faster -M - toggle sound -F - big preview mode" - -[node name="Button" type="Button" parent="MainMenu/Display/Instructions/VBoxContainer"] -margin_top = 137.0 -margin_right = 200.0 -margin_bottom = 156.0 +text = "W +A +S +D +M +F" + +[node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] +margin_left = 30.0 +margin_right = 150.0 +margin_bottom = 129.0 +text = "bigger +slower +smaller +faster +sound +big preview " +align = 2 + +[node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] +margin_top = 141.0 +margin_right = 150.0 +margin_bottom = 160.0 text = "OK" [node name="Spacing" type="Control" parent="MainMenu"] margin_top = 633.0 -margin_right = 1200.0 +margin_right = 1199.0 margin_bottom = 633.0 [node name="Buttons" type="HBoxContainer" parent="MainMenu"] -margin_left = 20.0 +margin_left = 19.0 margin_top = 641.0 -margin_right = 1180.0 +margin_right = 1179.0 margin_bottom = 660.0 size_flags_horizontal = 4 custom_constants/separation = 500 @@ -109,7 +127,7 @@ text = "CREDITS" [node name="Timer" type="Timer" parent="."] wait_time = 0.25 autostart = true -[connection signal="pressed" from="MainMenu/Display/Instructions/VBoxContainer/Button" to="MainMenu" method="_on_Button_pressed"] +[connection signal="pressed" from="MainMenu/Display/InstructionsContainer/Instructions/Button" to="MainMenu" method="_on_Button_pressed"] [connection signal="pressed" from="MainMenu/Buttons/Help" to="MainMenu" method="_on_Help_pressed"] [connection signal="pressed" from="MainMenu/Buttons/Start" to="MainMenu" method="_on_Start_pressed"] [connection signal="pressed" from="MainMenu/Buttons/Credits" to="MainMenu" method="_on_Credits_pressed"] diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd index 674b9b4..736146a 100644 --- a/scripts/levels_redesign.gd +++ b/scripts/levels_redesign.gd @@ -26,14 +26,14 @@ func _ready(): _level = LEVELS[_index].new(ArrayModel.new(_size)) _level.connect("done", self, "_on_ComparisonSort_done") $NamesContainer/Names/Current.text = _level.NAME - for child in $Level/Info/Display.get_children(): + for child in $Level/Right/Display.get_children(): child.queue_free() - $Level/Info/Display.add_child(ArrayView.new(_level)) + $Level/Right/Display.add_child(ArrayView.new(_level)) $Timer.start() _load_scores(_level) func _load_scores(level): - var data = $Level/Info/Footer/Meta/ScoresContainer/Scores/Data + var data = $Level/Right/Info/ScoresContainer/Scores/Data data.get_node("Times").text = "" for i in data.get_node("Sizes").text.split("\n"): var time = str(GlobalScore.get_time(level.NAME, int(i))) diff --git a/scripts/menu.gd b/scripts/menu.gd index 9095f26..27d1e85 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -14,9 +14,9 @@ func _on_Credits_pressed(): GlobalScene.change_scene("res://scenes/credits.tscn") func _on_Help_pressed(): - $Display/Instructions.show() + $Display/InstructionsContainer.show() $Display/HBoxContainer.hide() - $Display/Instructions/VBoxContainer/Button.grab_focus() + $Display/InstructionsContainer/Instructions/Button.grab_focus() func _on_Timer_timeout(): _level.next(null) @@ -27,6 +27,6 @@ func _input(event): get_tree().quit() func _on_Button_pressed(): - $Display/Instructions.hide() + $Display/InstructionsContainer.hide() $Display/HBoxContainer.show() $Buttons/Start.grab_focus() From 85df253427d28c1f01836776d56659d99c608a01 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 29 Aug 2020 21:13:41 -0500 Subject: [PATCH 12/29] fix: reimplement remembering last played level Going back to the level select scene will put you on the sort and size that you just played. --- scenes/levels_redesign.tscn | 4 +--- scripts/levels_redesign.gd | 6 ++++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn index 9364ec4..37c7863 100644 --- a/scenes/levels_redesign.tscn +++ b/scenes/levels_redesign.tscn @@ -73,9 +73,7 @@ margin_top = 20.0 margin_right = 596.0 margin_bottom = 593.0 size_flags_vertical = 3 -text = "\"\"\" -This is a description for the level in the form of psuedocode. -\"\"\" +text = "This is a description for the level in the form of psuedocode. def algorithm(parameter): return result" diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd index 736146a..87cf192 100644 --- a/scripts/levels_redesign.gd +++ b/scripts/levels_redesign.gd @@ -18,11 +18,13 @@ const MAX_WAIT = 4 const MIN_SIZE = 8 const MAX_SIZE = 128 -var _index = 0 +var _index = LEVELS.find(GlobalScene.get_param("level")) var _level: ComparisonSort -var _size = ArrayModel.DEFAULT_SIZE +var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) func _ready(): + if _index == -1: + _index = 0 _level = LEVELS[_index].new(ArrayModel.new(_size)) _level.connect("done", self, "_on_ComparisonSort_done") $NamesContainer/Names/Current.text = _level.NAME From 17facae4f7604c06d6d0095476fc63264772454a Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 29 Aug 2020 21:22:10 -0500 Subject: [PATCH 13/29] feat: add space and escape keys to help menu --- scenes/menu.tscn | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/scenes/menu.tscn b/scenes/menu.tscn index c89f1a5..43ae0a8 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -43,10 +43,10 @@ __meta__ = { [node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] visible = false -margin_left = 504.0 -margin_top = 197.0 -margin_right = 694.0 -margin_bottom = 401.0 +margin_left = 489.0 +margin_top = 175.0 +margin_right = 709.0 +margin_bottom = 423.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -54,42 +54,46 @@ script = ExtResource( 3 ) [node name="Instructions" type="VBoxContainer" parent="MainMenu/Display/InstructionsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 170.0 -margin_bottom = 184.0 +margin_right = 200.0 +margin_bottom = 228.0 custom_constants/separation = 16 [node name="Controls" type="HBoxContainer" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_right = 150.0 -margin_bottom = 129.0 +margin_right = 180.0 +margin_bottom = 173.0 custom_constants/separation = 20 [node name="Keys" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] -margin_right = 10.0 -margin_bottom = 129.0 +margin_right = 50.0 +margin_bottom = 173.0 size_flags_horizontal = 4 text = "W A S D M -F" +F +space +esc" [node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] -margin_left = 30.0 -margin_right = 150.0 -margin_bottom = 129.0 +margin_left = 70.0 +margin_right = 180.0 +margin_bottom = 173.0 text = "bigger slower smaller faster sound -big preview " +big preview +confirm +back" align = 2 [node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_top = 141.0 -margin_right = 150.0 -margin_bottom = 160.0 +margin_top = 189.0 +margin_right = 180.0 +margin_bottom = 208.0 text = "OK" [node name="Spacing" type="Control" parent="MainMenu"] From 49db1dcc85484316ae3d1ab06fb90746c2d8c09a Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 29 Aug 2020 21:26:00 -0500 Subject: [PATCH 14/29] feat: reimplement description and controls display --- levels/bogo_sort.gd | 2 ++ levels/bubble_sort.gd | 2 ++ levels/cocktail_sort.gd | 2 ++ levels/comb_sort.gd | 2 ++ levels/comparison_sort.gd | 6 +++--- levels/cycle_sort.gd | 2 ++ levels/insertion_sort.gd | 2 ++ levels/merge_sort.gd | 2 ++ levels/odd_even_sort.gd | 2 ++ levels/quick_sort.gd | 2 ++ levels/selection_sort.gd | 2 ++ levels/shell_sort.gd | 2 ++ scripts/levels_redesign.gd | 2 ++ 13 files changed, 27 insertions(+), 3 deletions(-) diff --git a/levels/bogo_sort.gd b/levels/bogo_sort.gd index 666bf12..2971418 100644 --- a/levels/bogo_sort.gd +++ b/levels/bogo_sort.gd @@ -1,8 +1,10 @@ """ BOGOSORT + Generates random permutations until the array is sorted. + Keep on hitting RIGHT ARROW to CONTINUE and hope for the best! """ diff --git a/levels/bubble_sort.gd b/levels/bubble_sort.gd index 8b8e913..6fdc66f 100644 --- a/levels/bubble_sort.gd +++ b/levels/bubble_sort.gd @@ -1,12 +1,14 @@ """ BUBBLE SORT + Bubble sort iterates through the array and looks at each pair of elements, swapping them if they are out of order. When it has gone through the entire array without swapping a single pair, it has finished. Though simple to understand, bubble sort is hopelessly inefficient on all but the smallest of arrays. + If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ diff --git a/levels/cocktail_sort.gd b/levels/cocktail_sort.gd index 1c3af51..1a243e3 100644 --- a/levels/cocktail_sort.gd +++ b/levels/cocktail_sort.gd @@ -1,9 +1,11 @@ """ COCKTAIL SORT + Cocktail shaker sort is a variation of bubble sort that alternates going backwards and forwards. + If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ diff --git a/levels/comb_sort.gd b/levels/comb_sort.gd index 57c3015..693005d 100644 --- a/levels/comb_sort.gd +++ b/levels/comb_sort.gd @@ -1,8 +1,10 @@ """ COMB SORT + Comb sort is a variant of bubble sort that operates on gapped arrays. + If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ diff --git a/levels/comparison_sort.gd b/levels/comparison_sort.gd index 65400ca..30932e9 100644 --- a/levels/comparison_sort.gd +++ b/levels/comparison_sort.gd @@ -11,9 +11,9 @@ const EFFECTS = { } const DISABLE_TIME = 1.0 -var NAME = _get_header().split(" ")[0] -var DESCRIPTION = _get_header().split(" ")[1] -var CONTROLS = _get_header().split(" ")[2] +var NAME = _get_header().split(" ")[0] +var DESCRIPTION = _get_header().split(" ")[1] +var CONTROLS = _get_header().split(" ")[2] var array: ArrayModel diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 97c9f17..243e352 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -1,10 +1,12 @@ """ CYCLE SORT + Cycle sort repeatedly counts the number of elements less than the first and swaps it with that index until the smallest element is reached. Then it does this process starting at the next out-of-place element. + If the highlighted element is less than the pointer, hit LEFT ARROW. Otherwise, hit RIGHT ARROW. """ diff --git a/levels/insertion_sort.gd b/levels/insertion_sort.gd index c7d9712..39680de 100644 --- a/levels/insertion_sort.gd +++ b/levels/insertion_sort.gd @@ -1,12 +1,14 @@ """ INSERTION SORT + Insertion sort goes through the array and inserts each element into its correct position. It is most similar to how most people would sort a deck of cards. It is also slow on large arrays but it is one of the faster quadratic algorithms. It is often used to sort smaller subarrays in hybrid sorting algorithms. + Hit LEFT ARROW to swap the two highlighted elements as long as they are out of order. When this is no longer the case, hit RIGHT ARROW to advance. diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index 1de05d7..f85de24 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -1,12 +1,14 @@ """ MERGE SORT + Merge sort is an efficient sorting algorithm that splits the array into single-element chunks. Then it merges each pair of chunks until only one sorted chunk is left by repeatedly choosing the smaller element at the head of each chunk and moving the head back. However, it needs an entire array's worth of auxiliary memory. + Press the ARROW KEY corresponding to the side that the smaller highlighted element is on. If you've reached the end of one side, press the other side's ARROW KEY. diff --git a/levels/odd_even_sort.gd b/levels/odd_even_sort.gd index 66ff88e..3f7d955 100644 --- a/levels/odd_even_sort.gd +++ b/levels/odd_even_sort.gd @@ -1,9 +1,11 @@ """ ODD-EVEN SORT + Odd-even sort is a variant of bubble sort that alternates on elements at odd and even indices. + If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index f9c621f..b94e4c4 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -1,6 +1,7 @@ """ QUICKSORT + Quicksort designates the last element as the pivot and puts everything less than the pivot before it and everything greater after it. This partitioning is done by iterating through the array while keeping track @@ -9,6 +10,7 @@ less than the pivot is encountered, it is swapped with the pointed element and the pointer moves forward. At the end, the pointer and pivot are swapped, and the process is repeated on the left and right halves. + If the highlighted element is less than the pivot or the pivot has been reached, press LEFT ARROW to swap it with the pointer. Otherwise, press RIGHT ARROW to move on. diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index b569693..343d469 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -1,12 +1,14 @@ """ SELECTION SORT + Selection sort incrementally builds a sorted array by repeatedly looking for the smallest element and swapping it onto the end of the sorted portion of the array, which initially starts with size zero but grows after each round. It is faster than an unoptimized bubble sort but slower than insertion sort. + Keep on hitting RIGHT ARROW until you encounter an element that is smaller than the left highlighted element, then hit LEFT ARROW and repeat. diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index b05aa6b..67dc116 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -1,9 +1,11 @@ """ SHELL SORT + Shell sort is a variation of insertion sort that sorts arrays separated by gaps. + Hit LEFT ARROW to swap the two highlighted elements as long as they are out of order. When this is no longer the case, hit RIGHT ARROW to """ diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd index 87cf192..c2123cc 100644 --- a/scripts/levels_redesign.gd +++ b/scripts/levels_redesign.gd @@ -32,6 +32,8 @@ func _ready(): child.queue_free() $Level/Right/Display.add_child(ArrayView.new(_level)) $Timer.start() + $Level/Left/Code.text = _level.DESCRIPTION + $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS _load_scores(_level) func _load_scores(level): From e5b0a7d13407a58e729e24ab98be8b09d11a39ae Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sat, 29 Aug 2020 22:58:32 -0500 Subject: [PATCH 15/29] refactor: rename sound_toggled, remove big preview Due to extreme difficulties of implementation, big preview mode has been canceled. --- project.godot | 2 +- scenes/menu.tscn | 31 ++++++++++++++----------------- views/array_sound.gd | 2 +- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/project.godot b/project.godot index bcca320..5341c6d 100644 --- a/project.godot +++ b/project.godot @@ -192,7 +192,7 @@ smaller={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) ] } -sound_toggle={ +sound={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":77,"unicode":0,"echo":false,"script":null) ] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 43ae0a8..14c9c5e 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -42,11 +42,10 @@ __meta__ = { } [node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] -visible = false -margin_left = 489.0 -margin_top = 175.0 -margin_right = 709.0 -margin_bottom = 423.0 +margin_left = 509.0 +margin_top = 186.0 +margin_right = 689.0 +margin_bottom = 412.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -54,46 +53,44 @@ script = ExtResource( 3 ) [node name="Instructions" type="VBoxContainer" parent="MainMenu/Display/InstructionsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 200.0 -margin_bottom = 228.0 +margin_right = 160.0 +margin_bottom = 206.0 custom_constants/separation = 16 [node name="Controls" type="HBoxContainer" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_right = 180.0 -margin_bottom = 173.0 +margin_right = 140.0 +margin_bottom = 151.0 custom_constants/separation = 20 [node name="Keys" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_right = 50.0 -margin_bottom = 173.0 +margin_bottom = 151.0 size_flags_horizontal = 4 text = "W A S D M -F space esc" [node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_left = 70.0 -margin_right = 180.0 -margin_bottom = 173.0 +margin_right = 140.0 +margin_bottom = 151.0 text = "bigger slower smaller faster sound -big preview confirm back" align = 2 [node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_top = 189.0 -margin_right = 180.0 -margin_bottom = 208.0 +margin_top = 167.0 +margin_right = 140.0 +margin_bottom = 186.0 text = "OK" [node name="Spacing" type="Control" parent="MainMenu"] diff --git a/views/array_sound.gd b/views/array_sound.gd index e5e7c85..01da862 100644 --- a/views/array_sound.gd +++ b/views/array_sound.gd @@ -32,7 +32,7 @@ func triangle(x): return 2 / PI * asin(sin(PI * x)) func _input(event): - if event.is_action_pressed("sound_toggle"): + if event.is_action_pressed("sound"): # Prevent event from propagating to ComparisonSort trigger get_tree().set_input_as_handled() var bus = AudioServer.get_bus_index("Master") From 3df0d5ffc70d70412ba6408118bda4a22a588d7e Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Sun, 30 Aug 2020 16:11:29 -0500 Subject: [PATCH 16/29] chore: replace levels with levels_redesign --- scenes/levels.tscn | 205 ++++++++++++++++++++++++------------ scenes/levels_redesign.tscn | 173 ------------------------------ scenes/menu.tscn | 9 +- scripts/levels.gd | 125 ++++++++++------------ scripts/levels_redesign.gd | 85 --------------- scripts/menu.gd | 2 +- scripts/play.gd | 4 +- 7 files changed, 201 insertions(+), 402 deletions(-) delete mode 100644 scenes/levels_redesign.tscn delete mode 100644 scripts/levels_redesign.gd diff --git a/scenes/levels.tscn b/scenes/levels.tscn index b35a711..2b43e83 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -1,106 +1,173 @@ [gd_scene load_steps=4 format=2] -[ext_resource path="res://scripts/levels.gd" type="Script" id=1] -[ext_resource path="res://assets/theme.theme" type="Theme" id=2] +[ext_resource path="res://assets/theme.theme" type="Theme" id=1] +[ext_resource path="res://scripts/levels.gd" type="Script" id=2] [ext_resource path="res://scripts/border.gd" type="Script" id=3] [node name="Viewport" type="MarginContainer"] anchor_right = 1.0 anchor_bottom = 1.0 -theme = ExtResource( 2 ) -custom_constants/margin_right = 30 -custom_constants/margin_top = 30 -custom_constants/margin_left = 30 -custom_constants/margin_bottom = 30 +theme = ExtResource( 1 ) __meta__ = { "_edit_use_anchors_": false } -[node name="LevelSelect" type="HBoxContainer" parent="."] -margin_left = 30.0 -margin_top = 30.0 -margin_right = 1250.0 -margin_bottom = 690.0 -script = ExtResource( 1 ) +[node name="Levels" type="VBoxContainer" parent="."] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1260.0 +margin_bottom = 700.0 +script = ExtResource( 2 ) -[node name="LevelsBorder" type="MarginContainer" parent="LevelSelect"] -margin_right = 303.0 -margin_bottom = 660.0 -size_flags_horizontal = 3 +[node name="NamesContainer" type="MarginContainer" parent="Levels"] +margin_right = 1240.0 +margin_bottom = 59.0 script = ExtResource( 3 ) -[node name="Levels" type="VBoxContainer" parent="LevelSelect/LevelsBorder"] +[node name="Names" type="HBoxContainer" parent="Levels/NamesContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 283.0 -margin_bottom = 640.0 +margin_right = 1220.0 +margin_bottom = 39.0 -[node name="LevelsContainer" type="HBoxContainer" parent="LevelSelect/LevelsBorder/Levels"] -margin_right = 263.0 +[node name="Previous" type="Label" parent="Levels/NamesContainer/Names"] +margin_right = 557.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = "<" +align = 2 +__meta__ = { +"_edit_use_anchors_": false +} -[node name="Buttons" type="VBoxContainer" parent="LevelSelect/LevelsBorder/Levels/LevelsContainer"] -margin_right = 255.0 +[node name="Current" type="Label" parent="Levels/NamesContainer/Names"] +margin_left = 565.0 +margin_right = 635.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 1, 0.690196, 0, 1 ) +text = "CURRENT" +align = 1 + +[node name="Next" type="Label" parent="Levels/NamesContainer/Names"] +margin_left = 643.0 +margin_right = 1200.0 +margin_bottom = 19.0 size_flags_horizontal = 3 +text = ">" -[node name="Scores" type="VBoxContainer" parent="LevelSelect/LevelsBorder/Levels/LevelsContainer"] -margin_left = 263.0 -margin_right = 263.0 +[node name="Level" type="HBoxContainer" parent="Levels"] +margin_top = 67.0 +margin_right = 1240.0 +margin_bottom = 680.0 +size_flags_vertical = 3 + +[node name="Left" type="MarginContainer" parent="Levels/Level"] +margin_right = 616.0 +margin_bottom = 613.0 +size_flags_horizontal = 3 +script = ExtResource( 3 ) -[node name="Label" type="Label" parent="LevelSelect/LevelsBorder"] +[node name="Code" type="Label" parent="Levels/Level/Left"] margin_left = 20.0 -margin_top = 555.0 -margin_right = 283.0 -margin_bottom = 640.0 -size_flags_vertical = 8 -text = "Use the WASD keys to adjust the size and speed of the simulation, and M to toggle sound." +margin_top = 20.0 +margin_right = 596.0 +margin_bottom = 593.0 +size_flags_vertical = 3 +text = "This is a description for the level in the form of psuedocode. + +def algorithm(parameter): + return result" autowrap = true -[node name="Preview" type="VBoxContainer" parent="LevelSelect"] -margin_left = 311.0 -margin_right = 1220.0 -margin_bottom = 660.0 +[node name="Right" type="VBoxContainer" parent="Levels/Level"] +margin_left = 624.0 +margin_right = 1240.0 +margin_bottom = 613.0 size_flags_horizontal = 3 -size_flags_stretch_ratio = 3.0 -[node name="Display" type="MarginContainer" parent="LevelSelect/Preview"] -margin_right = 909.0 -margin_bottom = 434.0 +[node name="Display" type="MarginContainer" parent="Levels/Level/Right"] +margin_right = 616.0 +margin_bottom = 431.0 size_flags_vertical = 3 -size_flags_stretch_ratio = 2.0 script = ExtResource( 3 ) -[node name="InfoBorder" type="MarginContainer" parent="LevelSelect/Preview"] -margin_top = 442.0 -margin_right = 909.0 -margin_bottom = 660.0 -size_flags_vertical = 3 +[node name="Info" type="HBoxContainer" parent="Levels/Level/Right"] +margin_top = 439.0 +margin_right = 616.0 +margin_bottom = 613.0 + +[node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] +margin_right = 405.0 +margin_bottom = 174.0 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 script = ExtResource( 3 ) -[node name="Info" type="HBoxContainer" parent="LevelSelect/Preview/InfoBorder"] +[node name="Controls" type="Label" parent="Levels/Level/Right/Info/ControlsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 889.0 -margin_bottom = 198.0 -custom_constants/separation = 50 - -[node name="Description" type="Label" parent="LevelSelect/Preview/InfoBorder/Info"] -margin_right = 546.0 -margin_bottom = 178.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 2.0 -text = "This is a short description of the algorithm. It should tell how it works in a simple yet complete way and explain its relevance in computer science. It should be accessible to the layman while not being oversimplifying." +margin_right = 385.0 +margin_bottom = 154.0 +size_flags_vertical = 1 +text = "These are the controls for the level." autowrap = true -[node name="Controls" type="Label" parent="LevelSelect/Preview/InfoBorder/Info"] -margin_left = 596.0 -margin_right = 869.0 -margin_bottom = 178.0 +[node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] +margin_left = 413.0 +margin_right = 616.0 +margin_bottom = 174.0 size_flags_horizontal = 3 -size_flags_vertical = 3 -text = "These are the controls for the level. They should be tailored to each level for maximum efficiency and simplicity." -autowrap = true +script = ExtResource( 3 ) -[node name="Timer" type="Timer" parent="LevelSelect"] -autostart = true -[connection signal="timeout" from="LevelSelect/Timer" to="LevelSelect" method="_on_Timer_timeout"] +[node name="Scores" type="VBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 183.0 +margin_bottom = 154.0 + +[node name="Header" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] +margin_right = 163.0 +margin_bottom = 19.0 + +[node name="Size" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] +margin_right = 40.0 +margin_bottom = 19.0 +text = "SIZE" + +[node name="Time" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] +margin_left = 48.0 +margin_right = 163.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = "HIGH SCORE" +align = 2 + +[node name="Data" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] +margin_top = 27.0 +margin_right = 163.0 +margin_bottom = 134.0 + +[node name="Sizes" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] +margin_right = 30.0 +margin_bottom = 107.0 +text = "8 +16 +32 +64 +128" + +[node name="Times" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] +margin_left = 38.0 +margin_right = 163.0 +margin_bottom = 107.0 +size_flags_horizontal = 3 +text = "INF +INF +INF +INF +INF" +align = 2 +uppercase = true + +[node name="Timer" type="Timer" parent="Levels"] +[connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/levels_redesign.tscn b/scenes/levels_redesign.tscn deleted file mode 100644 index 37c7863..0000000 --- a/scenes/levels_redesign.tscn +++ /dev/null @@ -1,173 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://assets/theme.theme" type="Theme" id=1] -[ext_resource path="res://scripts/levels_redesign.gd" type="Script" id=2] -[ext_resource path="res://scripts/border.gd" type="Script" id=3] - -[node name="Viewport" type="MarginContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -theme = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Levels" type="VBoxContainer" parent="."] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 1260.0 -margin_bottom = 700.0 -script = ExtResource( 2 ) - -[node name="NamesContainer" type="MarginContainer" parent="Levels"] -margin_right = 1240.0 -margin_bottom = 59.0 -script = ExtResource( 3 ) - -[node name="Names" type="HBoxContainer" parent="Levels/NamesContainer"] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 1220.0 -margin_bottom = 39.0 - -[node name="Previous" type="Label" parent="Levels/NamesContainer/Names"] -margin_right = 557.0 -margin_bottom = 19.0 -size_flags_horizontal = 3 -text = "<" -align = 2 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Current" type="Label" parent="Levels/NamesContainer/Names"] -margin_left = 565.0 -margin_right = 635.0 -margin_bottom = 19.0 -custom_colors/font_color = Color( 1, 0.690196, 0, 1 ) -text = "CURRENT" -align = 1 - -[node name="Next" type="Label" parent="Levels/NamesContainer/Names"] -margin_left = 643.0 -margin_right = 1200.0 -margin_bottom = 19.0 -size_flags_horizontal = 3 -text = ">" - -[node name="Level" type="HBoxContainer" parent="Levels"] -margin_top = 67.0 -margin_right = 1240.0 -margin_bottom = 680.0 -size_flags_vertical = 3 - -[node name="Left" type="MarginContainer" parent="Levels/Level"] -margin_right = 616.0 -margin_bottom = 613.0 -size_flags_horizontal = 3 -script = ExtResource( 3 ) - -[node name="Code" type="Label" parent="Levels/Level/Left"] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 596.0 -margin_bottom = 593.0 -size_flags_vertical = 3 -text = "This is a description for the level in the form of psuedocode. - -def algorithm(parameter): - return result" -autowrap = true - -[node name="Right" type="VBoxContainer" parent="Levels/Level"] -margin_left = 624.0 -margin_right = 1240.0 -margin_bottom = 613.0 -size_flags_horizontal = 3 - -[node name="Display" type="MarginContainer" parent="Levels/Level/Right"] -margin_right = 616.0 -margin_bottom = 431.0 -size_flags_vertical = 3 -script = ExtResource( 3 ) - -[node name="Info" type="HBoxContainer" parent="Levels/Level/Right"] -margin_top = 439.0 -margin_right = 616.0 -margin_bottom = 613.0 - -[node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] -margin_right = 405.0 -margin_bottom = 174.0 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 2.0 -script = ExtResource( 3 ) - -[node name="Controls" type="Label" parent="Levels/Level/Right/Info/ControlsContainer"] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 385.0 -margin_bottom = 154.0 -size_flags_vertical = 1 -text = "These are the controls for the level." -autowrap = true - -[node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] -margin_left = 413.0 -margin_right = 616.0 -margin_bottom = 174.0 -size_flags_horizontal = 3 -script = ExtResource( 3 ) - -[node name="Scores" type="VBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer"] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 183.0 -margin_bottom = 154.0 - -[node name="Header" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] -margin_right = 163.0 -margin_bottom = 19.0 - -[node name="Size" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] -margin_right = 40.0 -margin_bottom = 19.0 -text = "SIZE" - -[node name="Time" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Header"] -margin_left = 48.0 -margin_right = 163.0 -margin_bottom = 19.0 -size_flags_horizontal = 3 -text = "HIGH SCORE" -align = 2 - -[node name="Data" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] -margin_top = 27.0 -margin_right = 163.0 -margin_bottom = 134.0 - -[node name="Sizes" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] -margin_right = 30.0 -margin_bottom = 107.0 -text = "8 -16 -32 -64 -128" - -[node name="Times" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] -margin_left = 38.0 -margin_right = 163.0 -margin_bottom = 107.0 -size_flags_horizontal = 3 -text = "INF -INF -INF -INF -INF" -align = 2 -uppercase = true - -[node name="Timer" type="Timer" parent="Levels"] -[connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 14c9c5e..171b6ea 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -42,6 +42,7 @@ __meta__ = { } [node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] +visible = false margin_left = 509.0 margin_top = 186.0 margin_right = 689.0 @@ -71,8 +72,8 @@ A S D M -space -esc" +esc +space" [node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_left = 70.0 @@ -83,8 +84,8 @@ slower smaller faster sound -confirm -back" +back +confirm" align = 2 [node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] diff --git a/scripts/levels.gd b/scripts/levels.gd index 7f2f374..c2123cc 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -1,4 +1,4 @@ -extends HBoxContainer +extends VBoxContainer const LEVELS = [ BubbleSort, @@ -12,85 +12,74 @@ const LEVELS = [ CycleSort, OddEvenSort, ] + const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time const MAX_WAIT = 4 const MIN_SIZE = 8 -const MAX_SIZE = 256 +const MAX_SIZE = 128 -var _level = GlobalScene.get_param("level", LEVELS[0]).new(ArrayModel.new( - GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE))) +var _index = LEVELS.find(GlobalScene.get_param("level")) +var _level: ComparisonSort +var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) func _ready(): - var buttons = $LevelsBorder/Levels/LevelsContainer/Buttons - var scores = $LevelsBorder/Levels/LevelsContainer/Scores - for level in LEVELS: - var button = Button.new() - button.text = level.new(ArrayModel.new()).NAME - button.align = Button.ALIGN_LEFT - button.connect("focus_entered", self, "_on_Button_focus_entered") - button.connect("pressed", self, "_on_Button_pressed", [level]) - buttons.add_child(button) - var score = Label.new() - score.align = Label.ALIGN_RIGHT - score.size_flags_horizontal = Control.SIZE_EXPAND_FILL - scores.add_child(score) - # Autofocus last played level - for button in buttons.get_children(): - if button.text == _level.NAME: - button.grab_focus() - var top_button = buttons.get_children()[0] - var bottom_button = buttons.get_children()[-1] - # Allow looping from ends of list - top_button.focus_neighbour_top = bottom_button.get_path() - bottom_button.focus_neighbour_bottom = top_button.get_path() - -func _on_Button_focus_entered(size=_level.array.size): - # Update high scores - var container = $LevelsBorder/Levels/LevelsContainer - for i in range(LEVELS.size()): - var name = container.get_node("Buttons").get_child(i).text - var time = GlobalScore.get_time(name, size) - container.get_node("Scores").get_child(i).text = "INF" if time == INF else "%.3f" % time - # Pause a bit to show completely sorted array - if _level.array.is_sorted(): - # Prevent race condition caused by keyboard input during pause - set_process_input(false) - $Timer.stop() - yield(get_tree().create_timer(1), "timeout") - if not _level.array.is_sorted(): - return - $Timer.start() - set_process_input(true) - _level = _get_level(get_focus_owner().text).new(ArrayModel.new(size)) - $Preview/InfoBorder/Info/Description.text = _level.DESCRIPTION - $Preview/InfoBorder/Info/Controls.text = _level.CONTROLS - # Start over when simulation is finished - _level.connect("done", self, "_on_Button_focus_entered") - # Replace old display with new - for child in $Preview/Display.get_children(): + if _index == -1: + _index = 0 + _level = LEVELS[_index].new(ArrayModel.new(_size)) + _level.connect("done", self, "_on_ComparisonSort_done") + $NamesContainer/Names/Current.text = _level.NAME + for child in $Level/Right/Display.get_children(): child.queue_free() - $Preview/Display.add_child(ArrayView.new(_level)) + $Level/Right/Display.add_child(ArrayView.new(_level)) + $Timer.start() + $Level/Left/Code.text = _level.DESCRIPTION + $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS + _load_scores(_level) + +func _load_scores(level): + var data = $Level/Right/Info/ScoresContainer/Scores/Data + data.get_node("Times").text = "" + for i in data.get_node("Sizes").text.split("\n"): + var time = str(GlobalScore.get_time(level.NAME, int(i))) + data.get_node("Times").text += time + if int(i) != MAX_SIZE: + data.get_node("Times").text += "\n" + +func _switch_level(index): + if index == -1: + _index = LEVELS.size() - 1 + elif index == LEVELS.size(): + _index = 0 + else: + _index = index + _ready() func _input(event): if event.is_action_pressed("ui_cancel"): GlobalScene.change_scene("res://scenes/menu.tscn") - elif event.is_action_pressed("faster"): - $Timer.wait_time = max(MIN_WAIT, $Timer.wait_time / 2) - elif event.is_action_pressed("slower"): - $Timer.wait_time = min(MAX_WAIT, $Timer.wait_time * 2) - elif event.is_action_pressed("bigger"): - _on_Button_focus_entered(min(MAX_SIZE, _level.array.size * 2)) - elif event.is_action_pressed("smaller"): - _on_Button_focus_entered(max(MIN_SIZE, _level.array.size / 2)) - -func _on_Button_pressed(level): - GlobalScene.change_scene("res://scenes/play.tscn", - {"level": level, "size": _level.array.size}) + if event.is_action_pressed("ui_left", true): + _switch_level(_index - 1) + if event.is_action_pressed("ui_right", true): + _switch_level(_index + 1) + if event.is_action_pressed("bigger"): + _size = min(_size * 2, MAX_SIZE) + _ready() + if event.is_action_pressed("smaller"): + _size = max(_size / 2, MIN_SIZE) + _ready() + if event.is_action_pressed("faster"): + $Timer.wait_time = max($Timer.wait_time / 2, MIN_WAIT) + if event.is_action_pressed("slower"): + $Timer.wait_time = min($Timer.wait_time * 2, MAX_WAIT) + if event.is_action_pressed("ui_accept"): + GlobalScene.change_scene("res://scenes/play.tscn", + {"level": LEVELS[_index], "size": _size}) -func _get_level(name): - for level in LEVELS: - if level.new(ArrayModel.new()).NAME == name: - return level +func _on_ComparisonSort_done(): + $Timer.stop() + yield(get_tree().create_timer(1), "timeout") + if _level.array.is_sorted(): + _ready() func _on_Timer_timeout(): _level.next(null) diff --git a/scripts/levels_redesign.gd b/scripts/levels_redesign.gd deleted file mode 100644 index c2123cc..0000000 --- a/scripts/levels_redesign.gd +++ /dev/null @@ -1,85 +0,0 @@ -extends VBoxContainer - -const LEVELS = [ - BubbleSort, - InsertionSort, - SelectionSort, - MergeSort, - QuickSort, - CocktailSort, - ShellSort, - CombSort, - CycleSort, - OddEvenSort, -] - -const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time -const MAX_WAIT = 4 -const MIN_SIZE = 8 -const MAX_SIZE = 128 - -var _index = LEVELS.find(GlobalScene.get_param("level")) -var _level: ComparisonSort -var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) - -func _ready(): - if _index == -1: - _index = 0 - _level = LEVELS[_index].new(ArrayModel.new(_size)) - _level.connect("done", self, "_on_ComparisonSort_done") - $NamesContainer/Names/Current.text = _level.NAME - for child in $Level/Right/Display.get_children(): - child.queue_free() - $Level/Right/Display.add_child(ArrayView.new(_level)) - $Timer.start() - $Level/Left/Code.text = _level.DESCRIPTION - $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS - _load_scores(_level) - -func _load_scores(level): - var data = $Level/Right/Info/ScoresContainer/Scores/Data - data.get_node("Times").text = "" - for i in data.get_node("Sizes").text.split("\n"): - var time = str(GlobalScore.get_time(level.NAME, int(i))) - data.get_node("Times").text += time - if int(i) != MAX_SIZE: - data.get_node("Times").text += "\n" - -func _switch_level(index): - if index == -1: - _index = LEVELS.size() - 1 - elif index == LEVELS.size(): - _index = 0 - else: - _index = index - _ready() - -func _input(event): - if event.is_action_pressed("ui_cancel"): - GlobalScene.change_scene("res://scenes/menu.tscn") - if event.is_action_pressed("ui_left", true): - _switch_level(_index - 1) - if event.is_action_pressed("ui_right", true): - _switch_level(_index + 1) - if event.is_action_pressed("bigger"): - _size = min(_size * 2, MAX_SIZE) - _ready() - if event.is_action_pressed("smaller"): - _size = max(_size / 2, MIN_SIZE) - _ready() - if event.is_action_pressed("faster"): - $Timer.wait_time = max($Timer.wait_time / 2, MIN_WAIT) - if event.is_action_pressed("slower"): - $Timer.wait_time = min($Timer.wait_time * 2, MAX_WAIT) - if event.is_action_pressed("ui_accept"): - GlobalScene.change_scene("res://scenes/play.tscn", - {"level": LEVELS[_index], "size": _size}) - -func _on_ComparisonSort_done(): - $Timer.stop() - yield(get_tree().create_timer(1), "timeout") - if _level.array.is_sorted(): - _ready() - -func _on_Timer_timeout(): - _level.next(null) diff --git a/scripts/menu.gd b/scripts/menu.gd index 27d1e85..27f1358 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -8,7 +8,7 @@ func _ready(): $Display.add_child(ArrayView.new(_level), true) func _on_Start_pressed(): - GlobalScene.change_scene("res://scenes/levels_redesign.tscn") + GlobalScene.change_scene("res://scenes/levels.tscn") func _on_Credits_pressed(): GlobalScene.change_scene("res://scenes/credits.tscn") diff --git a/scripts/play.gd b/scripts/play.gd index 0ad6cf9..e174631 100644 --- a/scripts/play.gd +++ b/scripts/play.gd @@ -26,7 +26,7 @@ func get_score(): func _input(event): if event.is_action_pressed("ui_cancel"): - _on_Button_pressed("levels_redesign") + _on_Button_pressed("levels") func _on_Level_done(level): set_process(false) @@ -38,7 +38,7 @@ func _on_Level_done(level): separator.text = " / " var back = Button.new() back.text = "BACK TO LEVEL SELECT" - back.connect("pressed", self, "_on_Button_pressed", ["levels_redesign"]) + back.connect("pressed", self, "_on_Button_pressed", ["levels"]) var score = Label.new() score.text = "%.3f" % time score.align = Label.ALIGN_RIGHT From 08640a1612c00ebe4eab51b19e769b855f4e60ea Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 13:53:05 -0500 Subject: [PATCH 17/29] feat: add custom data types --- models/array_model.gd | 62 ++++++++++++++++++++++++++++++++++++++----- project.godot | 7 ++++- scenes/levels.tscn | 29 +++++++++++++++++--- scenes/menu.tscn | 32 +++++++++++----------- scripts/levels.gd | 60 ++++++++++++++++++++++++++++++++--------- views/array_sound.gd | 4 +-- 6 files changed, 154 insertions(+), 40 deletions(-) diff --git a/models/array_model.gd b/models/array_model.gd index 5cd361f..c9a5d38 100644 --- a/models/array_model.gd +++ b/models/array_model.gd @@ -6,17 +6,54 @@ signal swapped(i, j) signal sorted(i, j) const DEFAULT_SIZE = 16 +enum DATA_TYPES { + RANDOM_UNIQUE, + TRUE_RANDOM, + REVERSED, + FEW_UNIQUE, + ALL_THE_SAME, + NEARLY_SORTED, + ALREADY_SORTED, +} var _array = [] var size = 0 setget , get_size var biggest = null -func _init(size=DEFAULT_SIZE): +func _init(size=DEFAULT_SIZE, data_type=DATA_TYPES.RANDOM_UNIQUE): """Randomize the array.""" - for i in range(1, size + 1): - _array.append(i) - _array.shuffle() - biggest = _array.max() + match data_type: + DATA_TYPES.RANDOM_UNIQUE: + for i in range(1, size + 1): + _array.append(i) + _array.shuffle() + DATA_TYPES.TRUE_RANDOM: + for i in range(size): + _array.append(randi() % size + 1) + DATA_TYPES.REVERSED: + for i in range(size, 0, -1): + _array.append(i) + DATA_TYPES.FEW_UNIQUE: + var values = [] + for i in range(sqrt(size)): + values.append(randi() % size + 1) + for i in range(size): + _array.append(values[randi() % values.size()]) + DATA_TYPES.ALL_THE_SAME: + for i in range(size): + _array.append(1) + DATA_TYPES.NEARLY_SORTED: + # We interpret nearly sorted as every element being K or + # less places away from its sorted position, where K is a + # small number relative to the size of the array. + for i in range(1, size + 1): + _array.append(i) + _array.shuffle() + _nearly_sort(0, size - 1, ceil(sqrt(size))) + DATA_TYPES.ALREADY_SORTED: + for i in range(1, size + 1): + _array.append(i) + biggest = _array.max() if data_type != DATA_TYPES.ALL_THE_SAME else 0 func at(i): """Retrieve the value of the element at index i.""" @@ -24,7 +61,7 @@ func at(i): func frac(i): """Get the quotient of the element at index i and the biggest.""" - return float(_array[i]) / biggest + return float(_array[i]) / biggest if biggest != 0 else 0.5 func is_sorted(): """Check if the array is in monotonically increasing order.""" @@ -52,3 +89,16 @@ func sort(i, j): func get_size(): return _array.size() + +func _nearly_sort(start, end, k): + # If false, then no element in this subarray is more than K places + # away from its sorted position, and we can exit + if end - start > k: + var pointer = start + for i in range(start, end): + if _array[i] < _array[end]: + swap(i, pointer) + pointer += 1 + swap(pointer, end) + _nearly_sort(start, pointer - 1, k) + _nearly_sort(pointer + 1, end, k) diff --git a/project.godot b/project.godot index 5341c6d..ddcc9b9 100644 --- a/project.godot +++ b/project.godot @@ -192,11 +192,16 @@ smaller={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) ] } -sound={ +toggle_sound={ "deadzone": 0.5, "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":77,"unicode":0,"echo":false,"script":null) ] } +change_data={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":67,"unicode":0,"echo":false,"script":null) + ] +} [rendering] diff --git a/scenes/levels.tscn b/scenes/levels.tscn index 2b43e83..0e6bd40 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -40,13 +40,11 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="Current" type="Label" parent="Levels/NamesContainer/Names"] +[node name="Current" type="Button" parent="Levels/NamesContainer/Names"] margin_left = 565.0 margin_right = 635.0 margin_bottom = 19.0 -custom_colors/font_color = Color( 1, 0.690196, 0, 1 ) text = "CURRENT" -align = 1 [node name="Next" type="Label" parent="Levels/NamesContainer/Names"] margin_left = 643.0 @@ -91,6 +89,30 @@ margin_bottom = 431.0 size_flags_vertical = 3 script = ExtResource( 3 ) +[node name="TypesContainer" type="MarginContainer" parent="Levels/Level/Right/Display"] +visible = false +margin_left = 218.0 +margin_top = 105.0 +margin_right = 398.0 +margin_bottom = 326.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource( 3 ) + +[node name="Types" type="VBoxContainer" parent="Levels/Level/Right/Display/TypesContainer"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 160.0 +margin_bottom = 201.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 + +[node name="ArrayView" type="HBoxContainer" parent="Levels/Level/Right/Display"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 596.0 +margin_bottom = 411.0 + [node name="Info" type="HBoxContainer" parent="Levels/Level/Right"] margin_top = 439.0 margin_right = 616.0 @@ -170,4 +192,5 @@ align = 2 uppercase = true [node name="Timer" type="Timer" parent="Levels"] +[connection signal="pressed" from="Levels/NamesContainer/Names/Current" to="Levels" method="_on_Current_pressed"] [connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 171b6ea..afb99d6 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -43,10 +43,10 @@ __meta__ = { [node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] visible = false -margin_left = 509.0 -margin_top = 186.0 -margin_right = 689.0 -margin_bottom = 412.0 +margin_left = 484.0 +margin_top = 175.0 +margin_right = 714.0 +margin_bottom = 423.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -54,44 +54,46 @@ script = ExtResource( 3 ) [node name="Instructions" type="VBoxContainer" parent="MainMenu/Display/InstructionsContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 160.0 -margin_bottom = 206.0 +margin_right = 210.0 +margin_bottom = 228.0 custom_constants/separation = 16 [node name="Controls" type="HBoxContainer" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_right = 140.0 -margin_bottom = 151.0 +margin_right = 190.0 +margin_bottom = 173.0 custom_constants/separation = 20 [node name="Keys" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_right = 50.0 -margin_bottom = 151.0 +margin_bottom = 173.0 size_flags_horizontal = 4 text = "W A S D M +C esc space" [node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_left = 70.0 -margin_right = 140.0 -margin_bottom = 151.0 +margin_right = 190.0 +margin_bottom = 173.0 text = "bigger slower smaller faster -sound +toggle sound +change data back confirm" align = 2 [node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_top = 167.0 -margin_right = 140.0 -margin_bottom = 186.0 +margin_top = 189.0 +margin_right = 190.0 +margin_bottom = 208.0 text = "OK" [node name="Spacing" type="Control" parent="MainMenu"] diff --git a/scripts/levels.gd b/scripts/levels.gd index c2123cc..10de6bd 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -21,20 +21,39 @@ const MAX_SIZE = 128 var _index = LEVELS.find(GlobalScene.get_param("level")) var _level: ComparisonSort var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) +var _data_type = ArrayModel.DATA_TYPES.RANDOM_UNIQUE func _ready(): + var types = $Level/Right/Display/TypesContainer/Types + for type in ArrayModel.DATA_TYPES: + var button = Button.new() + button.text = type.replace("_", " ") + button.connect("pressed", self, "_on_Button_pressed", [type]) + types.add_child(button) + var top = types.get_child(0) + var bottom = types.get_child(types.get_child_count() - 1) + top.focus_neighbour_top = bottom.get_path() + bottom.focus_neighbour_bottom = top.get_path() + _reload() + +func _reload(): + $NamesContainer/Names/Current.grab_focus() if _index == -1: _index = 0 - _level = LEVELS[_index].new(ArrayModel.new(_size)) + _level = LEVELS[_index].new(ArrayModel.new(_size, _data_type)) _level.connect("done", self, "_on_ComparisonSort_done") + _load_scores(_level) + # Load level information $NamesContainer/Names/Current.text = _level.NAME - for child in $Level/Right/Display.get_children(): - child.queue_free() - $Level/Right/Display.add_child(ArrayView.new(_level)) - $Timer.start() $Level/Left/Code.text = _level.DESCRIPTION $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS - _load_scores(_level) + var view = $Level/Right/Display/ArrayView + $Level/Right/Display.remove_child(view) + view.queue_free() + view = ArrayView.new(_level) + view.name = "ArrayView" + $Level/Right/Display.add_child(view) + $Timer.start() func _load_scores(level): var data = $Level/Right/Info/ScoresContainer/Scores/Data @@ -52,7 +71,7 @@ func _switch_level(index): _index = 0 else: _index = index - _ready() + _reload() func _input(event): if event.is_action_pressed("ui_cancel"): @@ -63,23 +82,38 @@ func _input(event): _switch_level(_index + 1) if event.is_action_pressed("bigger"): _size = min(_size * 2, MAX_SIZE) - _ready() + _reload() if event.is_action_pressed("smaller"): _size = max(_size / 2, MIN_SIZE) - _ready() + _reload() if event.is_action_pressed("faster"): $Timer.wait_time = max($Timer.wait_time / 2, MIN_WAIT) if event.is_action_pressed("slower"): $Timer.wait_time = min($Timer.wait_time * 2, MAX_WAIT) - if event.is_action_pressed("ui_accept"): - GlobalScene.change_scene("res://scenes/play.tscn", - {"level": LEVELS[_index], "size": _size}) + if event.is_action_pressed("change_data"): + AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) + $Level/Right/Display/ArrayView.hide() + $Level/Right/Display/TypesContainer.show() + $Timer.stop() + $Level/Right/Display/TypesContainer/Types.get_child(0).grab_focus() func _on_ComparisonSort_done(): $Timer.stop() yield(get_tree().create_timer(1), "timeout") if _level.array.is_sorted(): - _ready() + _reload() func _on_Timer_timeout(): _level.next(null) + +func _on_Current_pressed(): + GlobalScene.change_scene("res://scenes/play.tscn", + {"level": LEVELS[_index], "size": _size}) + +func _on_Button_pressed(data_type): + AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), false) + $Level/Right/Display/TypesContainer.hide() + $Level/Right/Display/ArrayView.show() + $Timer.start() + _data_type = ArrayModel.DATA_TYPES[data_type] + _reload() diff --git a/views/array_sound.gd b/views/array_sound.gd index 01da862..9700188 100644 --- a/views/array_sound.gd +++ b/views/array_sound.gd @@ -3,7 +3,7 @@ extends Node const SAMPLE_HZ = 44100 const MIN_HZ = 110 -const MAX_HZ = 880 +const MAX_HZ = 440 var frac: float var player = AudioStreamPlayer.new() @@ -32,7 +32,7 @@ func triangle(x): return 2 / PI * asin(sin(PI * x)) func _input(event): - if event.is_action_pressed("sound"): + if event.is_action_pressed("toggle_sound"): # Prevent event from propagating to ComparisonSort trigger get_tree().set_input_as_handled() var bus = AudioServer.get_bus_index("Master") From 7c03e774be8322059e77580ff2145cebc3171afa Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 15:35:09 -0500 Subject: [PATCH 18/29] feat: remember data type between plays --- scenes/levels.tscn | 12 ++++++------ scripts/levels.gd | 5 +++-- scripts/play.gd | 25 ++++++++++++++----------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/scenes/levels.tscn b/scenes/levels.tscn index 0e6bd40..d95581f 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -91,10 +91,10 @@ script = ExtResource( 3 ) [node name="TypesContainer" type="MarginContainer" parent="Levels/Level/Right/Display"] visible = false -margin_left = 218.0 -margin_top = 105.0 -margin_right = 398.0 -margin_bottom = 326.0 +margin_left = 288.0 +margin_top = 195.0 +margin_right = 328.0 +margin_bottom = 235.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -102,8 +102,8 @@ script = ExtResource( 3 ) [node name="Types" type="VBoxContainer" parent="Levels/Level/Right/Display/TypesContainer"] margin_left = 20.0 margin_top = 20.0 -margin_right = 160.0 -margin_bottom = 201.0 +margin_right = 20.0 +margin_bottom = 20.0 size_flags_horizontal = 4 size_flags_vertical = 4 diff --git a/scripts/levels.gd b/scripts/levels.gd index 10de6bd..f240b42 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -21,7 +21,8 @@ const MAX_SIZE = 128 var _index = LEVELS.find(GlobalScene.get_param("level")) var _level: ComparisonSort var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) -var _data_type = ArrayModel.DATA_TYPES.RANDOM_UNIQUE +var _data_type = GlobalScene.get_param( + "data_type", ArrayModel.DATA_TYPES.RANDOM_UNIQUE) func _ready(): var types = $Level/Right/Display/TypesContainer/Types @@ -108,7 +109,7 @@ func _on_Timer_timeout(): func _on_Current_pressed(): GlobalScene.change_scene("res://scenes/play.tscn", - {"level": LEVELS[_index], "size": _size}) + {"level": LEVELS[_index], "size": _size, "data_type": _data_type}) func _on_Button_pressed(data_type): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), false) diff --git a/scripts/play.gd b/scripts/play.gd index e174631..7097a9a 100644 --- a/scripts/play.gd +++ b/scripts/play.gd @@ -1,12 +1,13 @@ extends VBoxContainer var _start_time = -1 -var _level = GlobalScene.get_param( - "level", preload("res://scripts/levels.gd").LEVELS[0]) +var _level = GlobalScene.get_param("level").new(ArrayModel.new( + GlobalScene.get_param("size"), GlobalScene.get_param("data_type"))) func _ready(): set_process(false) - $HUDBorder/HUD/Level.text = _level.new(ArrayModel.new()).NAME + $HUDBorder/HUD/Level.text = _level.NAME + _level.connect("done", self, "_on_Level_done") func _process(delta): $HUDBorder/HUD/Score.text = "%.3f" % get_score() @@ -15,11 +16,8 @@ func _on_Timer_timeout(): set_process(true) _start_time = OS.get_ticks_msec() $Display/Label.queue_free() # Delete ready text - var level = _level.new(ArrayModel.new( - GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE))) - level.connect("done", self, "_on_Level_done", [level]) - $Display.add_child(ArrayView.new(level)) - level.set_process_input(true) + $Display.add_child(ArrayView.new(_level)) + _level.set_process_input(true) func get_score(): return stepify((OS.get_ticks_msec() - _start_time) / 1000.0, 0.001) @@ -28,7 +26,7 @@ func _input(event): if event.is_action_pressed("ui_cancel"): _on_Button_pressed("levels") -func _on_Level_done(level): +func _on_Level_done(): set_process(false) var time = get_score() var restart = Button.new() @@ -41,6 +39,10 @@ func _on_Level_done(level): back.connect("pressed", self, "_on_Button_pressed", ["levels"]) var score = Label.new() score.text = "%.3f" % time + if GlobalScene.get_param("data_type") != ArrayModel.DATA_TYPES.RANDOM_UNIQUE: + score.text += " (only random unique data counts toward a high score!)" + else: + GlobalScore.save_score(_level.NAME, _level.array.size, time) score.align = Label.ALIGN_RIGHT score.size_flags_horizontal = Control.SIZE_EXPAND_FILL $HUDBorder/HUD/Level.queue_free() @@ -50,8 +52,9 @@ func _on_Level_done(level): $HUDBorder/HUD.add_child(back) $HUDBorder/HUD.add_child(score) restart.grab_focus() - GlobalScore.save_score(level.NAME, level.array.size, time) func _on_Button_pressed(scene): GlobalScene.change_scene("res://scenes/" + scene + ".tscn", - {"level": _level, "size": GlobalScene.get_param("size")}) + {"level": GlobalScene.get_param("level"), + "size": GlobalScene.get_param("size"), + "data_type": GlobalScene.get_param("data_type")}) From d17132d27325ba9c0eb70c3a530b306c74e5d25a Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 16:14:40 -0500 Subject: [PATCH 19/29] feat: reduce number of sizes To keep things simple, there is now only a "small" size of 8, "medium" size of 32, and "big" size of 128. --- models/array_model.gd | 2 +- scenes/levels.tscn | 28 ++++++++++++---------------- scripts/levels.gd | 10 +++++----- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/models/array_model.gd b/models/array_model.gd index c9a5d38..dba8c3c 100644 --- a/models/array_model.gd +++ b/models/array_model.gd @@ -5,7 +5,7 @@ signal removed(i) signal swapped(i, j) signal sorted(i, j) -const DEFAULT_SIZE = 16 +const DEFAULT_SIZE = 32 enum DATA_TYPES { RANDOM_UNIQUE, TRUE_RANDOM, diff --git a/scenes/levels.tscn b/scenes/levels.tscn index d95581f..3489402 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -85,16 +85,16 @@ size_flags_horizontal = 3 [node name="Display" type="MarginContainer" parent="Levels/Level/Right"] margin_right = 616.0 -margin_bottom = 431.0 +margin_bottom = 475.0 size_flags_vertical = 3 script = ExtResource( 3 ) [node name="TypesContainer" type="MarginContainer" parent="Levels/Level/Right/Display"] visible = false margin_left = 288.0 -margin_top = 195.0 +margin_top = 217.0 margin_right = 328.0 -margin_bottom = 235.0 +margin_bottom = 257.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -111,16 +111,16 @@ size_flags_vertical = 4 margin_left = 20.0 margin_top = 20.0 margin_right = 596.0 -margin_bottom = 411.0 +margin_bottom = 455.0 [node name="Info" type="HBoxContainer" parent="Levels/Level/Right"] -margin_top = 439.0 +margin_top = 483.0 margin_right = 616.0 margin_bottom = 613.0 [node name="ControlsContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] margin_right = 405.0 -margin_bottom = 174.0 +margin_bottom = 130.0 size_flags_horizontal = 3 size_flags_stretch_ratio = 2.0 script = ExtResource( 3 ) @@ -129,7 +129,7 @@ script = ExtResource( 3 ) margin_left = 20.0 margin_top = 20.0 margin_right = 385.0 -margin_bottom = 154.0 +margin_bottom = 110.0 size_flags_vertical = 1 text = "These are the controls for the level." autowrap = true @@ -137,7 +137,7 @@ autowrap = true [node name="ScoresContainer" type="MarginContainer" parent="Levels/Level/Right/Info"] margin_left = 413.0 margin_right = 616.0 -margin_bottom = 174.0 +margin_bottom = 130.0 size_flags_horizontal = 3 script = ExtResource( 3 ) @@ -145,7 +145,7 @@ script = ExtResource( 3 ) margin_left = 20.0 margin_top = 20.0 margin_right = 183.0 -margin_bottom = 154.0 +margin_bottom = 110.0 [node name="Header" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] margin_right = 163.0 @@ -167,26 +167,22 @@ align = 2 [node name="Data" type="HBoxContainer" parent="Levels/Level/Right/Info/ScoresContainer/Scores"] margin_top = 27.0 margin_right = 163.0 -margin_bottom = 134.0 +margin_bottom = 90.0 [node name="Sizes" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] margin_right = 30.0 -margin_bottom = 107.0 +margin_bottom = 63.0 text = "8 -16 32 -64 128" [node name="Times" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] margin_left = 38.0 margin_right = 163.0 -margin_bottom = 107.0 +margin_bottom = 63.0 size_flags_horizontal = 3 text = "INF INF -INF -INF INF" align = 2 uppercase = true diff --git a/scripts/levels.gd b/scripts/levels.gd index f240b42..a0c02b0 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -13,7 +13,7 @@ const LEVELS = [ OddEvenSort, ] -const MIN_WAIT = 1.0 / 32 # Should be greater than maximum frame time +const MIN_WAIT = 1.0 / 64 const MAX_WAIT = 4 const MIN_SIZE = 8 const MAX_SIZE = 128 @@ -82,15 +82,15 @@ func _input(event): if event.is_action_pressed("ui_right", true): _switch_level(_index + 1) if event.is_action_pressed("bigger"): - _size = min(_size * 2, MAX_SIZE) + _size = min(_size * 4, MAX_SIZE) _reload() if event.is_action_pressed("smaller"): - _size = max(_size / 2, MIN_SIZE) + _size = max(_size / 4, MIN_SIZE) _reload() if event.is_action_pressed("faster"): - $Timer.wait_time = max($Timer.wait_time / 2, MIN_WAIT) + $Timer.wait_time = max($Timer.wait_time / 4, MIN_WAIT) if event.is_action_pressed("slower"): - $Timer.wait_time = min($Timer.wait_time * 2, MAX_WAIT) + $Timer.wait_time = min($Timer.wait_time * 4, MAX_WAIT) if event.is_action_pressed("change_data"): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) $Level/Right/Display/ArrayView.hide() From 74e22b2152bbed7cde2f16937917d62411fbca54 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 16:49:04 -0500 Subject: [PATCH 20/29] refactor: clean up levels.gd --- scenes/levels.tscn | 2 +- scripts/levels.gd | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/scenes/levels.tscn b/scenes/levels.tscn index 3489402..7ed24d1 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -107,7 +107,7 @@ margin_bottom = 20.0 size_flags_horizontal = 4 size_flags_vertical = 4 -[node name="ArrayView" type="HBoxContainer" parent="Levels/Level/Right/Display"] +[node name="HBoxContainer" type="HBoxContainer" parent="Levels/Level/Right/Display"] margin_left = 20.0 margin_top = 20.0 margin_right = 596.0 diff --git a/scripts/levels.gd b/scripts/levels.gd index a0c02b0..b274bc5 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -48,12 +48,10 @@ func _reload(): $NamesContainer/Names/Current.text = _level.NAME $Level/Left/Code.text = _level.DESCRIPTION $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS - var view = $Level/Right/Display/ArrayView - $Level/Right/Display.remove_child(view) + var view = $Level/Right/Display/HBoxContainer + view.get_parent().remove_child(view) view.queue_free() - view = ArrayView.new(_level) - view.name = "ArrayView" - $Level/Right/Display.add_child(view) + $Level/Right/Display.add_child(ArrayView.new(_level), true) $Timer.start() func _load_scores(level): @@ -93,7 +91,7 @@ func _input(event): $Timer.wait_time = min($Timer.wait_time * 4, MAX_WAIT) if event.is_action_pressed("change_data"): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) - $Level/Right/Display/ArrayView.hide() + $Level/Right/Display/HBoxContainer.hide() $Level/Right/Display/TypesContainer.show() $Timer.stop() $Level/Right/Display/TypesContainer/Types.get_child(0).grab_focus() @@ -114,7 +112,7 @@ func _on_Current_pressed(): func _on_Button_pressed(data_type): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), false) $Level/Right/Display/TypesContainer.hide() - $Level/Right/Display/ArrayView.show() + $Level/Right/Display/HBoxContainer.show() $Timer.start() _data_type = ArrayModel.DATA_TYPES[data_type] _reload() From 26c84e9827ec1aee8a71ac751b459153882bceda Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 19:36:46 -0500 Subject: [PATCH 21/29] feat: implement big preview mode Took more hacks than I would have liked, but getting rid of those would require a refactor across the entire codebase. --- project.godot | 5 ++++ scenes/levels.tscn | 31 ++++++++++++++++------ scenes/menu.tscn | 18 +++++++------ scripts/levels.gd | 66 +++++++++++++++++++++++++++++++--------------- 4 files changed, 83 insertions(+), 37 deletions(-) diff --git a/project.godot b/project.godot index ddcc9b9..d5d4f0b 100644 --- a/project.godot +++ b/project.godot @@ -202,6 +202,11 @@ change_data={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":67,"unicode":0,"echo":false,"script":null) ] } +big_preview={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":66,"unicode":0,"echo":false,"script":null) + ] +} [rendering] diff --git a/scenes/levels.tscn b/scenes/levels.tscn index 7ed24d1..fb53295 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -99,14 +99,6 @@ size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) -[node name="Types" type="VBoxContainer" parent="Levels/Level/Right/Display/TypesContainer"] -margin_left = 20.0 -margin_top = 20.0 -margin_right = 20.0 -margin_bottom = 20.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 - [node name="HBoxContainer" type="HBoxContainer" parent="Levels/Level/Right/Display"] margin_left = 20.0 margin_top = 20.0 @@ -187,6 +179,29 @@ INF" align = 2 uppercase = true +[node name="BigDisplay" type="MarginContainer" parent="Levels"] +visible = false +margin_top = 640.0 +margin_right = 1240.0 +margin_bottom = 680.0 +size_flags_vertical = 3 +script = ExtResource( 3 ) + +[node name="TypesContainer" type="MarginContainer" parent="Levels/BigDisplay"] +visible = false +margin_left = 600.0 +margin_right = 640.0 +margin_bottom = 40.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource( 3 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="Levels/BigDisplay"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1220.0 +margin_bottom = 20.0 + [node name="Timer" type="Timer" parent="Levels"] [connection signal="pressed" from="Levels/NamesContainer/Names/Current" to="Levels" method="_on_Current_pressed"] [connection signal="timeout" from="Levels/Timer" to="Levels" method="_on_Timer_timeout"] diff --git a/scenes/menu.tscn b/scenes/menu.tscn index afb99d6..9eff7ef 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -44,9 +44,9 @@ __meta__ = { [node name="InstructionsContainer" type="MarginContainer" parent="MainMenu/Display"] visible = false margin_left = 484.0 -margin_top = 175.0 +margin_top = 164.0 margin_right = 714.0 -margin_bottom = 423.0 +margin_bottom = 434.0 size_flags_horizontal = 4 size_flags_vertical = 4 script = ExtResource( 3 ) @@ -55,17 +55,17 @@ script = ExtResource( 3 ) margin_left = 20.0 margin_top = 20.0 margin_right = 210.0 -margin_bottom = 228.0 +margin_bottom = 250.0 custom_constants/separation = 16 [node name="Controls" type="HBoxContainer" parent="MainMenu/Display/InstructionsContainer/Instructions"] margin_right = 190.0 -margin_bottom = 173.0 +margin_bottom = 195.0 custom_constants/separation = 20 [node name="Keys" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_right = 50.0 -margin_bottom = 173.0 +margin_bottom = 195.0 size_flags_horizontal = 4 text = "W A @@ -73,27 +73,29 @@ S D M C +B esc space" [node name="Actions" type="Label" parent="MainMenu/Display/InstructionsContainer/Instructions/Controls"] margin_left = 70.0 margin_right = 190.0 -margin_bottom = 173.0 +margin_bottom = 195.0 text = "bigger slower smaller faster toggle sound change data +big preview back confirm" align = 2 [node name="Button" type="Button" parent="MainMenu/Display/InstructionsContainer/Instructions"] -margin_top = 189.0 +margin_top = 211.0 margin_right = 190.0 -margin_bottom = 208.0 +margin_bottom = 230.0 text = "OK" [node name="Spacing" type="Control" parent="MainMenu"] diff --git a/scripts/levels.gd b/scripts/levels.gd index b274bc5..1e24608 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -18,14 +18,21 @@ const MAX_WAIT = 4 const MIN_SIZE = 8 const MAX_SIZE = 128 -var _index = LEVELS.find(GlobalScene.get_param("level")) +var _index = LEVELS.find(GlobalScene.get_param("level", LEVELS[0])) var _level: ComparisonSort var _size = GlobalScene.get_param("size", ArrayModel.DEFAULT_SIZE) var _data_type = GlobalScene.get_param( "data_type", ArrayModel.DATA_TYPES.RANDOM_UNIQUE) func _ready(): - var types = $Level/Right/Display/TypesContainer/Types + _load_types($Level/Right/Display/TypesContainer) + _load_types($BigDisplay/TypesContainer) + _reload() + +func _load_types(node): + var types = VBoxContainer.new() + types.name = "Types" + node.add_child(types) for type in ArrayModel.DATA_TYPES: var button = Button.new() button.text = type.replace("_", " ") @@ -35,23 +42,34 @@ func _ready(): var bottom = types.get_child(types.get_child_count() - 1) top.focus_neighbour_top = bottom.get_path() bottom.focus_neighbour_bottom = top.get_path() - _reload() func _reload(): - $NamesContainer/Names/Current.grab_focus() - if _index == -1: - _index = 0 - _level = LEVELS[_index].new(ArrayModel.new(_size, _data_type)) - _level.connect("done", self, "_on_ComparisonSort_done") + # Load everything from scratch + _restart() _load_scores(_level) - # Load level information $NamesContainer/Names/Current.text = _level.NAME $Level/Left/Code.text = _level.DESCRIPTION $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS - var view = $Level/Right/Display/HBoxContainer - view.get_parent().remove_child(view) - view.queue_free() - $Level/Right/Display.add_child(ArrayView.new(_level), true) + +func _restart(): + set_process_input(true) + # Only load in a restarted simulation + $NamesContainer/Names/Current.grab_focus() + _level = LEVELS[_index].new(ArrayModel.new(_size, _data_type)) + _level.connect("done", self, "_on_ComparisonSort_done") + var view = $Level/Right/Display if $Level.visible else $BigDisplay + var other = $BigDisplay if $Level.visible else $Level/Right/Display + # Delete both ArrayViews if they exist + if other.get_node_or_null("HBoxContainer") != null: + other.get_node("HBoxContainer").queue_free() + var array_view = view.get_node_or_null("HBoxContainer") + if array_view != null: + # XXX: remove_child is needed in order to ensure that the added + # child will be named "HBoxContainer" and not "HBoxContainer2" + # because the other ArrayView hasn't been queue_free'd yet + view.remove_child(array_view) + array_view.queue_free() + view.add_child(ArrayView.new(_level), true) $Timer.start() func _load_scores(level): @@ -91,16 +109,21 @@ func _input(event): $Timer.wait_time = min($Timer.wait_time * 4, MAX_WAIT) if event.is_action_pressed("change_data"): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) - $Level/Right/Display/HBoxContainer.hide() - $Level/Right/Display/TypesContainer.show() + var display = $Level/Right/Display if $Level.visible else $BigDisplay + display.get_node("HBoxContainer").hide() + display.get_node("TypesContainer").show() $Timer.stop() - $Level/Right/Display/TypesContainer/Types.get_child(0).grab_focus() + display.get_node("TypesContainer/Types").get_child(0).grab_focus() + if event.is_action_pressed("big_preview"): + $Level.visible = not $Level.visible + $BigDisplay.visible = not $BigDisplay.visible + _restart() func _on_ComparisonSort_done(): + set_process_input(false) $Timer.stop() yield(get_tree().create_timer(1), "timeout") - if _level.array.is_sorted(): - _reload() + _restart() func _on_Timer_timeout(): _level.next(null) @@ -111,8 +134,9 @@ func _on_Current_pressed(): func _on_Button_pressed(data_type): AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), false) - $Level/Right/Display/TypesContainer.hide() - $Level/Right/Display/HBoxContainer.show() + var display = $Level/Right/Display if $Level.visible else $BigDisplay + display.get_node("TypesContainer").hide() + display.get_node("HBoxContainer").show() $Timer.start() _data_type = ArrayModel.DATA_TYPES[data_type] - _reload() + _restart() From d5c9bcba8bd1037d3cbb0df45c6d8a425efd34b6 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 1 Sep 2020 21:00:26 -0500 Subject: [PATCH 22/29] fix: no longer unmutes after switching data types --- scripts/levels.gd | 3 +-- views/array_view.gd | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/levels.gd b/scripts/levels.gd index 1e24608..8346d0b 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -108,9 +108,9 @@ func _input(event): if event.is_action_pressed("slower"): $Timer.wait_time = min($Timer.wait_time * 4, MAX_WAIT) if event.is_action_pressed("change_data"): - AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) var display = $Level/Right/Display if $Level.visible else $BigDisplay display.get_node("HBoxContainer").hide() + display.get_node("HBoxContainer").sound.set_process(false) display.get_node("TypesContainer").show() $Timer.stop() display.get_node("TypesContainer/Types").get_child(0).grab_focus() @@ -133,7 +133,6 @@ func _on_Current_pressed(): {"level": LEVELS[_index], "size": _size, "data_type": _data_type}) func _on_Button_pressed(data_type): - AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), false) var display = $Level/Right/Display if $Level.visible else $BigDisplay display.get_node("TypesContainer").hide() display.get_node("HBoxContainer").show() diff --git a/views/array_view.gd b/views/array_view.gd index 3d556d6..e8d966e 100644 --- a/views/array_view.gd +++ b/views/array_view.gd @@ -16,7 +16,7 @@ var _rects = [] var _positions = [] var _pointer = Polygon2D.new() var _pointer_size: int -var _sound = ArraySound.new() +var sound = ArraySound.new() onready var _separation = 128 / _level.array.size func _init(level): @@ -24,7 +24,7 @@ func _init(level): add_child(_level) # NOTE: This is necessary for it to read input add_child(_tween) # NOTE: This is necessary for it to animate add_child(_pointer) - add_child(_sound) + add_child(sound) _pointer.hide() func _ready(): @@ -67,7 +67,7 @@ func _ready(): _pointer.show() func _process(delta): - _sound.frac = _level.get_frac() + sound.frac = _level.get_frac() if _pointer.visible: var pointed = _level.get_pointer() var height = rect_size.y - _pointer_size * 2 @@ -79,7 +79,7 @@ func _process(delta): func _on_ComparisonSort_done(): set_process(false) - _sound.player.stop() + sound.player.stop() _pointer.hide() for i in range(_rects.size()): _rects[i].color = ComparisonSort.EFFECTS.NONE From 1f44607e01a119947ccd8873f5fcb2bc5e25fe50 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Tue, 8 Sep 2020 17:12:43 -0500 Subject: [PATCH 23/29] docs: add Python-style psuedocode --- levels/bogo_sort.gd | 6 ++++++ levels/bubble_sort.gd | 10 ++++++++++ levels/cocktail_sort.gd | 19 +++++++++++++++++++ levels/comb_sort.gd | 11 +++++++++++ levels/cycle_sort.gd | 12 ++++++++++++ levels/insertion_sort.gd | 8 ++++++++ levels/merge_sort.gd | 18 ++++++++++++++++++ levels/odd_even_sort.gd | 14 ++++++++++++++ levels/quick_sort.gd | 13 +++++++++++++ levels/selection_sort.gd | 9 +++++++++ levels/shell_sort.gd | 13 +++++++++++++ scripts/levels.gd | 4 ++-- scripts/menu.gd | 1 + 13 files changed, 136 insertions(+), 2 deletions(-) diff --git a/levels/bogo_sort.gd b/levels/bogo_sort.gd index 2971418..0f8bd57 100644 --- a/levels/bogo_sort.gd +++ b/levels/bogo_sort.gd @@ -11,6 +11,12 @@ Keep on hitting RIGHT ARROW to CONTINUE and hope for the best! class_name BogoSort extends ComparisonSort +const CODE = """ +def bogosort(a): + while not a.sorted(): + a.shuffle() +""" + func _init(array).(array): pass diff --git a/levels/bubble_sort.gd b/levels/bubble_sort.gd index 6fdc66f..5780e2f 100644 --- a/levels/bubble_sort.gd +++ b/levels/bubble_sort.gd @@ -16,6 +16,16 @@ them. Otherwise, hit RIGHT ARROW to continue. class_name BubbleSort extends ComparisonSort +const CODE = """ +def bubble_sort(a): + swapped = true + while swapped: + swapped = false + for i in range(len(a) - 1): + if a[i] > a[i + 1]: + a.swap(i, i + 1) + swapped = true +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/cocktail_sort.gd b/levels/cocktail_sort.gd index 1a243e3..ad6a9f7 100644 --- a/levels/cocktail_sort.gd +++ b/levels/cocktail_sort.gd @@ -13,6 +13,25 @@ them. Otherwise, hit RIGHT ARROW to continue. class_name CocktailSort extends ComparisonSort +const CODE = """ +def cocktail_sort(a): + swapped = true + while swapped: + swapped = false + for i in range(len(a) - 1): + if array[i] > array[i + 1]: + a.swap(i, i + 1) + swapped = true + + if not swapped: + break + + swapped = false + for i in range(len(a) - 1, 0, -1) + if a[i - 1] > a[i]: + a.swap(i - 1, i) + swapped = true +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/comb_sort.gd b/levels/comb_sort.gd index 693005d..360692d 100644 --- a/levels/comb_sort.gd +++ b/levels/comb_sort.gd @@ -12,6 +12,17 @@ them. Otherwise, hit RIGHT ARROW to continue. class_name CombSort extends ComparisonSort +const CODE = """ +def comb_sort(a): + gap = len(a) + swapped = true + while gap != 1 or swapped: + gap = max(gap / 1.3, 1) + for i in range(len(a) - gap): + if a[i] > a[i + gap]: + a.swap(i, i + gap) + swapped = true +""" const SHRINK_FACTOR = 1.3 const ACTIONS = { "SWAP": "Left", diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 243e352..2b3589c 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -14,6 +14,18 @@ Otherwise, hit RIGHT ARROW. class_name CycleSort extends ComparisonSort +const CODE = """ +def cycle_sort(a): + for i in range(len(a)): + while True: + position = 0 + for j in a: + if a[j] > a[i]: + position += 1 + if i == position: + break + a.swap(i, position) +""" const ACTIONS = { "SMALLER": "Left", "BIGGER": "Right", diff --git a/levels/insertion_sort.gd b/levels/insertion_sort.gd index 39680de..7af9479 100644 --- a/levels/insertion_sort.gd +++ b/levels/insertion_sort.gd @@ -17,6 +17,14 @@ advance. class_name InsertionSort extends ComparisonSort +const CODE = """ +def insertion_sort(a): + for i in range(len(a)): + j = i + while j > 0 and a[j - 1] > a[j]: + a.swap(j - 1, j) + j -= 1 +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index f85de24..a64827f 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -17,6 +17,24 @@ the other side's ARROW KEY. class_name MergeSort extends ComparisonSort +const CODE = """ +def merge_sort(a): + size = 1 + while size < len(array): + for block in range(len(array) / size / 2): + merged = [] + begin = size * 2 * block + i = begin + j = begin + size + while len(merged) != size * 2: + if i >= begin + size or a[j] < a[i]: + merged.append(a[j]) + j += 1 + else: + merged.append(a[i]) + i += 1 + a[begin:begin + size] = merged +""" const ACTIONS = { "LEFT": "Left", "RIGHT": "Right", diff --git a/levels/odd_even_sort.gd b/levels/odd_even_sort.gd index 3f7d955..00299c6 100644 --- a/levels/odd_even_sort.gd +++ b/levels/odd_even_sort.gd @@ -13,6 +13,20 @@ them. Otherwise, hit RIGHT ARROW to continue. class_name OddEvenSort extends ComparisonSort +const CODE = """ +def odd_even_sort(a): + swapped = true + while swapped: + swapped = false + for i in range(1, len(a) - 1, 2): + if a[i] > a[i + 1]: + a.swap(i, i + 1) + swapped = true + for i in range(0, len(a) - 1, 2): + if a[i] > a[i + 1]: + a.swap(i, i + 1) + swapped = true +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index b94e4c4..44cc84e 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -19,6 +19,19 @@ RIGHT ARROW to move on. class_name QuickSort extends ComparisonSort +const CODE = """ +def quicksort(array, low=0, high=len(a) - 1): + if low < high: + pivot = a[high] + pointer = low + for i in range(low, high): + if a[i] < pivot: + a.swap(i, pointer) + pointer += 1 + a.swap(pointer, high) + quicksort(a, low, pointer - 1) + quicksort(a, pointer + 1, high) +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index 343d469..41d6fe0 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -18,6 +18,15 @@ repeat. class_name SelectionSort extends ComparisonSort +const CODE = """ +def selection_sort(a): + for i in range(len(a)): + smallest = i + for j in range(i, len(a)): + if a[j] < a[smallest]: + smallest = j + a.swap(i, smallest) +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index 67dc116..015148f 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -8,11 +8,24 @@ by gaps. Hit LEFT ARROW to swap the two highlighted elements as long as they are out of order. When this is no longer the case, hit RIGHT ARROW to +advance. """ class_name ShellSort extends ComparisonSort +const CODE = """ +def shell_sort(a): + gap = len(a) + while gap != 1: + gap = max(gap / 2, 1) + for i in range(gap): + for j in range(i, len(a) - gap, gap): + k = j + while k > gap and a[k - gap] > a[k]: + a.swap(k - gap, k) + k -= gap +""" const ACTIONS = { "SWAP": "Left", "CONTINUE": "Right", diff --git a/scripts/levels.gd b/scripts/levels.gd index 8346d0b..22d1378 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -48,7 +48,7 @@ func _reload(): _restart() _load_scores(_level) $NamesContainer/Names/Current.text = _level.NAME - $Level/Left/Code.text = _level.DESCRIPTION + $Level/Left/Code.text = _level.DESCRIPTION + "\n" + _level.CODE $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS func _restart(): @@ -77,7 +77,7 @@ func _load_scores(level): data.get_node("Times").text = "" for i in data.get_node("Sizes").text.split("\n"): var time = str(GlobalScore.get_time(level.NAME, int(i))) - data.get_node("Times").text += time + data.get_node("Times").text += "%.3f" % float(time) if int(i) != MAX_SIZE: data.get_node("Times").text += "\n" diff --git a/scripts/menu.gd b/scripts/menu.gd index 27f1358..5a57b6e 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -6,6 +6,7 @@ func _ready(): $Buttons/Start.grab_focus() randomize() $Display.add_child(ArrayView.new(_level), true) + AudioServer.set_bus_mute(AudioServer.get_bus_index("Master"), true) func _on_Start_pressed(): GlobalScene.change_scene("res://scenes/levels.tscn") From 65193360897fd7b1c73b53974d54392320c4437c Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Wed, 9 Sep 2020 23:49:23 -0500 Subject: [PATCH 24/29] docs: rewrite descriptions --- levels/bubble_sort.gd | 15 ++++++++++----- levels/cocktail_sort.gd | 10 ++++++---- levels/comb_sort.gd | 10 +++++++++- levels/comparison_sort.gd | 4 ++-- levels/cycle_sort.gd | 17 ++++++++++++----- levels/insertion_sort.gd | 17 +++++++++-------- levels/merge_sort.gd | 14 +++++++------- levels/odd_even_sort.gd | 8 ++++++-- levels/quick_sort.gd | 19 ++++++++++--------- levels/selection_sort.gd | 16 ++++++++-------- levels/shell_sort.gd | 15 ++++++++++----- scenes/levels.tscn | 4 +++- 12 files changed, 92 insertions(+), 57 deletions(-) diff --git a/levels/bubble_sort.gd b/levels/bubble_sort.gd index 5780e2f..08fa1ef 100644 --- a/levels/bubble_sort.gd +++ b/levels/bubble_sort.gd @@ -2,11 +2,16 @@ BUBBLE SORT -Bubble sort iterates through the array and looks at each pair of -elements, swapping them if they are out of order. When it has gone -through the entire array without swapping a single pair, it has -finished. Though simple to understand, bubble sort is hopelessly -inefficient on all but the smallest of arrays. +Bubble sort looks at consecutive pairs of elements and swaps them if +they are out of order, finishing when it has gone through the whole +array from beginning to end without a single swap. The actual level +contains an optimization that skips over elements guaranteed to be +already in place. + +Due to its simplicity, it is commonly taught as the first sorting +algorithm students learn in computer science classes, but is rarely used +in real life because it is slow on large data and other simple quadratic +algorithms like insertion sort perform better. If the two highlighted elements are out of order, hit LEFT ARROW to swap diff --git a/levels/cocktail_sort.gd b/levels/cocktail_sort.gd index ad6a9f7..a564656 100644 --- a/levels/cocktail_sort.gd +++ b/levels/cocktail_sort.gd @@ -2,8 +2,12 @@ COCKTAIL SORT -Cocktail shaker sort is a variation of bubble sort that -alternates going backwards and forwards. +Cocktail sort is a variation of bubble sort that alternates going +backwards and forwards. The actual level contains an optimization that +skips over elements guaranteed to be already in place. + +Because it is bidirectional, it is slightly faster than bubble sort, but +is still quadratic and therefore not used on large data. If the two highlighted elements are out of order, hit LEFT ARROW to swap @@ -22,10 +26,8 @@ def cocktail_sort(a): if array[i] > array[i + 1]: a.swap(i, i + 1) swapped = true - if not swapped: break - swapped = false for i in range(len(a) - 1, 0, -1) if a[i - 1] > a[i]: diff --git a/levels/comb_sort.gd b/levels/comb_sort.gd index 360692d..0d37698 100644 --- a/levels/comb_sort.gd +++ b/levels/comb_sort.gd @@ -2,7 +2,14 @@ COMB SORT -Comb sort is a variant of bubble sort that operates on gapped arrays. +Comb sort is a variant of bubble sort that compares elements a certain +gap apart instead of consecutive elements. This gap is divided after +every pass by an experimentally determined optimal factor of about 1.3. +Once the gap becomes 1, comb sort becomes a regular bubble sort. + +This allows comb sort to get rid of small values near the end more +quickly, which turns out to be the bottleneck in bubble sort, but still +has a quadratic worst case. If the two highlighted elements are out of order, hit LEFT ARROW to swap @@ -17,6 +24,7 @@ def comb_sort(a): gap = len(a) swapped = true while gap != 1 or swapped: + swapped = false gap = max(gap / 1.3, 1) for i in range(len(a) - gap): if a[i] > a[i + gap]: diff --git a/levels/comparison_sort.gd b/levels/comparison_sort.gd index 30932e9..ca11b37 100644 --- a/levels/comparison_sort.gd +++ b/levels/comparison_sort.gd @@ -12,8 +12,8 @@ const EFFECTS = { const DISABLE_TIME = 1.0 var NAME = _get_header().split(" ")[0] -var DESCRIPTION = _get_header().split(" ")[1] -var CONTROLS = _get_header().split(" ")[2] +var DESCRIPTION = _get_header().split(" ")[1].replace(" ", "\n\n") +var CONTROLS = _get_header().split(" ")[-1] var array: ArrayModel diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 2b3589c..4cc2d2a 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -2,13 +2,20 @@ CYCLE SORT -Cycle sort repeatedly counts the number of elements less than the first -and swaps it with that index until the smallest element is reached. Then -it does this process starting at the next out-of-place element. +Cycle sort looks at the first element and finds its correct final +position by counting the number of elements smaller than it. Then it +saves the element at that index, writes the first element there, and +repeats the process with the saved element. For the sake of +demonstration, in the actual level, swaps are used instead. +This results in a quadratic runtime but gives it the special property +of being optimal in the number of writes to the array. This makes cycle +sort useful in storage types where writes are very expensive or reduce +its lifespan. -If the highlighted element is less than the pointer, hit LEFT ARROW. -Otherwise, hit RIGHT ARROW. + +If the highlighted element is less than the element below the blue +pointer, hit LEFT ARROW. Otherwise, hit RIGHT ARROW. """ class_name CycleSort diff --git a/levels/insertion_sort.gd b/levels/insertion_sort.gd index 7af9479..2da6fdc 100644 --- a/levels/insertion_sort.gd +++ b/levels/insertion_sort.gd @@ -2,16 +2,17 @@ INSERTION SORT -Insertion sort goes through the array and inserts each -element into its correct position. It is most similar to how most people -would sort a deck of cards. It is also slow on large arrays but it is -one of the faster quadratic algorithms. It is often used to sort smaller -subarrays in hybrid sorting algorithms. +Insertion sort goes through the array and inserts each element into its +correct place, like how most people would sort a hand of playing cards. +It is one of the fastest quadratic algorithms in practice and is +efficient on small or almost sorted data. It is also simple, stable, and +in-place. For these reasons it is sometimes used within faster divide +and conquer algorithms when the array has been divided to a small size. -Hit LEFT ARROW to swap the two highlighted elements as long as they are -out of order. When this is no longer the case, hit RIGHT ARROW to -advance. + +If the two highlighted elements are out of order, hit LEFT ARROW to swap +them. Otherwise, hit RIGHT ARROW to continue. """ class_name InsertionSort diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index a64827f..8d5e82a 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -2,16 +2,15 @@ MERGE SORT -Merge sort is an efficient sorting algorithm that splits the array into -single-element chunks. Then it merges each pair of chunks until only one -sorted chunk is left by repeatedly choosing the smaller element at the -head of each chunk and moving the head back. However, it needs an entire -array's worth of auxiliary memory. +Merge sort merges subarrays of increasing size by setting a pointer to +the head of each half. Then it repeatedly copies the smaller pointed +element and increments that side's pointer. When one side is exhausted, +it copies the rest of the other side and overwrites the two halves with +the merged copy. Press the ARROW KEY corresponding to the side that the smaller -highlighted element is on. If you've reached the end of one side, press -the other side's ARROW KEY. +highlighted element is on or the non-exhausted side. """ class_name MergeSort @@ -34,6 +33,7 @@ def merge_sort(a): merged.append(a[i]) i += 1 a[begin:begin + size] = merged + size *= 2 """ const ACTIONS = { "LEFT": "Left", diff --git a/levels/odd_even_sort.gd b/levels/odd_even_sort.gd index 00299c6..54fe7f2 100644 --- a/levels/odd_even_sort.gd +++ b/levels/odd_even_sort.gd @@ -2,8 +2,12 @@ ODD-EVEN SORT -Odd-even sort is a variant of bubble sort that alternates on elements at -odd and even indices. +Odd-even sort is a variant of bubble sort that alternates between +comparing consecutive odd-even and even-odd indexed pairs. + +It is not of much use on a single processor as it is designed for +parallel processors, which can perform every comparison in a single pass +at the same time, thus making the algorithm much more efficient. If the two highlighted elements are out of order, hit LEFT ARROW to swap diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index 44cc84e..4a1738e 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -2,18 +2,19 @@ QUICKSORT -Quicksort designates the last element as the pivot and puts everything -less than the pivot before it and everything greater after it. This -partitioning is done by iterating through the array while keeping track -of a pointer initially set to the first element. Every time an element -less than the pivot is encountered, it is swapped with the pointed -element and the pointer moves forward. At the end, the pointer and pivot -are swapped, and the process is repeated on the left and right halves. +Quicksort designates the last element as the pivot and sets a pointer to +the first element. Then it iterates through the array. Every time an +element smaller than the pivot is encountered, that element is swapped +with the pointed element and the pointer is incremented. Once the pivot +is reached, it is swapped with the pointed element and this process is +recursively repeated on the left and right halves. + +Quicksort competes with other linearithmic algorithms like merge sort, +which it is faster than at the tradeoff of stability. If the highlighted element is less than the pivot or the pivot has been -reached, press LEFT ARROW to swap it with the pointer. Otherwise, press -RIGHT ARROW to move on. +reached, press LEFT ARROW. Otherwise, press RIGHT ARROW. """ class_name QuickSort diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index 41d6fe0..85f08d2 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -2,16 +2,16 @@ SELECTION SORT -Selection sort incrementally builds a sorted array by repeatedly looking -for the smallest element and swapping it onto the end of the sorted -portion of the array, which initially starts with size zero but grows -after each round. It is faster than an unoptimized bubble sort but -slower than insertion sort. +Selection sort incrementally builds a sorted subarray by finding the +smallest unprocessed element and putting it in place. +It is not very useful in real life as it is beat by insertion sort. +However, it has the distinguishing feature of making the least number +of swaps in the worst case. -Keep on hitting RIGHT ARROW until you encounter an element that is -smaller than the left highlighted element, then hit LEFT ARROW and -repeat. + +If the two highlighted elements are out of order, hit LEFT ARROW to swap +them. Otherwise, hit RIGHT ARROW to continue. """ diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index 015148f..db376c4 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -2,13 +2,18 @@ SHELL SORT -Shell sort is a variation of insertion sort that sorts arrays separated -by gaps. +Shell sort is a variant of insertion sort that compares elements a +certain gap apart instead of consecutive elements. This gap is divided +by 2 after every pass. Once the gap becomes 1, shell sort becomes a +regular insertion sort. +This allows the final pass of insertion sort to avoid having to move +elements long distances. However, it still has a quadratic worst case, +which can be reduced with more complex gap sequences. -Hit LEFT ARROW to swap the two highlighted elements as long as they are -out of order. When this is no longer the case, hit RIGHT ARROW to -advance. + +If the two highlighted elements are out of order, hit LEFT ARROW to swap +them. Otherwise, hit RIGHT ARROW to continue. """ class_name ShellSort diff --git a/scenes/levels.tscn b/scenes/levels.tscn index fb53295..f673fbf 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -71,7 +71,9 @@ margin_top = 20.0 margin_right = 596.0 margin_bottom = 593.0 size_flags_vertical = 3 -text = "This is a description for the level in the form of psuedocode. +text = "This is a description of the algorithm in plain English. + +This explains the relevance of the algorithm in computer science. def algorithm(parameter): return result" From 2c6036e735e2663c5eb0e17de616ef313eae3721 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 10 Sep 2020 00:11:40 -0500 Subject: [PATCH 25/29] fix: make cycle sort work with duplicate elements Some logic in cycle sort assumed a random permutation of elements. --- levels/cycle_sort.gd | 5 ++++- models/array_model.gd | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 4cc2d2a..9f85968 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -54,8 +54,11 @@ func next(action): return emit_signal("mistake") _index += 1 if _index == array.size: + # Skip over duplicates to avoid infinite cycling + while _smaller != _pointer and array.at(_pointer) == array.at(_smaller): + _smaller += 1 array.swap(_pointer, _smaller) - while array.at(_pointer) == _pointer + 1: + while array.is_in_place(_pointer): _pointer += 1 if _pointer == array.size: return emit_signal("done") diff --git a/models/array_model.gd b/models/array_model.gd index dba8c3c..dd4a824 100644 --- a/models/array_model.gd +++ b/models/array_model.gd @@ -87,6 +87,17 @@ func sort(i, j): _array = front + sorted + back emit_signal("sorted", i, j) +func is_in_place(i): + """Check if the element at index i is in its correct place.""" + var less = 0 + var equal = 0 + for element in _array: + if element < _array[i]: + less += 1 + elif element == _array[i]: + equal += 1 + return less <= i and i < less + equal + func get_size(): return _array.size() From 8f72fbab1d4b4461bb20f698b383c0fcf550c8a4 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 10 Sep 2020 13:55:17 -0500 Subject: [PATCH 26/29] docs: fix bugs in pseudocode --- levels/cycle_sort.gd | 19 +++++++++++-------- levels/merge_sort.gd | 14 ++++++++------ levels/quick_sort.gd | 3 +-- levels/selection_sort.gd | 2 +- levels/shell_sort.gd | 2 +- scripts/levels.gd | 2 +- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index 9f85968..aa6f704 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -10,8 +10,7 @@ demonstration, in the actual level, swaps are used instead. This results in a quadratic runtime but gives it the special property of being optimal in the number of writes to the array. This makes cycle -sort useful in storage types where writes are very expensive or reduce -its lifespan. +sort useful in situations where writes are very expensive. If the highlighted element is less than the element below the blue @@ -25,13 +24,17 @@ const CODE = """ def cycle_sort(a): for i in range(len(a)): while True: - position = 0 - for j in a: - if a[j] > a[i]: - position += 1 - if i == position: + less = equal = 0 + for element in a: + if element < a[i]: + less += 1 + elif element == a[i]: + equal += 1 + if less <= i and i < less + equal: break - a.swap(i, position) + while a[i] == a[less]: + less += 1 + a.swap(i, less) """ const ACTIONS = { "SMALLER": "Left", diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index 8d5e82a..afb2ea7 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -26,13 +26,15 @@ def merge_sort(a): i = begin j = begin + size while len(merged) != size * 2: - if i >= begin + size or a[j] < a[i]: - merged.append(a[j]) - j += 1 + if i >= begin + size: + merged += a[j:begin + size * 2] + elif j >= begin + size * 2: + merged += a[i:begin + size] + elif a[i] < a[j]: + merged.append(a[i++]) else: - merged.append(a[i]) - i += 1 - a[begin:begin + size] = merged + merged.append(a[j++]) + a[begin:begin + size * 2] = merged size *= 2 """ const ACTIONS = { diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index 4a1738e..d0ccee7 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -23,10 +23,9 @@ extends ComparisonSort const CODE = """ def quicksort(array, low=0, high=len(a) - 1): if low < high: - pivot = a[high] pointer = low for i in range(low, high): - if a[i] < pivot: + if a[i] < a[high]: a.swap(i, pointer) pointer += 1 a.swap(pointer, high) diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index 85f08d2..2df5b2d 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -22,7 +22,7 @@ const CODE = """ def selection_sort(a): for i in range(len(a)): smallest = i - for j in range(i, len(a)): + for j in range(i + 1, len(a)): if a[j] < a[smallest]: smallest = j a.swap(i, smallest) diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index db376c4..9b5e722 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -27,7 +27,7 @@ def shell_sort(a): for i in range(gap): for j in range(i, len(a) - gap, gap): k = j - while k > gap and a[k - gap] > a[k]: + while k > i and a[k - gap] > a[k]: a.swap(k - gap, k) k -= gap """ diff --git a/scripts/levels.gd b/scripts/levels.gd index 22d1378..d2be354 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -48,7 +48,7 @@ func _reload(): _restart() _load_scores(_level) $NamesContainer/Names/Current.text = _level.NAME - $Level/Left/Code.text = _level.DESCRIPTION + "\n" + _level.CODE + $Level/Left/Code.text = _level.DESCRIPTION + "\n\n" + _level.CODE.strip_edges() $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS func _restart(): From 31a462bc0e9c298107460d39437a50eb95a80bc3 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 10 Sep 2020 00:14:20 -0500 Subject: [PATCH 27/29] feat: change sizes to 16, 32, 64 and default to 16 128 was just a bit too much for quadratic algorithms and 8 is pretty pointless. --- models/array_model.gd | 2 +- scenes/levels.tscn | 8 ++++---- scripts/levels.gd | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/models/array_model.gd b/models/array_model.gd index dd4a824..8784e65 100644 --- a/models/array_model.gd +++ b/models/array_model.gd @@ -5,7 +5,7 @@ signal removed(i) signal swapped(i, j) signal sorted(i, j) -const DEFAULT_SIZE = 32 +const DEFAULT_SIZE = 16 enum DATA_TYPES { RANDOM_UNIQUE, TRUE_RANDOM, diff --git a/scenes/levels.tscn b/scenes/levels.tscn index f673fbf..56b6dc6 100644 --- a/scenes/levels.tscn +++ b/scenes/levels.tscn @@ -164,14 +164,14 @@ margin_right = 163.0 margin_bottom = 90.0 [node name="Sizes" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] -margin_right = 30.0 +margin_right = 20.0 margin_bottom = 63.0 -text = "8 +text = "16 32 -128" +64" [node name="Times" type="Label" parent="Levels/Level/Right/Info/ScoresContainer/Scores/Data"] -margin_left = 38.0 +margin_left = 28.0 margin_right = 163.0 margin_bottom = 63.0 size_flags_horizontal = 3 diff --git a/scripts/levels.gd b/scripts/levels.gd index d2be354..dbc5619 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -15,8 +15,8 @@ const LEVELS = [ const MIN_WAIT = 1.0 / 64 const MAX_WAIT = 4 -const MIN_SIZE = 8 -const MAX_SIZE = 128 +const MIN_SIZE = 16 +const MAX_SIZE = 64 var _index = LEVELS.find(GlobalScene.get_param("level", LEVELS[0])) var _level: ComparisonSort @@ -98,10 +98,10 @@ func _input(event): if event.is_action_pressed("ui_right", true): _switch_level(_index + 1) if event.is_action_pressed("bigger"): - _size = min(_size * 4, MAX_SIZE) + _size = min(_size * 2, MAX_SIZE) _reload() if event.is_action_pressed("smaller"): - _size = max(_size / 4, MIN_SIZE) + _size = max(_size / 2, MIN_SIZE) _reload() if event.is_action_pressed("faster"): $Timer.wait_time = max($Timer.wait_time / 4, MIN_WAIT) From 4290f16c4344ed7434e59a329d290cebd0c460da Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 10 Sep 2020 16:22:44 -0500 Subject: [PATCH 28/29] refactor: move level information into constants This effectively undoes 7cdc05f99d1c1c30a97d4e27d06d20fa89cdb9ef, which was honestly a dumb idea to begin with, and turned out to break exports for some reason after doing a git bisect. --- levels/bogo_sort.gd | 15 ++++++--------- levels/bubble_sort.gd | 15 ++++++--------- ...cktail_sort.gd => cocktail_shaker_sort.gd} | 19 ++++++++----------- levels/comb_sort.gd | 15 ++++++--------- levels/comparison_sort.gd | 6 ------ levels/cycle_sort.gd | 15 ++++++--------- levels/insertion_sort.gd | 15 ++++++--------- levels/merge_sort.gd | 15 ++++++--------- levels/odd_even_sort.gd | 15 ++++++--------- levels/quick_sort.gd | 15 ++++++--------- levels/selection_sort.gd | 16 ++++++---------- levels/shell_sort.gd | 15 ++++++--------- project.godot | 2 +- scripts/levels.gd | 8 ++++++-- 14 files changed, 75 insertions(+), 111 deletions(-) rename levels/{cocktail_sort.gd => cocktail_shaker_sort.gd} (92%) diff --git a/levels/bogo_sort.gd b/levels/bogo_sort.gd index 0f8bd57..f9c5389 100644 --- a/levels/bogo_sort.gd +++ b/levels/bogo_sort.gd @@ -1,16 +1,13 @@ -""" -BOGOSORT - +class_name BogoSort +extends ComparisonSort +const NAME = "BOGOSORT" +const DESCRIPTION = """ Generates random permutations until the array is sorted. - - +""" +const CONTROLS = """ Keep on hitting RIGHT ARROW to CONTINUE and hope for the best! """ - -class_name BogoSort -extends ComparisonSort - const CODE = """ def bogosort(a): while not a.sorted(): diff --git a/levels/bubble_sort.gd b/levels/bubble_sort.gd index 08fa1ef..c4aeb1e 100644 --- a/levels/bubble_sort.gd +++ b/levels/bubble_sort.gd @@ -1,7 +1,8 @@ -""" -BUBBLE SORT - +class_name BubbleSort +extends ComparisonSort +const NAME = "BUBBLE SORT" +const DESCRIPTION = """ Bubble sort looks at consecutive pairs of elements and swaps them if they are out of order, finishing when it has gone through the whole array from beginning to end without a single swap. The actual level @@ -12,15 +13,11 @@ Due to its simplicity, it is commonly taught as the first sorting algorithm students learn in computer science classes, but is rarely used in real life because it is slow on large data and other simple quadratic algorithms like insertion sort perform better. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name BubbleSort -extends ComparisonSort - const CODE = """ def bubble_sort(a): swapped = true diff --git a/levels/cocktail_sort.gd b/levels/cocktail_shaker_sort.gd similarity index 92% rename from levels/cocktail_sort.gd rename to levels/cocktail_shaker_sort.gd index a564656..9bec6ee 100644 --- a/levels/cocktail_sort.gd +++ b/levels/cocktail_shaker_sort.gd @@ -1,24 +1,21 @@ -""" -COCKTAIL SORT - +class_name CocktailSort +extends ComparisonSort -Cocktail sort is a variation of bubble sort that alternates going +const NAME = "COCKTAIL SHAKER SORT" +const DESCRIPTION = """ +Cocktail shaker sort is a variation of bubble sort that alternates going backwards and forwards. The actual level contains an optimization that skips over elements guaranteed to be already in place. Because it is bidirectional, it is slightly faster than bubble sort, but is still quadratic and therefore not used on large data. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name CocktailSort -extends ComparisonSort - const CODE = """ -def cocktail_sort(a): +def cocktail_shaker_sort(a): swapped = true while swapped: swapped = false diff --git a/levels/comb_sort.gd b/levels/comb_sort.gd index 0d37698..fdea047 100644 --- a/levels/comb_sort.gd +++ b/levels/comb_sort.gd @@ -1,7 +1,8 @@ -""" -COMB SORT - +class_name CombSort +extends ComparisonSort +const NAME = "COMB SORT" +const DESCRIPTION = """ Comb sort is a variant of bubble sort that compares elements a certain gap apart instead of consecutive elements. This gap is divided after every pass by an experimentally determined optimal factor of about 1.3. @@ -10,15 +11,11 @@ Once the gap becomes 1, comb sort becomes a regular bubble sort. This allows comb sort to get rid of small values near the end more quickly, which turns out to be the bottleneck in bubble sort, but still has a quadratic worst case. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name CombSort -extends ComparisonSort - const CODE = """ def comb_sort(a): gap = len(a) diff --git a/levels/comparison_sort.gd b/levels/comparison_sort.gd index ca11b37..718add6 100644 --- a/levels/comparison_sort.gd +++ b/levels/comparison_sort.gd @@ -11,9 +11,6 @@ const EFFECTS = { } const DISABLE_TIME = 1.0 -var NAME = _get_header().split(" ")[0] -var DESCRIPTION = _get_header().split(" ")[1].replace(" ", "\n\n") -var CONTROLS = _get_header().split(" ")[-1] var array: ArrayModel @@ -28,9 +25,6 @@ func _init(array): self.connect("mistake", self, "_on_ComparisonSort_mistake") self.connect("done", self, "_on_ComparisonSort_done") -func _get_header(): - return get_script().source_code.replace("\n", " ").split('"""')[1].strip_edges() - func _ready(): set_process_input(false) diff --git a/levels/cycle_sort.gd b/levels/cycle_sort.gd index aa6f704..e6f4b7d 100644 --- a/levels/cycle_sort.gd +++ b/levels/cycle_sort.gd @@ -1,7 +1,8 @@ -""" -CYCLE SORT - +class_name CycleSort +extends ComparisonSort +const NAME = "CYCLE SORT" +const DESCRIPTION = """ Cycle sort looks at the first element and finds its correct final position by counting the number of elements smaller than it. Then it saves the element at that index, writes the first element there, and @@ -11,15 +12,11 @@ demonstration, in the actual level, swaps are used instead. This results in a quadratic runtime but gives it the special property of being optimal in the number of writes to the array. This makes cycle sort useful in situations where writes are very expensive. - - +""" +const CONTROLS = """ If the highlighted element is less than the element below the blue pointer, hit LEFT ARROW. Otherwise, hit RIGHT ARROW. """ - -class_name CycleSort -extends ComparisonSort - const CODE = """ def cycle_sort(a): for i in range(len(a)): diff --git a/levels/insertion_sort.gd b/levels/insertion_sort.gd index 2da6fdc..80ab2bb 100644 --- a/levels/insertion_sort.gd +++ b/levels/insertion_sort.gd @@ -1,7 +1,8 @@ -""" -INSERTION SORT - +class_name InsertionSort +extends ComparisonSort +const NAME = "INSERTION SORT" +const DESCRIPTION = """ Insertion sort goes through the array and inserts each element into its correct place, like how most people would sort a hand of playing cards. @@ -9,15 +10,11 @@ It is one of the fastest quadratic algorithms in practice and is efficient on small or almost sorted data. It is also simple, stable, and in-place. For these reasons it is sometimes used within faster divide and conquer algorithms when the array has been divided to a small size. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name InsertionSort -extends ComparisonSort - const CODE = """ def insertion_sort(a): for i in range(len(a)): diff --git a/levels/merge_sort.gd b/levels/merge_sort.gd index afb2ea7..1b37a7b 100644 --- a/levels/merge_sort.gd +++ b/levels/merge_sort.gd @@ -1,21 +1,18 @@ -""" -MERGE SORT - +class_name MergeSort +extends ComparisonSort +const NAME = "MERGE SORT" +const DESCRIPTION = """ Merge sort merges subarrays of increasing size by setting a pointer to the head of each half. Then it repeatedly copies the smaller pointed element and increments that side's pointer. When one side is exhausted, it copies the rest of the other side and overwrites the two halves with the merged copy. - - +""" +const CONTROLS = """ Press the ARROW KEY corresponding to the side that the smaller highlighted element is on or the non-exhausted side. """ - -class_name MergeSort -extends ComparisonSort - const CODE = """ def merge_sort(a): size = 1 diff --git a/levels/odd_even_sort.gd b/levels/odd_even_sort.gd index 54fe7f2..9d33b35 100644 --- a/levels/odd_even_sort.gd +++ b/levels/odd_even_sort.gd @@ -1,22 +1,19 @@ -""" -ODD-EVEN SORT - +class_name OddEvenSort +extends ComparisonSort +const NAME = "ODD-EVEN SORT" +const DESCRIPTION = """ Odd-even sort is a variant of bubble sort that alternates between comparing consecutive odd-even and even-odd indexed pairs. It is not of much use on a single processor as it is designed for parallel processors, which can perform every comparison in a single pass at the same time, thus making the algorithm much more efficient. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name OddEvenSort -extends ComparisonSort - const CODE = """ def odd_even_sort(a): swapped = true diff --git a/levels/quick_sort.gd b/levels/quick_sort.gd index d0ccee7..96dd3c5 100644 --- a/levels/quick_sort.gd +++ b/levels/quick_sort.gd @@ -1,7 +1,8 @@ -""" -QUICKSORT - +class_name QuickSort +extends ComparisonSort +const NAME = "QUICKSORT" +const DESCRIPTION = """ Quicksort designates the last element as the pivot and sets a pointer to the first element. Then it iterates through the array. Every time an element smaller than the pivot is encountered, that element is swapped @@ -11,15 +12,11 @@ recursively repeated on the left and right halves. Quicksort competes with other linearithmic algorithms like merge sort, which it is faster than at the tradeoff of stability. - - +""" +const CONTROLS = """ If the highlighted element is less than the pivot or the pivot has been reached, press LEFT ARROW. Otherwise, press RIGHT ARROW. """ - -class_name QuickSort -extends ComparisonSort - const CODE = """ def quicksort(array, low=0, high=len(a) - 1): if low < high: diff --git a/levels/selection_sort.gd b/levels/selection_sort.gd index 2df5b2d..21f5b24 100644 --- a/levels/selection_sort.gd +++ b/levels/selection_sort.gd @@ -1,23 +1,19 @@ -""" -SELECTION SORT - +class_name SelectionSort +extends ComparisonSort +const NAME = "SELECTION SORT" +const DESCRIPTION = """ Selection sort incrementally builds a sorted subarray by finding the smallest unprocessed element and putting it in place. It is not very useful in real life as it is beat by insertion sort. However, it has the distinguishing feature of making the least number of swaps in the worst case. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - - -class_name SelectionSort -extends ComparisonSort - const CODE = """ def selection_sort(a): for i in range(len(a)): diff --git a/levels/shell_sort.gd b/levels/shell_sort.gd index 9b5e722..4d14679 100644 --- a/levels/shell_sort.gd +++ b/levels/shell_sort.gd @@ -1,7 +1,8 @@ -""" -SHELL SORT - +class_name ShellSort +extends ComparisonSort +const NAME = "SHELL SORT" +const DESCRIPTION = """ Shell sort is a variant of insertion sort that compares elements a certain gap apart instead of consecutive elements. This gap is divided by 2 after every pass. Once the gap becomes 1, shell sort becomes a @@ -10,15 +11,11 @@ regular insertion sort. This allows the final pass of insertion sort to avoid having to move elements long distances. However, it still has a quadratic worst case, which can be reduced with more complex gap sequences. - - +""" +const CONTROLS = """ If the two highlighted elements are out of order, hit LEFT ARROW to swap them. Otherwise, hit RIGHT ARROW to continue. """ - -class_name ShellSort -extends ComparisonSort - const CODE = """ def shell_sort(a): gap = len(a) diff --git a/project.godot b/project.godot index d5d4f0b..b8afbe2 100644 --- a/project.godot +++ b/project.godot @@ -42,7 +42,7 @@ _global_script_classes=[ { "base": "ComparisonSort", "class": "CocktailSort", "language": "GDScript", -"path": "res://levels/cocktail_sort.gd" +"path": "res://levels/cocktail_shaker_sort.gd" }, { "base": "ComparisonSort", "class": "CombSort", diff --git a/scripts/levels.gd b/scripts/levels.gd index dbc5619..f1a5345 100644 --- a/scripts/levels.gd +++ b/scripts/levels.gd @@ -48,8 +48,12 @@ func _reload(): _restart() _load_scores(_level) $NamesContainer/Names/Current.text = _level.NAME - $Level/Left/Code.text = _level.DESCRIPTION + "\n\n" + _level.CODE.strip_edges() - $Level/Right/Info/ControlsContainer/Controls.text = _level.CONTROLS + $Level/Left/Code.text = _format(_level.DESCRIPTION) + "\n\n" + _level.CODE.strip_edges() + $Level/Right/Info/ControlsContainer/Controls.text = _format(_level.CONTROLS) + +func _format(text): + # Helper method to format text + return text.strip_edges().replace("\n", " ").replace(" ", "\n\n") func _restart(): set_process_input(true) From 5abdf55b42173d79d5b67e2e0e22bdccc3d4fef7 Mon Sep 17 00:00:00 2001 From: Daniel Ting Date: Thu, 10 Sep 2020 17:13:20 -0500 Subject: [PATCH 29/29] chore: update README --- CONTRIBUTING.md | 4 ---- README.md | 28 ++++++++-------------------- assets/levels.png | Bin 175432 -> 207222 bytes 3 files changed, 8 insertions(+), 24 deletions(-) delete mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3776231..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,4 +0,0 @@ -As I would like to submit this project to the Congressional App -Challenge, I unfortunately cannot accept contributions until Monday, -October 19th, 2020 at the earliest. Kindly hold any issues and pull -requests until then. diff --git a/README.md b/README.md index 202c7a1..195c113 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,23 @@

- Logo + Logo

Human Computer Simulator

- A game where you get to become your favorite algorithm or data structure! -
- Report Bug - · - Request Feature + Become your favorite sorting algorithm!

-## Table of Contents - -* [About the Project](#about-the-project) -* [Getting Started](#getting-started) - -## About The Project - ![Level select screen](assets/levels.png) +Have you ever wondered what it feels like to be a sorting algorithm‽ Now you can find out! In *Human Computer Simulator*, you control an algorithm operating on an array, trying to sort as fast as possible. With 10 different levels, a cool visualization, and optional sound effects, you can fulfill your sorting dreams... -You may have come across the famous [15 Sorting Algorithms in 6 Minutes](https://www.youtube.com/watch?v=kPRA0W1kECg) video by [Timo Bingmann](https://github.com/bingmann) at some point in your computer science career. There is currently no shortage of neat visualizations of all kinds of algorithms, but what if you could become the algorithm itself? - -In *Human Computer Simulator*, you control an algorithm operating on some data structure. Right now, the game is limited to sorting arrays. The end vision is to have a library of interactive, playable levels on anything from a search on a binary tree to Dijkstra's shortest path on a graph. +A demo (large download warning: ~5 MB gzipped) is available on this repository's [Github Pages](https://danielzting.github.io/human-computer-simulator). It requires a desktop browser with support for WebAssembly and WebGL. -It's written using the Godot game engine and licensed with [almost no restrictions](LICENSE.txt). Use it to make a lecture a bit more interesting, review for an assignment, or just kill time. Hope you enjoy. +## Anti-pitch -## Getting Started +This is beta software, so there will inevitably be things that are confusing, broken, or straight up wrong. See the [issues](https://github.com/DanielZTing/human-computer-simulator/issues) for a list of caveats and don't hesitate to open another one if you find something new. -This software is in an alpha stage of development and I do not plan on releasing ready-to-run builds until a stable v1.0 release. However, it is very easy to run and hack the source code yourself. Just grab the lightweight free and open source [Godot game engine](https://godotengine.org/download), import the `project.godot` file, and hit the play button. +## Contributing -A demo version (large download warning: ~20 MB) is available on this repository's [Github Pages](https://danielzting.github.io/human-computer-simulator). It requires a desktop browser with support for WebAssembly and WebGL; mobile is not currently supported. Since this is still in alpha, some things might be dumb, make no sense whatsoever, or just break outright. I welcome any feedback you may have. +I welcome any bug reports or feature requests. Pull requests are appreciated as well, though I apologize for my code in advance. If you like this so much that you want to [throw money at me](https://venmo.com/DanielZTing), I will add any 80x24 ASCII text block of your choosing to the README and credits. \ No newline at end of file diff --git a/assets/levels.png b/assets/levels.png index 46dddf178223227b6607c45fe21f2c4b76cdf3d5..2e9595d4ea0eb7147926871f255ceb7d9b651f8e 100644 GIT binary patch literal 207222 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⪚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

Z<|f`#-d_ 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%0APFJjp_SccxVAqqKVqIQH;0jx+ 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 literal 175432 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

^*o%=1Onj!jEU2A!gSKV~!8_w-=)N3q> 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