mirror of
https://github.com/mfocko/blog.git
synced 2024-11-21 20:43:48 +01:00
feat(ib002,ib111): add backtracking exercise
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
117f865ee8
commit
e71fcfdf4f
48 changed files with 2361 additions and 0 deletions
164
ib002/04-recursion/karel_1.md
Normal file
164
ib002/04-recursion/karel_1.md
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
---
|
||||||
|
title: Recursion and backtracking with Robot Karel
|
||||||
|
description: |
|
||||||
|
A problem with too many restrictions.
|
||||||
|
tags:
|
||||||
|
- python
|
||||||
|
- karel
|
||||||
|
- recursion
|
||||||
|
- backtracking
|
||||||
|
---
|
||||||
|
|
||||||
|
- [Sources](pathname://files/ib002/karel_1)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
In this exercise we will be working with a Robot Karel and with a »very« limited
|
||||||
|
resources. The point of this exercise is to show how powerful recursion and
|
||||||
|
backtracking can be even without anything else at your hand.
|
||||||
|
|
||||||
|
## Your environment and problem description
|
||||||
|
|
||||||
|
### Environment
|
||||||
|
|
||||||
|
You are given a robot that is present in a maze and is looking for an exit. Maze
|
||||||
|
consists of different walls and exit is marked with a single so-called „beeper“.
|
||||||
|
|
||||||
|
Walking into a wall results in a permanent damage of the robot.
|
||||||
|
|
||||||
|
### Interface
|
||||||
|
|
||||||
|
You can control the robot using the following interface:
|
||||||
|
|
||||||
|
- actions — you can use them to change the current state of the robot and its
|
||||||
|
surroundings
|
||||||
|
- `robot.step()` — moves robot one step further
|
||||||
|
- `robot.turn_left()` — turns robot 90-degrees counter-clockwise
|
||||||
|
- notice that you are not given `turn_right` or `turn_around`, but feel free
|
||||||
|
to implement them yourself
|
||||||
|
- `robot.pick_beeper()` and opposite operation `robot.put_beeper()` — that
|
||||||
|
allows you to either pick or put „beeper“ from or onto the current position
|
||||||
|
- queries — you can use them to check the current state of the robot and its
|
||||||
|
surroundings
|
||||||
|
- `robot.beepers_present()` — to check if there are any beepers at the robot's
|
||||||
|
current location
|
||||||
|
- `robot.left_is_clear()` — to check if you can step to the left
|
||||||
|
- analogically for `front` and `right`
|
||||||
|
|
||||||
|
:::caution
|
||||||
|
|
||||||
|
Helper functions / procedures are allowed. Return values are allowed.
|
||||||
|
|
||||||
|
**Variables are prohibited!**
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Your task is to decide whether there is an exit from the maze or not. You can see
|
||||||
|
an example of a maze here:
|
||||||
|
|
||||||
|
![Image of the maze](/img/ib002/karel_1/maze.png)
|
||||||
|
|
||||||
|
## Simple problem to get familiar with the robot
|
||||||
|
|
||||||
|
If you feel completely lost after the previous description, let me start you off
|
||||||
|
with a simpler problem.
|
||||||
|
|
||||||
|
You are standing in front of the stairs, your task is to walk up the stairs.
|
||||||
|
|
||||||
|
You can see an example of such map here:
|
||||||
|
|
||||||
|
![Image of the stairs](/img/ib002/karel_1/stairs.png)
|
||||||
|
|
||||||
|
## Brainstorm the idea
|
||||||
|
|
||||||
|
As a first step write down any ideas and things that you have noticed or came to
|
||||||
|
your mind. Ideally:
|
||||||
|
|
||||||
|
- Write down a nested list of the problems, e.g.
|
||||||
|
|
||||||
|
:::info Example
|
||||||
|
|
||||||
|
Problem: I want to find out whether the display on smartphone should rotate.
|
||||||
|
|
||||||
|
- Check if display has been rotated
|
||||||
|
- Read data from some sensor
|
||||||
|
- From what sensor
|
||||||
|
- In what format are the data I have read?
|
||||||
|
- How do I communicate with the sensor?
|
||||||
|
- What is the meaning of the data that I got?
|
||||||
|
- How can I process it?
|
||||||
|
|
||||||
|
:::
|
||||||
|
- Write down list of problems that can happen, e.g.
|
||||||
|
|
||||||
|
:::info Example continued
|
||||||
|
|
||||||
|
Following the same problem.
|
||||||
|
|
||||||
|
- What if the sensor doesn't work?
|
||||||
|
- What if the data doesn't conform to the specification?
|
||||||
|
- What if my formulas are wrong?
|
||||||
|
|
||||||
|
:::
|
||||||
|
- Write down **anything** you consider important to solving the problem, e.g.
|
||||||
|
|
||||||
|
:::info Example continued once again
|
||||||
|
|
||||||
|
- I could probably use gyroscope.
|
||||||
|
- I should probably look up the datasheet for that module.
|
||||||
|
- I could write some tests to verify that my computations are correct.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## »Rough« pseudocode
|
||||||
|
|
||||||
|
As a next step write a **mock up** of a pseudocode solving the problem, you are
|
||||||
|
allowed to use comments as placeholders for bigger chunks of code.
|
||||||
|
|
||||||
|
Those comments are also a very good hints for decomposition and short, but
|
||||||
|
descriptive, commnets (if they are short enough and you decide not to factor them
|
||||||
|
out to separate functions).
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
|
||||||
|
The smaller the function is, the easier it is to test it and argue about its
|
||||||
|
correctness.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
## »Proper« pseudocode
|
||||||
|
|
||||||
|
If you are satisfied with the _»rough« pseudocode_, it's time to convert it into
|
||||||
|
a proper one. Get rid of the uncertain pieces of functionality and replace them
|
||||||
|
with proper pseudocode, i.e. list of the things that should happen in its place.
|
||||||
|
|
||||||
|
## Library
|
||||||
|
|
||||||
|
If you got here, and you **actually** wrote down the pseudocode, you can try your
|
||||||
|
solution after downloading the sources linked at the beginning. If you download
|
||||||
|
the ZIP-file, you can there:
|
||||||
|
|
||||||
|
- `generate_mazes.py` - that was used to generate the same maze with beepers in
|
||||||
|
different locations
|
||||||
|
- `karel_tk.py` - library which can run Karel given the his world
|
||||||
|
- documentation can be found [here](https://www.fi.muni.cz/~xfocko/ib111/10/docs/)
|
||||||
|
- also requires Tk Python library to be installed (it should be included in
|
||||||
|
majority of Python installations)
|
||||||
|
- `*.kw` - which represent multiple worlds for Karel I have prepared
|
||||||
|
- `skeleton.py` - skeleton for your solution, needs to be put in the same directory
|
||||||
|
as `karel_tk.py` and takes path to the world as a first argument, example usage:
|
||||||
|
|
||||||
|
$ python3 skeleton.py stairs.kw
|
||||||
|
|
||||||
|
- of course, this file can be renamed ;)
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
Solution to this problem will be released as a second part, so that you can try
|
||||||
|
it out by yourself without any influence of „example solution“.
|
||||||
|
|
||||||
|
If you want to get any feedback, feel free to mail me your solution (including
|
||||||
|
all the steps that lead to your final solution, if you wish to get feedback on
|
||||||
|
those too).
|
0
static/files/ib002/karel_1/.zipit
Normal file
0
static/files/ib002/karel_1/.zipit
Normal file
21
static/files/ib002/karel_1/generate_mazes.py
Normal file
21
static/files/ib002/karel_1/generate_mazes.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from itertools import product
|
||||||
|
|
||||||
|
|
||||||
|
def generate_map(template: str, st: int, ave: int) -> str:
|
||||||
|
return template.format(st=st, ave=ave)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
template = None
|
||||||
|
with open("maze_skel.kw", "r") as f:
|
||||||
|
template = f.read()
|
||||||
|
|
||||||
|
for st, ave in product(range(1, 7), range(1, 7)):
|
||||||
|
with open("maze{:03d}.kw".format(st * 6 + ave), "w") as out:
|
||||||
|
print(generate_map(template, st, ave), file=out)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
791
static/files/ib002/karel_1/karel_tk.py
Normal file
791
static/files/ib002/karel_1/karel_tk.py
Normal file
|
@ -0,0 +1,791 @@
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import Enum, IntEnum
|
||||||
|
from functools import wraps
|
||||||
|
from itertools import product
|
||||||
|
from math import radians, sin, cos
|
||||||
|
from sys import stderr
|
||||||
|
import tkinter as tk
|
||||||
|
from typing import Tuple, Union
|
||||||
|
|
||||||
|
|
||||||
|
def check_before(precondition):
|
||||||
|
"""
|
||||||
|
Decorator for running methods before executing a method.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
call_before: Function to be called before executing a method.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Parametrized decorator that can be used to wrap method with the
|
||||||
|
`call_before`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def parametrized(f):
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
if not precondition(self, *args, **kwargs, fn=f):
|
||||||
|
return
|
||||||
|
return f(self, *args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return parametrized
|
||||||
|
|
||||||
|
|
||||||
|
def after(call_after):
|
||||||
|
"""
|
||||||
|
Decorator for running methods after executing a method.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
call_after: Function to be called after executing a method.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Parametrized decorator that can be used to wrap method with the
|
||||||
|
`call_after`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def parametrized(f):
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
result = f(self, *args, **kwargs)
|
||||||
|
call_after(self, *args, **kwargs, fn=f)
|
||||||
|
return result
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return parametrized
|
||||||
|
|
||||||
|
|
||||||
|
def skip_for_summary(f):
|
||||||
|
"""
|
||||||
|
Decorator used for skipping a function call if the Karel is running
|
||||||
|
in a summary mode.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
if self.summary_mode:
|
||||||
|
return
|
||||||
|
return f(self, *args, **kwargs)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
class Block(IntEnum):
|
||||||
|
"""
|
||||||
|
Represents a field in the world of the Robot Karel.
|
||||||
|
It can be either clear or a wall.
|
||||||
|
"""
|
||||||
|
|
||||||
|
Clear = 0
|
||||||
|
Wall = -1
|
||||||
|
|
||||||
|
|
||||||
|
# Constants for major angles
|
||||||
|
EAST, NORTH, WEST, SOUTH = 0, 90, 180, 270
|
||||||
|
|
||||||
|
|
||||||
|
# @dataclass(frozen=True, slots=True)
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class _Direction:
|
||||||
|
"""
|
||||||
|
angle: Represents heading of the Robot Karel
|
||||||
|
"""
|
||||||
|
|
||||||
|
angle: int
|
||||||
|
|
||||||
|
@property
|
||||||
|
def vector(self) -> Tuple[int, int]:
|
||||||
|
"""
|
||||||
|
Get a direction vector in the current direction the robot is heading.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Pair of ints, representing a vector of (dx, dy).
|
||||||
|
"""
|
||||||
|
angle, x, y = radians(self.angle), 1, 0
|
||||||
|
return (
|
||||||
|
x * round(cos(angle)) - y * round(sin(angle)),
|
||||||
|
x * round(sin(angle)) + y * round(cos(angle)),
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def in_world(self) -> str:
|
||||||
|
"""
|
||||||
|
Get a character that is being put in the graphical representation of
|
||||||
|
the Robot Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Character to be put in the world.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
Direction.East.value: ">",
|
||||||
|
Direction.North.value: "^",
|
||||||
|
Direction.West.value: "<",
|
||||||
|
Direction.South.value: "v",
|
||||||
|
# Direction.East.value: "⮞",
|
||||||
|
# Direction.North.value: "⮝",
|
||||||
|
# Direction.West.value: "⮜",
|
||||||
|
# Direction.South.value: "⮟",
|
||||||
|
}[self]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def as_string(self) -> str:
|
||||||
|
"""
|
||||||
|
Returns a string with a direction for Tk label.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Label of the direction
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
Direction.East.value: "east",
|
||||||
|
Direction.North.value: "north",
|
||||||
|
Direction.West.value: "west",
|
||||||
|
Direction.South.value: "south",
|
||||||
|
}[self]
|
||||||
|
|
||||||
|
def __add__(self, angle: int) -> "_Direction":
|
||||||
|
return _Direction((360 + self.angle + angle) % 360)
|
||||||
|
|
||||||
|
|
||||||
|
class Direction(Enum):
|
||||||
|
"""
|
||||||
|
Provides constants of directions Karel can face.
|
||||||
|
"""
|
||||||
|
|
||||||
|
East = _Direction(EAST)
|
||||||
|
North = _Direction(NORTH)
|
||||||
|
West = _Direction(WEST)
|
||||||
|
South = _Direction(SOUTH)
|
||||||
|
|
||||||
|
|
||||||
|
class KarelWindow:
|
||||||
|
def __init__(self, karel: "Karel", scale: int, font: str):
|
||||||
|
self.size = 32 * scale
|
||||||
|
|
||||||
|
self.steps = tk.Label(text=karel.steps, anchor="e")
|
||||||
|
self.steps.grid(row=0, column=0, sticky="e")
|
||||||
|
|
||||||
|
self.last_cmd = tk.Label(text=karel.last_command, anchor="w")
|
||||||
|
self.last_cmd.grid(row=0, column=1, columnspan=3, sticky="w")
|
||||||
|
|
||||||
|
tk.Label(text="CORNER").grid(row=1, column=0)
|
||||||
|
tk.Label(text="FACING").grid(row=1, column=1)
|
||||||
|
tk.Label(text="BEEP-BAG").grid(row=1, column=2)
|
||||||
|
tk.Label(text="BEEP-CORNER").grid(row=1, column=3)
|
||||||
|
|
||||||
|
self.corner = tk.Label()
|
||||||
|
self.corner.grid(row=2, column=0)
|
||||||
|
|
||||||
|
self.facing = tk.Label()
|
||||||
|
self.facing.grid(row=2, column=1)
|
||||||
|
|
||||||
|
self.beep_bag = tk.Label()
|
||||||
|
self.beep_bag.grid(row=2, column=2)
|
||||||
|
|
||||||
|
self.beep_corner = tk.Label()
|
||||||
|
self.beep_corner.grid(row=2, column=3)
|
||||||
|
|
||||||
|
self.canvas = tk.Canvas(
|
||||||
|
width=((karel.world.width + 1) // 2 + 2) * self.size,
|
||||||
|
height=((karel.world.height + 1) // 2 + 2) * self.size,
|
||||||
|
background="black",
|
||||||
|
)
|
||||||
|
self.canvas.grid(column=0, row=3, columnspan=4)
|
||||||
|
|
||||||
|
self.font = f"{font} {int(12 * scale)}"
|
||||||
|
|
||||||
|
self.__draw_world(karel.world)
|
||||||
|
self.render(karel)
|
||||||
|
|
||||||
|
def __draw_world(self, world: "World"):
|
||||||
|
m, n = (world.height + 1) // 2, (world.width + 1) // 2
|
||||||
|
|
||||||
|
# NUMBERS
|
||||||
|
self.canvas.create_text(
|
||||||
|
self.size // 2,
|
||||||
|
self.size,
|
||||||
|
text="ST.",
|
||||||
|
fill="white",
|
||||||
|
anchor="s",
|
||||||
|
font=self.font,
|
||||||
|
)
|
||||||
|
for i in range(m):
|
||||||
|
self.canvas.create_text(
|
||||||
|
self.size - 8,
|
||||||
|
(i + 2) * self.size - self.size // 2,
|
||||||
|
text=(m - i),
|
||||||
|
anchor="e",
|
||||||
|
fill="white",
|
||||||
|
font=self.font,
|
||||||
|
)
|
||||||
|
y = ((m + 1) * self.size) + 8
|
||||||
|
self.canvas.create_text(
|
||||||
|
(n + 1) * self.size + self.size // 2,
|
||||||
|
y,
|
||||||
|
text="AVE.",
|
||||||
|
fill="white",
|
||||||
|
anchor="n",
|
||||||
|
font=self.font,
|
||||||
|
)
|
||||||
|
for i in range(n):
|
||||||
|
self.canvas.create_text(
|
||||||
|
(i + 2) * self.size - self.size // 2,
|
||||||
|
y,
|
||||||
|
text=(i + 1),
|
||||||
|
anchor="n",
|
||||||
|
fill="white",
|
||||||
|
font=self.font,
|
||||||
|
)
|
||||||
|
|
||||||
|
# BORDER
|
||||||
|
self.canvas.create_rectangle(
|
||||||
|
self.size,
|
||||||
|
self.size,
|
||||||
|
self.size * (n + 1),
|
||||||
|
self.size * (m + 1),
|
||||||
|
fill="",
|
||||||
|
outline="white",
|
||||||
|
)
|
||||||
|
|
||||||
|
for row, col in product(range(world.height), range(world.width)):
|
||||||
|
block = world.data[row][col]
|
||||||
|
if row % 2 == 0 and col % 2 == 0:
|
||||||
|
self.__print_beeper(world, block or ".", row // 2, col // 2)
|
||||||
|
elif block == Block.Wall:
|
||||||
|
size = self.size
|
||||||
|
x = size + col // 2 * size
|
||||||
|
y = (world.width + 1) // 2 * size - row // 2 * size
|
||||||
|
if row % 2 == 1 and col % 2 == 0:
|
||||||
|
self.canvas.create_line(x, y, x + size, y, fill="white")
|
||||||
|
elif row % 2 == 0:
|
||||||
|
x += size
|
||||||
|
self.canvas.create_line(x, y, x, y + size, fill="white")
|
||||||
|
|
||||||
|
self.canvas.update()
|
||||||
|
|
||||||
|
def __print_beeper(
|
||||||
|
self, world: "World", beeper: Union[str, int], row: int, column: int
|
||||||
|
):
|
||||||
|
self.canvas.create_text(
|
||||||
|
(column + 1) * self.size + self.size // 2,
|
||||||
|
((world.height + 1) // 2 - row) * self.size + self.size // 2,
|
||||||
|
text=str(beeper),
|
||||||
|
anchor="center",
|
||||||
|
fill="white",
|
||||||
|
font=self.font,
|
||||||
|
)
|
||||||
|
|
||||||
|
def render(self, karel: "Karel"):
|
||||||
|
self.facing["text"] = karel.direction.as_string
|
||||||
|
|
||||||
|
self.steps["text"] = karel.steps
|
||||||
|
self.last_cmd["text"] = karel.last_command
|
||||||
|
self.corner["text"] = f"({(karel.x + 2) // 2}, {(karel.y + 2) // 2})"
|
||||||
|
self.beep_bag["text"] = karel.beepers
|
||||||
|
self.beep_corner["text"] = karel.world.data[karel.y][karel.x]
|
||||||
|
|
||||||
|
i, j = (karel.y + 2) // 2, (karel.x + 2) // 2
|
||||||
|
size = self.size
|
||||||
|
x, y = j * size, ((karel.world.height + 1) // 2 - i + 1) * size
|
||||||
|
self.canvas.create_rectangle(
|
||||||
|
x + 1, y + 1, x + size - 1, y + size - 1, fill="black"
|
||||||
|
)
|
||||||
|
|
||||||
|
karel_on_map = karel.direction.in_world
|
||||||
|
self.canvas.create_text(
|
||||||
|
x + size // 2,
|
||||||
|
y + size // 2,
|
||||||
|
text=karel_on_map,
|
||||||
|
font=self.font + " bold",
|
||||||
|
fill="yellow",
|
||||||
|
anchor="center",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.canvas.update()
|
||||||
|
self.canvas.after(karel.step_delay)
|
||||||
|
|
||||||
|
def update(self, karel: "Karel", dx: int, dy: int):
|
||||||
|
block = karel.world.data[karel.y - 2 * dy][karel.x - 2 * dx]
|
||||||
|
|
||||||
|
i, j = (karel.y - 2 * dy) // 2, (karel.x - 2 * dx) // 2
|
||||||
|
x, y = (j + 1) * self.size, (
|
||||||
|
(karel.world.height + 1) // 2 - i
|
||||||
|
) * self.size
|
||||||
|
|
||||||
|
self.canvas.create_rectangle(
|
||||||
|
x + 1, y + 1, x + self.size - 1, y + self.size - 1, fill="black"
|
||||||
|
)
|
||||||
|
self.__print_beeper(karel.world, block or ".", i, j)
|
||||||
|
|
||||||
|
def error(self, karel: "Karel", message: str):
|
||||||
|
self.render(karel)
|
||||||
|
|
||||||
|
self.last_cmd["foreground"] = "red"
|
||||||
|
self.last_cmd["text"] = f"Error Shutoff! ({message})"
|
||||||
|
|
||||||
|
|
||||||
|
class World:
|
||||||
|
def __init__(self, width, height, data):
|
||||||
|
self.width = width * 2 - 1
|
||||||
|
self.height = height * 2 - 1
|
||||||
|
self.data = [
|
||||||
|
[0 for _ in range(self.width)] for _ in range(self.height)
|
||||||
|
]
|
||||||
|
|
||||||
|
if self.width > 30 or self.height > 30:
|
||||||
|
raise ValueError(
|
||||||
|
"The given world is greater than the max values of [{}x{}]".format(
|
||||||
|
30, 30
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self._parse_world(data)
|
||||||
|
|
||||||
|
def __parse_wall(self, column, row, orientation, line):
|
||||||
|
column = column * 2 - 2
|
||||||
|
row = row * 2 - 2
|
||||||
|
|
||||||
|
if column % 2 == 1 or row % 2 == 1:
|
||||||
|
raise ValueError("Wrong position of the wall")
|
||||||
|
|
||||||
|
if orientation == "E":
|
||||||
|
column += 1
|
||||||
|
elif orientation == "W":
|
||||||
|
column -= 1
|
||||||
|
elif orientation == "N":
|
||||||
|
row += 1
|
||||||
|
elif orientation == "S":
|
||||||
|
row -= 1
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
"Unknown wall orientation '{}' on line {} in world file".format(
|
||||||
|
orientation, line
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.data[row][column] = Block.Wall
|
||||||
|
if column % 2 == 1 and row % 2 == 0:
|
||||||
|
if row + 1 < self.height:
|
||||||
|
self.data[row + 1][column] = Block.Wall
|
||||||
|
if row - 1 >= 0:
|
||||||
|
self.data[row - 1][column] = Block.Wall
|
||||||
|
else:
|
||||||
|
if column + 1 < self.width:
|
||||||
|
self.data[row][column + 1] = Block.Wall
|
||||||
|
if column - 1 >= 0:
|
||||||
|
self.data[row][column - 1] = Block.Wall
|
||||||
|
|
||||||
|
def __parse_beepers(self, column, row, count):
|
||||||
|
column = column * 2 - 2
|
||||||
|
row = row * 2 - 2
|
||||||
|
self.data[row][column] = count
|
||||||
|
|
||||||
|
def _parse_world(self, world_content):
|
||||||
|
for i, line in enumerate(world_content, 1):
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
block, column, row, arg = [part.upper() for part in line.split()]
|
||||||
|
if block == "W":
|
||||||
|
self.__parse_wall(int(column), int(row), arg, i)
|
||||||
|
elif block == "B":
|
||||||
|
self.__parse_beepers(int(column), int(row), int(arg))
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
"Unknown block character '{}' on line {} in world file".format(
|
||||||
|
block, i
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Karel:
|
||||||
|
def __init__(
|
||||||
|
self, filename, summary_mode=False, scale=1, font="monospace"
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Turn Karel on.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filename: Path to the file containing Karel's world and initial
|
||||||
|
settings.
|
||||||
|
summary_mode: Disable rendering of the Karel's world in the window.
|
||||||
|
|
||||||
|
Defaults to `False`.
|
||||||
|
scale: Change the scaling factor of the font used to render Karel's
|
||||||
|
world.
|
||||||
|
|
||||||
|
Defaults to `1`.
|
||||||
|
font: Change the default monospace font that is used to render the
|
||||||
|
world.
|
||||||
|
|
||||||
|
Defaults to `"monospace"`.
|
||||||
|
"""
|
||||||
|
self.summary_mode = summary_mode
|
||||||
|
|
||||||
|
world_content = None
|
||||||
|
with open(filename) as world_file:
|
||||||
|
world_content = world_file.read()
|
||||||
|
|
||||||
|
first_line, world = world_content.split("\n", maxsplit=1)
|
||||||
|
width, height, x, y, direction, beepers = first_line.split()
|
||||||
|
direction = direction.upper()
|
||||||
|
|
||||||
|
self.world = World(int(width), int(height), world.split("\n"))
|
||||||
|
self.x, self.y = int(x) * 2 - 2, int(y) * 2 - 2
|
||||||
|
|
||||||
|
if direction == "S":
|
||||||
|
self.direction = Direction.South.value
|
||||||
|
elif direction == "W":
|
||||||
|
self.direction = Direction.West.value
|
||||||
|
elif direction == "E":
|
||||||
|
self.direction = Direction.East.value
|
||||||
|
elif direction == "N":
|
||||||
|
self.direction = Direction.North.value
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknown Karel's direction")
|
||||||
|
|
||||||
|
self.beepers = int(beepers)
|
||||||
|
|
||||||
|
self.steps = 0
|
||||||
|
self.step_delay = 1000
|
||||||
|
self.is_running = True
|
||||||
|
self.last_command = "turn_on"
|
||||||
|
|
||||||
|
self._initialize_window(scale, font)
|
||||||
|
|
||||||
|
@skip_for_summary
|
||||||
|
def _initialize_window(self, scale, font):
|
||||||
|
"""
|
||||||
|
Initializes a window where the Karel is drawn.
|
||||||
|
"""
|
||||||
|
self._window = KarelWindow(self, scale, font)
|
||||||
|
|
||||||
|
@skip_for_summary
|
||||||
|
def __update(self, dx, dy):
|
||||||
|
"""
|
||||||
|
Updates Karel's position in the window.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
dx: Change along the horizontal axis.
|
||||||
|
dy: Change along the vertical axis.
|
||||||
|
"""
|
||||||
|
self._window.update(self, dx, dy)
|
||||||
|
|
||||||
|
def __render(self, fn, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Updates step counter and last command for Karel.
|
||||||
|
If the robot is not running in a summary mode, then the window
|
||||||
|
is rendered once again.
|
||||||
|
"""
|
||||||
|
if not self.is_running:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.steps += 1
|
||||||
|
self.last_command = fn.__name__
|
||||||
|
|
||||||
|
if not self.summary_mode:
|
||||||
|
self._window.render(self)
|
||||||
|
|
||||||
|
def __error(self, message):
|
||||||
|
"""
|
||||||
|
Provides error handling.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message: Error message to be shown.
|
||||||
|
"""
|
||||||
|
if not self.summary_mode:
|
||||||
|
self._window.error(self, message)
|
||||||
|
self.is_running = False
|
||||||
|
else:
|
||||||
|
print(f"Error Shutoff! ({message})", file=stderr)
|
||||||
|
|
||||||
|
@skip_for_summary
|
||||||
|
def __deinit(self):
|
||||||
|
tk.mainloop()
|
||||||
|
|
||||||
|
def __check_state(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Assures that commands are not run while the robot is not running.
|
||||||
|
|
||||||
|
Robot is not running when error has occurred.
|
||||||
|
"""
|
||||||
|
return self.is_running
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def beepers_in_bag(self):
|
||||||
|
"""
|
||||||
|
Check if there are any beepers in the Karel's bag.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is at least one beeper in Karel's beeper bag,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.beepers > 0
|
||||||
|
|
||||||
|
def no_beepers_in_bag(self):
|
||||||
|
"""
|
||||||
|
Check if there are no beepers in the Karel's bag.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is no beeper in Karel's beeper bag, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.beepers_in_bag()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def front_is_clear(self):
|
||||||
|
"""
|
||||||
|
Check if there is no wall in front of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is no obstacle in front of Karel, `False` otherwise.
|
||||||
|
"""
|
||||||
|
dx, dy = self.direction.vector
|
||||||
|
if not (
|
||||||
|
0 <= self.x + dx < self.world.width
|
||||||
|
and 0 <= self.y + dy < self.world.height
|
||||||
|
):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.world.data[self.y + dy][self.x + dx] == Block.Wall:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def front_is_blocked(self):
|
||||||
|
"""
|
||||||
|
Check if there is a wall in front of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is an obstacle in front of Karel, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.front_is_clear()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def __side_is_clear(self, d):
|
||||||
|
"""
|
||||||
|
Helper function for determining whether the sides of Karel are clear.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
d: Counterclockwise change in angle of Karel's heading.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if the side after applying the `d` counterclokwise turn
|
||||||
|
is clear, `False` otherwise.
|
||||||
|
"""
|
||||||
|
original_direction = self.direction
|
||||||
|
self.direction = self.direction + d
|
||||||
|
|
||||||
|
is_clear = self.front_is_clear()
|
||||||
|
self.direction = original_direction
|
||||||
|
|
||||||
|
return is_clear
|
||||||
|
|
||||||
|
def left_is_clear(self):
|
||||||
|
"""
|
||||||
|
Check if there is no wall to the left side of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is no obstacle to the left side of Karel,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.__side_is_clear(90)
|
||||||
|
|
||||||
|
def left_is_blocked(self):
|
||||||
|
"""
|
||||||
|
Check if there is a wall to the left side of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is an obstacle to the left side of Karel,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.left_is_clear()
|
||||||
|
|
||||||
|
def right_is_clear(self):
|
||||||
|
"""
|
||||||
|
Check if there is no wall to the right side of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is no obstacle to the right side of Karel,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.__side_is_clear(-90)
|
||||||
|
|
||||||
|
def right_is_blocked(self):
|
||||||
|
"""
|
||||||
|
Check if there is a wall to the right side of Karel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is an obstacle to the right side of Karel,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.right_is_clear()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def facing_north(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is facing north.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is facing north, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.direction == Direction.North
|
||||||
|
|
||||||
|
def not_facing_north(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is »not« facing north.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is »not« facing north, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.facing_north()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def facing_south(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is facing south.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is facing south, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.direction == Direction.South
|
||||||
|
|
||||||
|
def not_facing_south(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is »not« facing south.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is »not« facing south, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.facing_south()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def facing_east(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is facing east.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is facing east, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.direction == Direction.East
|
||||||
|
|
||||||
|
def not_facing_east(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is »not« facing east.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is »not« facing east, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.facing_east()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def facing_west(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is facing west.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is facing west, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.direction == Direction.West
|
||||||
|
|
||||||
|
def not_facing_west(self):
|
||||||
|
"""
|
||||||
|
Check if Karel is »not« facing west.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if Karel is »not« facing west, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.facing_west()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
def beepers_present(self):
|
||||||
|
"""
|
||||||
|
Check whether Karel stands on a position that has any beepers present.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is at least one beeper present on the current
|
||||||
|
position, `False` otherwise.
|
||||||
|
"""
|
||||||
|
return self.world.data[self.y][self.x] > 0
|
||||||
|
|
||||||
|
def no_beepers_present(self):
|
||||||
|
"""
|
||||||
|
Check whether Karel stands on a position that has no beepers present.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
`True` if there is no beeper present on the current position,
|
||||||
|
`False` otherwise.
|
||||||
|
"""
|
||||||
|
return not self.beepers_present()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
@after(__render)
|
||||||
|
def step(self):
|
||||||
|
"""
|
||||||
|
Move Karel one position in the direction he's facing.
|
||||||
|
"""
|
||||||
|
if not self.front_is_clear():
|
||||||
|
return self.__error("Can't move this way")
|
||||||
|
|
||||||
|
dx, dy = self.direction.vector
|
||||||
|
self.x += 2 * dx
|
||||||
|
self.y += 2 * dy
|
||||||
|
self.__update(dx, dy)
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
@after(__render)
|
||||||
|
def turn_left(self):
|
||||||
|
"""
|
||||||
|
Turn Karel counterclockwise, i.e. left, by 90 degrees.
|
||||||
|
"""
|
||||||
|
self.direction = self.direction + 90
|
||||||
|
|
||||||
|
@after(__render)
|
||||||
|
def turn_off(self):
|
||||||
|
"""
|
||||||
|
Turn Karel off.
|
||||||
|
"""
|
||||||
|
self.is_running = False
|
||||||
|
self.__deinit()
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
@after(__render)
|
||||||
|
def put_beeper(self):
|
||||||
|
"""
|
||||||
|
Take a beeper from Karel's beeper bag and put on the current position.
|
||||||
|
"""
|
||||||
|
if self.beepers <= 0:
|
||||||
|
return self.__error("Karel has no beeper to put at the corner")
|
||||||
|
|
||||||
|
self.world.data[self.y][self.x] += 1
|
||||||
|
self.beepers -= 1
|
||||||
|
|
||||||
|
@check_before(__check_state)
|
||||||
|
@after(__render)
|
||||||
|
def pick_beeper(self):
|
||||||
|
"""
|
||||||
|
Pick a beeper from the current position and put it into Karel's
|
||||||
|
beeper bag.
|
||||||
|
"""
|
||||||
|
if self.world.data[self.y][self.x] <= 0:
|
||||||
|
return self.__error("There is no beeper at the corner")
|
||||||
|
|
||||||
|
self.world.data[self.y][self.x] -= 1
|
||||||
|
self.beepers += 1
|
||||||
|
|
||||||
|
def set_step_delay(self, delay):
|
||||||
|
"""
|
||||||
|
Set delay of a Karel's step.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
delay: Delay of one step in milliseconds.
|
||||||
|
"""
|
||||||
|
self.step_delay = delay
|
||||||
|
|
||||||
|
def get_step_delay(self):
|
||||||
|
"""
|
||||||
|
Get current delay of a Karel's step.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Current delay in milliseconds.
|
||||||
|
"""
|
||||||
|
return self.step_delay
|
34
static/files/ib002/karel_1/maze007.kw
Normal file
34
static/files/ib002/karel_1/maze007.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze008.kw
Normal file
34
static/files/ib002/karel_1/maze008.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze009.kw
Normal file
34
static/files/ib002/karel_1/maze009.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze010.kw
Normal file
34
static/files/ib002/karel_1/maze010.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze011.kw
Normal file
34
static/files/ib002/karel_1/maze011.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze012.kw
Normal file
34
static/files/ib002/karel_1/maze012.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 1 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze013.kw
Normal file
34
static/files/ib002/karel_1/maze013.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze014.kw
Normal file
34
static/files/ib002/karel_1/maze014.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze015.kw
Normal file
34
static/files/ib002/karel_1/maze015.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze016.kw
Normal file
34
static/files/ib002/karel_1/maze016.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze017.kw
Normal file
34
static/files/ib002/karel_1/maze017.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze018.kw
Normal file
34
static/files/ib002/karel_1/maze018.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 2 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze019.kw
Normal file
34
static/files/ib002/karel_1/maze019.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze020.kw
Normal file
34
static/files/ib002/karel_1/maze020.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze021.kw
Normal file
34
static/files/ib002/karel_1/maze021.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze022.kw
Normal file
34
static/files/ib002/karel_1/maze022.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze023.kw
Normal file
34
static/files/ib002/karel_1/maze023.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze024.kw
Normal file
34
static/files/ib002/karel_1/maze024.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 3 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze025.kw
Normal file
34
static/files/ib002/karel_1/maze025.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze026.kw
Normal file
34
static/files/ib002/karel_1/maze026.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze027.kw
Normal file
34
static/files/ib002/karel_1/maze027.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze028.kw
Normal file
34
static/files/ib002/karel_1/maze028.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze029.kw
Normal file
34
static/files/ib002/karel_1/maze029.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze030.kw
Normal file
34
static/files/ib002/karel_1/maze030.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 4 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze031.kw
Normal file
34
static/files/ib002/karel_1/maze031.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze032.kw
Normal file
34
static/files/ib002/karel_1/maze032.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze033.kw
Normal file
34
static/files/ib002/karel_1/maze033.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze034.kw
Normal file
34
static/files/ib002/karel_1/maze034.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze035.kw
Normal file
34
static/files/ib002/karel_1/maze035.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze036.kw
Normal file
34
static/files/ib002/karel_1/maze036.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 5 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze037.kw
Normal file
34
static/files/ib002/karel_1/maze037.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 1 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze038.kw
Normal file
34
static/files/ib002/karel_1/maze038.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 2 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze039.kw
Normal file
34
static/files/ib002/karel_1/maze039.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 3 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze040.kw
Normal file
34
static/files/ib002/karel_1/maze040.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 4 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze041.kw
Normal file
34
static/files/ib002/karel_1/maze041.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 5 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
34
static/files/ib002/karel_1/maze042.kw
Normal file
34
static/files/ib002/karel_1/maze042.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B 6 6 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
32
static/files/ib002/karel_1/maze069.kw
Normal file
32
static/files/ib002/karel_1/maze069.kw
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
30
static/files/ib002/karel_1/maze666.kw
Normal file
30
static/files/ib002/karel_1/maze666.kw
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
6 6 2 1 E 72
|
||||||
|
|
||||||
|
B 6 3 1
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 3 1 N
|
||||||
|
W 4 1 N
|
||||||
|
|
||||||
|
W 2 5 N
|
||||||
|
W 3 5 N
|
||||||
|
W 4 5 N
|
||||||
|
|
||||||
|
W 1 2 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 E
|
||||||
|
|
||||||
|
W 4 2 E
|
||||||
|
W 2 3 E
|
||||||
|
W 2 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 1 E
|
||||||
|
W 5 2 E
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 E
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 3 N
|
||||||
|
W 6 3 S
|
34
static/files/ib002/karel_1/maze_skel.kw
Normal file
34
static/files/ib002/karel_1/maze_skel.kw
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
6 6 1 1 E 72
|
||||||
|
|
||||||
|
B {st} {ave} 1
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 1 3 E
|
||||||
|
W 1 4 E
|
||||||
|
W 1 5 N
|
||||||
|
|
||||||
|
W 2 1 N
|
||||||
|
W 2 2 E
|
||||||
|
W 2 2 N
|
||||||
|
W 2 4 N
|
||||||
|
W 2 5 E
|
||||||
|
|
||||||
|
W 3 2 N
|
||||||
|
W 3 3 N
|
||||||
|
W 3 4 E
|
||||||
|
W 3 5 E
|
||||||
|
|
||||||
|
W 4 1 E
|
||||||
|
W 4 1 N
|
||||||
|
W 4 3 E
|
||||||
|
W 4 3 N
|
||||||
|
W 4 4 E
|
||||||
|
W 4 5 E
|
||||||
|
|
||||||
|
W 5 2 E
|
||||||
|
W 5 2 N
|
||||||
|
W 5 4 E
|
||||||
|
W 5 5 N
|
||||||
|
W 5 6 E
|
||||||
|
|
||||||
|
W 6 4 N
|
28
static/files/ib002/karel_1/skeleton.py
Normal file
28
static/files/ib002/karel_1/skeleton.py
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
from karel_tk import Karel
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
class SuperKarel(Karel):
|
||||||
|
# you can define your own helper functions on Karel here, if you wish to
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
# TODO
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Please provide a path to the world as an argument.")
|
||||||
|
return
|
||||||
|
|
||||||
|
k = SuperKarel(sys.argv[1], scale=3, font="Iosevka\\ Term")
|
||||||
|
k.set_step_delay(500)
|
||||||
|
|
||||||
|
k.run()
|
||||||
|
|
||||||
|
k.turn_off()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
17
static/files/ib002/karel_1/stairs.kw
Normal file
17
static/files/ib002/karel_1/stairs.kw
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
9 9 1 1 E 0
|
||||||
|
W 2 1 E
|
||||||
|
W 3 2 S
|
||||||
|
W 3 2 E
|
||||||
|
W 4 3 S
|
||||||
|
W 4 3 E
|
||||||
|
W 5 4 S
|
||||||
|
W 5 4 E
|
||||||
|
W 6 5 S
|
||||||
|
W 7 4 W
|
||||||
|
W 7 3 W
|
||||||
|
W 7 2 W
|
||||||
|
W 7 1 W
|
||||||
|
|
||||||
|
B 3 2 1
|
||||||
|
B 4 3 1
|
||||||
|
B 5 4 1
|
20
static/files/ib002/karel_1/stairs2.kw
Normal file
20
static/files/ib002/karel_1/stairs2.kw
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
9 9 1 1 E 0
|
||||||
|
|
||||||
|
W 1 1 E
|
||||||
|
W 2 1 N
|
||||||
|
|
||||||
|
W 3 2 S
|
||||||
|
W 3 2 E
|
||||||
|
W 4 3 S
|
||||||
|
W 4 3 E
|
||||||
|
W 5 4 S
|
||||||
|
W 5 4 E
|
||||||
|
W 6 5 S
|
||||||
|
W 7 4 W
|
||||||
|
W 7 3 W
|
||||||
|
W 7 2 W
|
||||||
|
W 7 1 W
|
||||||
|
|
||||||
|
B 3 2 1
|
||||||
|
B 4 3 1
|
||||||
|
B 5 4 1
|
BIN
static/img/ib002/karel_1/maze.png
Normal file
BIN
static/img/ib002/karel_1/maze.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
static/img/ib002/karel_1/stairs.png
Normal file
BIN
static/img/ib002/karel_1/stairs.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
Loading…
Reference in a new issue