逻辑问题啊,有人知道吗

理解不了啊
我在用OOP方式 写个小软件 主要是解读Karel代码然后把它跑到地图去
遇到的问题是我在一个method里

img

# 简单点就这意思
# 原本代码
# 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
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/750473
  • 以下回答来自chatgpt:

    回答:

    首先,需要了解Karel编程语言和OOP编程思想。Karel编程语言是面向对象编程的,主要用于教学。OOP编程思想是将程序中的数据和方法封装在类中,从而实现更好的模块化和代码重用。

    其次,需要确定该小软件使用的Karel编程语言的版本和对应的解释器,例如Karel++或者Python版Karel。

    接下来,可以分为以下几步将Karel代码解读并运行到地图上:

    1. 创建地图对象。根据Karel代码中的地图大小和障碍物分布情况,创建一个地图对象,并将地图信息载入到该对象中。例如,在Python版Karel中,可以使用tkinter库创建地图窗口,并在地图窗口中绘制出地图障碍物。
    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
    
    1. 创建Karel对象。根据Karel代码中的描述,创建一个Karel对象,并将该对象放置在地图的起点位置。Karel对象应该包含Karel在地图上的位置信息和朝向信息,以及Karel能够执行的动作方法(如前进、转向、放置/捡起beeper等)。
    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()        
    
    1. 解释Karel代码。将Karel代码解释为方法序列,并按序执行。因为Karel编程语言针对的是教学,所以只有一些简单的基础控制语句,如if/else、while等。这一步比较简单,不再列出详细代码。

    2. 将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)
    
    1. 将Karel代码运行并观察效果。在执行Karel代码时,可以将Karel对象和地图对象作为参数传入,并按照步骤4中的方法更新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
            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()
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^