【问题标题】:If Statement never works如果语句永远不起作用
【发布时间】:2014-04-27 23:46:43
【问题描述】:

似乎main() 底部的最后一个If statement 永远不会是True。输出应显示"G"。但事实并非如此。

要么就是这样,要么方法 decide() 永远不会将 self.choice 更改为 "G"

有什么想法吗?

这是我的代码:

## FF Encounter Mapper - New OOP ##

RNLUT = (*snip* - a massive tuple)

class Field(object):
    """A field segment."""
    def __init__(self, name, danger_inc, distance):
        self.name = name
        self.danger_inc = danger_inc
        self.distance = distance

    def get_seg(self):
    # return current segment
        return self.segment

    def get_stats(self):
    # return field stats
        return self.name, self.danger_inc, self.distance

    def dinc(self):
    # return field danger increment
        return self.danger_inc


class Player(object):
    """A player."""
    def __init__(self, step_id, danger, b_loop):
        self.step_id = step_id
        self.danger = danger
        self.b_loop = b_loop
        self.rnd = (RNLUT[self.step_id] - self.b_loop) & 0xFF
        self.danger_limit = ((self.rnd + 1) * 256)
        self.segment = []
        self.choice = "W"

    def get_stats(self):
    # return player stats
        return self.step_id, self.danger, self.danger_limit, self.b_loop, self.choice

    def step(self, dinc):
    # take one step and update stats
        self.choice = "W"
        self.danger = (self.danger + dinc)
        if self.danger > 65535:
            self.danger = dinc
        self.step_id += 1
        if self.step_id > 255:
            self.step_id = 0
        if self.step_id == 0:
            self.b_loop = self.b_loop + 13
        if self.b_loop > 255:
            self.b_loop = 0     
        self.step_id += 1                               
        if self.step_id > 255:
            self.step_id = 0
        if self.step_id == 0:
            self.b_loop = self.b_loop + 13                  
        if self.b_loop > 255:
            self.b_loop = 0
        self.rnd = (RNLUT[self.step_id] - self.b_loop) & 0xFF
        self.danger_limit = ((self.rnd + 1) * 256)

    def is_fight(self):
    # return true if the current step is a battle
        return self.danger > self.danger_limit

    def decide(self, choice):
    # make a decision: glitch or battle (default: walk)
        if choice == "G":
            self.choice == "G"
        elif choice == "B":
            self.choice == "B"
            self.danger = 0
        print self.choice

    def log(self):
    # add stats to segment log
        self.segment.append(self.get_stats())


def main():
    myfield = Field("test_field", 113, 256)
    cloud = Player(250,0,13)
    dinc = myfield.dinc()
    print "initial: ", cloud.get_stats()
    print "Run the whole segment:"
    while len(cloud.segment) < 128: # walk field distance
        cloud.step(dinc)
        if cloud.is_fight() == True:        # if there's a battle
            cloud.decide("G")       # perform Glitch every battle
        cloud.log()                 # add stats and decision to segment log
    for i in cloud.segment:
        print i                     # output log


main()

输出错误:

...
(86, 5198, 9472, 26, 'W')
(88, 5311, 48640, 26, 'W')
(90, 5424, 4096, 26, 'W')    # THIS SHOULD BE "G" 
(92, 5537, 65280, 26, 'W')   # BECAUSE self.danger > self.danger_limit

...

如果decide() 正常工作,则条目“90”应为“G”...

【问题讨论】:

  • 不用写if cloud.is_fight() == True: if cloud.is_fight():就够了
  • 请注意,这个if cloud.is_fight() == True 是多余的。如果is_fight() 返回bool,你可以直接说if cloud.is_fight()
  • @RubenBermudez 是的。但它不起作用,所以我试图让它明确,以防万一。
  • 这似乎是题外话,因为问题是由一个简单的、不可重现的印刷错误引起的。

标签: python class oop python-2.7


【解决方案1】:

在决定函数中,而不是分配'G'给self.choice:

if choice == "G":
    self.choice = "G"

你打错了:

if choice == "G":
    self.choice == "G"

【讨论】:

  • 谢谢。初学者的错误,幸运的是我是初学者 :) 解决了它。
  • 发生在每个人身上,伙计:)
  • 下一行的== "B" 也一样。
猜你喜欢
  • 2012-12-26
  • 2013-06-20
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多