理解不了啊
我在用OOP方式 写个小软件 主要是解读Karel代码然后把它跑到地图去
遇到的问题是我在一个method里
# 简单点就这意思
# 原本代码
# a = str, b = list, c = dic
# print(a in (b or c))
# Result = False
# 但这样就可以
# print((a in b) or (a in c))
# Result = True
# 另外测试了一下 没问题啊 不知道为什么在method里就不行了
# 测试法
a = {
"turnright" : ["move"],
"bbb" : 1
}
text = "turnright"
print(text in (a or b)) # Return True
print(text in a or text in b) # Return True
text in (a or b), 先计算 x = a or b, 再计算 text in x。而 a 是 list, b 是dict, 则 a or b 没有实际的逻辑意义。
下一行, text in list 和 text in dict 都是有明确定义的逻辑算式。两个逻辑算式的 or 运算不会有歧义.
>>> a = [1,2,3]
>>> b = {4:'a', 5:'b', 6:'c'}
>>> c = a or b
>>> c
[1, 2, 3]
>>> d = a + list(b.keys())
>>> d
[1, 2, 3, 4, 5, 6]
>>> e = 4
>>> e in a or e in b
True
>>> e in a
False
>>> e in b
True
>>> e in (a or b)
False
不知道你这个问题是否已经解决, 如果还没有解决的话:回答:
首先,需要了解Karel编程语言和OOP编程思想。Karel编程语言是面向对象编程的,主要用于教学。OOP编程思想是将程序中的数据和方法封装在类中,从而实现更好的模块化和代码重用。
其次,需要确定该小软件使用的Karel编程语言的版本和对应的解释器,例如Karel++或者Python版Karel。
接下来,可以分为以下几步将Karel代码解读并运行到地图上:
import tkinter as tk
class Map:
def __init__(self, width, height):
self.width = width
self.height = height
self.obstacles = set()
def load_map(self, map_file):
with open(map_file, 'r') as f:
for line in f:
x, y = map(int, line.strip().split())
self.obstacles.add((x, y))
def create_window(self):
window = tk.Tk()
canvas = tk.Canvas(window, width=self.width*10, height=self.height*10)
canvas.pack()
for x, y in self.obstacles:
canvas.create_rectangle(x*10, y*10, (x+1)*10, (y+1)*10, fill='black')
return window, canvas
class Karel:
def __init__(self, map_obj, x, y, dir):
self.map_obj = map_obj
self.x = x
self.y = y
self.dir = dir
def move(self):
if self.dir == 'NORTH':
if (self.x, self.y-1) not in self.map_obj.obstacles:
self.y -= 1
elif self.dir == 'EAST':
if (self.x+1, self.y) not in self.map_obj.obstacles:
self.x += 1
elif self.dir == 'SOUTH':
if (self.x, self.y+1) not in self.map_obj.obstacles:
self.y += 1
elif self.dir == 'WEST':
if (self.x-1, self.y) not in self.map_obj.obstacles:
self.x -= 1
def turn_left(self):
dirs = {'NORTH': 'WEST', 'WEST': 'SOUTH', 'SOUTH': 'EAST', 'EAST': 'NORTH'}
self.dir = dirs[self.dir]
# 其他动作方法(如放置/捡起beeper等)根据需要进行添加
def execute(self, command):
if command == 'move':
self.move()
elif command == 'turn_left':
self.turn_left()
解释Karel代码。将Karel代码解释为方法序列,并按序执行。因为Karel编程语言针对的是教学,所以只有一些简单的基础控制语句,如if/else、while等。这一步比较简单,不再列出详细代码。
将Karel对象在地图上的位置信息进行更新,并在地图窗口中重新绘制Karel的位置。这可以在Karel对象的动作方法中进行。例如,Karel对象的前进方法中,如果Karel成功移动了一步,就需要更新Karel的位置信息,并在地图窗口中重新绘制Karel的位置。
def move(self):
if self.dir == 'NORTH':
if (self.x, self.y-1) not in self.map_obj.obstacles:
self.y -= 1
self.map_obj.canvas.move(self.body, 0, -10)
elif self.dir == 'EAST':
if (self.x+1, self.y) not in self.map_obj.obstacles:
self.x += 1
self.map_obj.canvas.move(self.body, 10, 0)
elif self.dir == 'SOUTH':
if (self.x, self.y+1) not in self.map_obj.obstacles:
self.y += 1
self.map_obj.canvas.move(self.body, 0, 10)
elif self.dir == 'WEST':
if (self.x-1, self.y) not in self.map_obj.obstacles:
self.x -= 1
self.map_obj.canvas.move(self.body, -10, 0)
完整代码如下:
import tkinter as tk
class Map:
def __init__(self, width, height):
self.width = width
self.height = height
self.obstacles = set()
def load_map(self, map_file):
with open(map_file, 'r') as f:
for line in f:
x, y = map(int, line.strip().split())
self.obstacles.add((x, y))
def create_window(self):
window = tk.Tk()
canvas = tk.Canvas(window, width=self.width*10, height=self.height*10)
canvas.pack()
for x, y in self.obstacles:
canvas.create_rectangle(x*10, y*10, (x+1)*10, (y+1)*10, fill='black')
return window, canvas
class Karel:
def __init__(self, map_obj, x, y, dir):
self.map_obj = map_obj
self.x = x
self.y = y
self.dir = dir
self.body = self.map_obj.canvas.create_oval((x+0.1)*10, (y+0.1)*10, (x+0.9)*10, (y+0.9)*10, fill='red')
def move(self):
if self.dir == 'NORTH':
if (self.x, self.y-1) not in self.map_obj.obstacles:
self.y -= 1
self.map_obj.canvas.move(self.body, 0, -10)
elif self.dir == 'EAST':
if (self.x+1, self.y) not in self.map_obj.obstacles:
self.x += 1
self.map_obj.canvas.move(self.body, 10, 0)
elif self.dir == 'SOUTH':
if (self.x, self.y+1) not in self.map_obj.obstacles:
self.y += 1
self.map_obj.canvas.move(self.body, 0, 10)
elif self.dir == 'WEST':
if (self.x-1, self.y) not in self.map_obj.obstacles:
self.x -= 1
self.map_obj.canvas.move(self.body, -10, 0)
def turn_left(self):
dirs = {'NORTH': 'WEST', 'WEST': 'SOUTH', 'SOUTH': 'EAST', 'EAST': 'NORTH'}
self.dir = dirs[self.dir]
# 其他动作方法(如放置/捡起beeper等)根据需要进行添加
def execute(self, command):
if command == 'move':
self.move()
elif command == 'turn_left':
self.turn_left()
def main():
map_obj = Map(12, 12)
map_obj.load_map('map.txt')
window, canvas = map_obj.create_window()
karel = Karel(map_obj, 1, 1, 'EAST')
for command in ['move', 'turn_left', 'move', 'turn_left', 'move', 'move']:
karel.execute(command)
window.mainloop()
if __name__ == '__main__':
main()