乒乓球模拟器

时间:2013-02-08 13:25:29

标签: python python-2.7 nested-loops

我编辑了上一个问题,因为我提出了我认为正确的代码。 这背后的逻辑应该是: 虽然套装没有结束并且不是领带10:10:玩家A开始投球并且无论他是否赢得积分都进行两次,然后玩家B接受发球并且也进行两次。它一直持续到设置结束,除非服务器更改每个得分点时绑定10点10分。

任何人都可以检查代码是否完美无瑕?谢谢。

def simOneSet(probA, probB):
    serving = "A"
    scoreA = scoreB = 0
    while not setOver(scoreA, scoreB):
        if scoreA != 10 and scoreB != 10:
            if serving == "A":
                for i in range(2):
                    if random() < probA:
                        scoreA += 1
                    else:
                        scoreB += 1
                serving = "B"
            else:
                for i in range(2):
                    if random() < probB:
                        scoreB +=1
                    else:
                        scoreA += 1
                serving = "A"    
        # when there is a tie 10:10
        else:
            if serving == "A":
                if random() < probA:
                    scoreA += 1
                    serving = "B"
                else:
                    scoreB += 1
                    serving = "B"
            else:
                if random() < probB:
                    scoreB += 1
                    serving = "B"
                else:
                    scoreA += 1
                    serving = "A"
    return scoreA, scoreB

4 个答案:

答案 0 :(得分:3)

我会用dict在玩家之间“切换”:

other = {'A':'B', 'B':'A'}

然后,如果serving等于'A',那么other[serving]将等于'B',如果serving等于'B',则{{1}等于other[serving]


您还可以使用collections.Counter来跟踪分数:

'A'

还要注意这段代码中的内容

In [1]: import collections

In [2]: score = collections.Counter()

In [3]: score['A'] += 1

In [4]: score['A'] += 1

In [5]: score['B'] += 1

In [6]: score
Out[6]: Counter({'A': 2, 'B': 1})

有两个块基本上是相同的想法重复两次。这表明可以通过使用函数来加强代码。例如,我们可以定义一个函数 if serving == "A": for i in range(2): if random() < probA: scoreA += 1 else: scoreB += 1 else: for i in range(2): if random() < probB: scoreB +=1 else: scoreA += 1 ,当给出一个概率serve和一个玩家(probA)时,它会返回获胜的玩家:

B

然后上面的代码将成为

def serve(prob, player):
    if random.random() < prob:
        return player
    else:
        return other[player]

因此,您可以通过这种方式使代码紧凑:

    for i in range(2):
        winner = serve(prob[serving], serving)
        score[winner] += 1

答案 1 :(得分:0)

这是一个提示:

如果您拥有该套装中的圆形编号并知道哪个玩家开始投放,您就拥有了所需要知道的所有人。

然后在循环的开头或结尾处的简单if语句就足够了。

如果这太复杂,请尝试通过模拟服务器每周开始的游戏开始。

答案 2 :(得分:0)

可能有帮助的是语法

var = 1 if var == 2 else 2

如果var为2,则var为1,如果var为1,则var为2.我觉得这是学校问题,所以我不想完全放弃答案:)

提示:你的想法是正确的。

答案 3 :(得分:0)

来自随机导入*

P1=P2=0

while 1 :

  p1=p2=0

  while 2 :

    if random() < 0.5 : p1 +=1

    else              : p2 +=1


    if(p1 >=11 or p2 >=11) and abs(p1-p2) > 1: break

  P1 += p1 > p2; P2 += p2 > p1

  print "%2d : %2d (%d : %d)" % (p1, p2, P1, P2)

  if P1 == 4 or P2 == 4 : break

我希望这有帮助,它对我有用