-1

我有一个带有 26 块棋盘的游戏。玩家掷出 1 到 12 之间的数字,然后玩家移动那么多的牌。我通过按顺序排列一个瓷砖数组(索引 0-25)来做到这一点。这是我在瓷砖上移动玩家的方式(这包含来自 Sprite Kit 的代码,我知道它在 NDA 下,但问题不在于那个)

NSInteger rolled_number = arc4random() % 12;
while (rolled_number == 0)
    rolled_number = arc4random() % 12;
NSLog(@"%d", rolled_number);
NSInteger new_index = self.player1.currentTileIndex + rolled_number;
if (!(new_index <= 25))
    new_index = new_index - 26;
NSMutableArray *actions = [NSMutableArray array];
while (self.player1.currentTileIndex < new_index) {
    SKSpriteNode *node = [_tiles objectAtIndex:self.player1.currentTileIndex];
    SKAction *move = [SKAction moveTo:node.position duration:1];
    [actions addObject:move];
    NSLog(@"currentTileIndex: %d", self.player1.currentTileIndex);
    if (self.player1.currentTileIndex + 1 > 25)
        self.player1.currentTileIndex -= 26;
    else
        self.player1.currentTileIndex++;
}

这段代码的问题是,如果玩家在 index 处的瓷砖上23并滚动 a 5,他们应该前往 index 处的瓷砖3,但它不会移动,因为它将改为生成currentTileIndex属性28而不是3. 我的问题是如何修改这个while循环,以便即使数字必须转到0而不是它仍然可以工作26

4

1 回答 1

2

首先,要获得从 1 到 12 的数字,请执行以下操作:

NSInteger rolled_number = arc4random_uniform(12) + 1;

然后正确使用模运算符来包装您的数字:

NSInteger new_index = self.player1.currentTileIndex + rolled_number;
NSMutableArray *actions = [NSMutableArray array];
while (self.player1.currentTileIndex < new_index) {
    SKSpriteNode *node = _tiles[self.player1.currentTileIndex % _tiles.count];
    SKAction *move = [SKAction moveTo:node.position duration:1];
    [actions addObject:move];
    NSLog(@"currentTileIndex: %d", self.player1.currentTileIndex % _tiles.count);
    self.player1.currentTileIndex++;
}

self.player1.currentTileIndex = self.player1.currentTileIndex % _tiles.count;
于 2013-06-24T21:27:53.840 回答