2017-04-03 75 views
1

我得到了一个“网格”文件状设计,如:Python列表理解,和迭代

5,20,13 
2,0,1,3,0 
1,2,1,2,1 
2,1,2,1,0 
0,2,0,2,2 
0,3,3,3,1 

为了使攻击模拟器。 第一行代表n(网格大小),p(每平方的损失百分比),k(必须通过最后一条线获得的总数)。

我已经跑进问题是仿真的一部分,我明白如何遍历的代码行的事实和做数学题对它们进行编辑,如:

numAP = numAttackPokemon 
gridRules = gymData[0]  
gymGrid = gymData[1]  
n = gridRules[0]   
p = gridRules[1] 
k = gridRules[2]   
numPRC = float(numAP/n) 
numPRCR = [numPRC] * n  

for numRow in range(0, n): 
    gymGridNum = gymGrid[numRow] 
    aList = [] 
    for num in gymGridNum: 
     numDefSub = numPRCR[num] - gymGridNum[num] 

     if numDefSub <= 0: 
      print("You have failed, restart the program and try again!") 
      break 
     else: 
      aList.append(numDefSub) 

returns: 
    [18.0, 20.0, 19.0, 17.0, 20.0] 
    [19.0, 18.0, 19.0, 18.0, 19.0] 
    [18.0, 19.0, 18.0, 19.0, 20.0] 
    [20.0, 18.0, 20.0, 18.0, 18.0] 
    [20.0, 17.0, 17.0, 17.0, 19.0] 

其中在正确感。但我也必须为每个网格方块应用一个“随机”百分比,这是我所做的(不是在该代码行中,预先将其移除以解决此问题)。我想说的是,我必须编辑此代码的第一行(扣除数字和百分比损失),然后使用该行重新计算网格的其余部分。我已经在如何保留,编辑和使用网格中每一行的列表方面有所失落。

正确的输出会是这样,但没有随机百分比损失:(numPRC = 100)

[18.0, 20.0, 19.0, 17.0, 20.0] 
[17.0, 18.0, 18.0, 15.0, 19.0] 
[15.0, 17.0, 16.0, 14.0, 19.0] 
[15.0, 15.0, 16.0, 12.0, 17.0] 
[15.0, 12.0, 13.0, 9.0, 16.0] 

我不得不重新使用:

[18.0, 20.0, 19.0, 17.0, 20.0] 

对于其余行,但我不知道如何迭代更新列表。我相信这很简单,但我错过了一个小细节。

+2

我很困惑。你谈论的是通过最后一条线来赢得胜利。一行(行)的结果是否应该影响下一行(行)? –

+0

另外,你应该使用浮动分配你的宠物小精灵?或者你应该做整数分配,并在整个行中分配可能的余数? –

+0

@AustinHastings对于每个数字,'网格'的第二行[2,0,1,3,0]必须从攻击口袋妖怪的编号中减去。所以是,一行的结果必然会影响下一行。至于口袋妖怪存储为浮动,我的教授说这些'口袋妖怪'是突变体,所以有些可能不是一个'完整'的口袋妖怪,并使用浮动。它非常奇怪。 – Cabbage363

回答

0

基础上的意见,我想你需要的是这样的:

attackers = [ numAttackPokemon/n ] * n 
lost_per_square = 1.00 - p/100.0 


for row in grid: 
    for col, cost in enumerate(row): 
     attackers[col] *= lost_per_square 
     attackers[col] -= cost 

这将建立一个攻击口袋妖怪的“行”,在每列相同的编号。然后它将遍历网格中的每一行,并且每行都会遍历每列,从攻击者行中的相应列中减去网格的“成本”。

此外,它减去了“每平方的损失”。我猜这就是这个意思,尽管我不确定。基本上,如果p = 20,那么每平方的损失将为-20%,因此乘数为1.0 - 0.20 = 0.80。

请注意:这适用于因地形造成的任何损失之前的每平方的损失。它甚至将这些损失应用到第一个广场。您可以随时更改订单,和/或跳过将损失应用到第一个或最后一个方格,具体取决于问题说明。

+0

非常感谢您的支持。看来我没有解释'p'是如何正常工作的,但是我能够操纵它来获得我需要的输出。谢谢,我将在另一个问题中提交最终代码以显示结果。 – Cabbage363

0

在此之上,奥斯汀黑斯廷斯能够帮助解决我的问题。我不得不编辑它以获得所需的输出。代码如下波纹管:

numAP = numAttackPokemon # Number of Mutant Pokemon they wish to attack with 
gridRules = gymData[0] # Rules such as n,p,k 
gymGrid = gymData[1]  # Gym Array 
n = gridRules[0]   # Size of grid 
p = gridRules[1]   # Number of defending Pokemon 
k = gridRules[2]   # Number of War-Pokemon that must pass 

attPoke = [numAttackPokemon/n] * n # Number of Pokemon Per-Column-Row, Float value 
randPerc = np.random.randint(0, n) 
lossPerSquare = randPerc/100.0 

for row in gymGrid: 
    for col, cost in enumerate(row): 
     attPoke[col] -= cost 
     attPoke[col] = attPoke[col] - (attPoke[col] * lossPerSquare) 

注:变量“P”作为0和n之间的随机整数,其是将被用作一个百分比,lossPerSquare。然后总攻击口袋妖怪的最终结果是(攻击口袋妖怪 - 每平方的成本) - (攻击口袋妖怪* lossPerSquare)。此外,成本确实需要在失去的百分比之前提出,我忘记了提及。

谢谢。