坦克移動問題python解法

某次戰役中,爲便於信息交互,我軍偵察部門將此次戰役的關鍵高地座標設定爲(x=0,y=0)並規定,每向東增加100米,x加1,每向北增加100米,y加1。

同時,我軍情報部門也破譯了敵軍向坦克發送的指揮信號,其中有三種信號(L,R,M)用於控制坦克的運動,L 和 R 分別表示使令坦克向左、向右轉向,M 表示令坦克直線開進100米,其它信號如T用於時間同步,P用於反轉信號,既出現p,後面的信號向左變爲向右,向右變爲向左,向前變爲向後,反之亦然。

一日,我軍偵察兵發現了敵軍的一輛坦克,偵察兵立即將坦克所在座標(P, Q)及坦克前進方向(W:西,E:東,N:北,S:南)發送給指揮部,同時啓動信號接收器,將坦克接收到的信號實時同步發往指揮部,指揮部根據這些信息得以實時掌控了該坦克的位置,並使用榴彈炮精準地擊毀了該坦克。

假設,偵察兵發送給指揮部的信息如下:坦克座標:(11,39)坦克運行方向:W,坦克接收到的信號爲:MTMPRPMTMLMRPRMTPLMMTLMRRMP,請通過編程計算出坦克所在的位置。

class Tank:
    option = {'E': 'self.x_add(1)', 'S': 'self.y_add(-1)', 'W': 'self.x_add(-1)', 'N': 'self.y_add(1)'}
    direction_list = 'ESWN'

    def __init__(self, x, y, direction, signal=''):
        self.__x = x
        self.__y = y
        self.__direction = direction
        self.__signal = signal
        self.__reverse_flag = True

    def x_add(self, step):
        self.__x += step

    def y_add(self, step):
        self.__y += step

    # 設置反轉標識
    def reverse(self):
        self.__reverse_flag = False if self.__reverse_flag else True

    # 根據反轉標識,獲取反轉後的指令
    def correct(self, order):
        if self.__reverse_flag:
            return order
        else:
            return 'R' if order == 'R' else 'L'

    # 根據方向移動
    def move(self):
        exec(self.option[self.__direction])

    # 設置前進方向
    def set_direction(self, order):
        self.correct(order)
        index = self.direction_list.index(self.__direction)
        if order == 'L':
            self.__direction = self.direction_list[(index - 1) % 4]
        else:
            self.__direction = self.direction_list[(index + 1) % 4]

    # 分析信號
    def analysis(self):
        for order in self.__signal:
            if order == 'M':
                self.move()
            elif order in ('L', 'R'):
                self.set_direction(order)
            elif order == 'P':
                self.reverse()
            else:
                print('Time')

        print('location:(%d,%d),direction:%s' % (self.__x, self.__y, self.__direction))


tank = Tank(11, 39, 'W', 'MTMPRPMTMLMRPRMTPLMMTLMRRMP')
tank.analysis()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章