2014-03-06 79 views
0

我有一个NSArray与卡对象具有不同的值,让我们说1,2,3,5,8,10。我想确定一张卡是否可播放,我用播放器他卡对象的属性,这显然也具有价值属性。规则是,当一张卡片可以播放时(这个例子中只有卡片1可以播放),只有不同值的卡片也可以播放。所以在上面的例子中,卡号2也是可播放的,其余的不是。要清楚,排序可能不同,并不总是上升或下降。通过NSArray迭代并计算差异

我想要的是遍历playerCards数组,并将数组中的所有其他卡片进行比较,当差值为1时,将卡片的可玩属性设置为IsPlayable,然后再次循环,直到确定所有可玩卡片。

First loop attempt (card 1 is playable): 
2-1 = 1 card value 2 is playable 
3-1 = 2 card value 3 is not playable 
5-1 = 4 card value 5 is not playable 
8-1 = 7 card value 8 is not playable 
10-1 = 9 card value 10 is not playable 

Second loop attempt (card 2 is now also playable): 
3-2 = 1 card value 3 is playable 
5-2 = 3 card value 5 is not playable 
8-2 = 6 card value 8 is not playable 
10-2 = 8 card value 10 is not playable 

Third loop attempt (card 3 is now also playable): 
5-3 = 2 card value 5 is not playable 
8-3 = 5 card value 8 is not playable 
10-3 = 7 card value 10 is not playable 

Stop loop. 

我不知道该怎么去。这是我到目前为止,但我迷路了;

for(int x = 0; x < [playerCards count]; x++) 
{  
Card *playerCard = [playerCards objectAtIndex:x]; 
if(playerCard.playable == IsPlayable){ 
something like playerCard.value-otherplayerCard.value ???} 

你们能帮忙吗?

谢谢!

+0

如果您只是发布作业的原文,会更容易理解。 –

回答

0

你可以把你的for循环在while循环,其中如果做出更改的while回路检查和for循环做出改变(或不如果样样齐全)。

我要去假设Card类有一个名为NSNumbercard

BOOL changed = YES; 
NSMutableArray *playableCards = [NSMutableArray array]; 

while (changed) { 

    changed = NO; 

    for (Card *playerCard in playerCards) { 
     NSNumber *card = playerCard.card; 

     if (playerCard.playable == IsPlayable) { 
      if (![playableCards containsObject:card]) { 
       NSLog(@"Card %@ is already playable", playerCard.card); 
       [playableCards addObject:card]; 
       changed = YES; 
      } 
     } else { 
      NSNumber *cardUp = @(card.integerValue + 1); 
      NSNumber *cardDown = @(card.integerValue - 1); 

      if ([playableCards containsObject:cardUp] || [playableCards containsObject:cardDown]) { 
       NSLog(@"Card %@ is being made playable", playerCard.card); 
       changed = YES; 
       playerCard.playable = IsPlayable; 
       [playableCards addObject:card]; 
      } 
     } 
    } 
} 
+0

谢谢Wain,它帮了我很多!现在我唯一的问题是代码不断地继续下去。我如何确定是否所有可能的计算都已完成,然后退出循环? – Niels

+0

已编辑。需要改变初始条件... – Wain

+0

感谢您的快速答复,但它仍然循环到无限... – Niels

0

这里有一个通用的编程模式,将在其他地方有用。模式是,你从一些有限的信息开始,并可能增加更多的信息,从而导致更多的信息;在这种情况下,“可播放”卡片最初是标记为可播放的卡片,然后附近的可播放卡片变为可播放的,等等。模式是

"start with initial data" 
BOOL changed = YES; 

while (changed) 
{ 
    changed = NO; 
    "try to find any new information" 
    if ("any new information was found") 
     changed = YES; 
}