UIButton使用单个字符随机化标题

时间:2014-12-10 12:54:29

标签: random uibutton character title

下面的代码采用字符串,将每个字母添加到数组中并对该数组进行洗牌并在标签中显示最终结果。这很好用。但我希望每个字符都包含一个洗牌字符串的单个字符。现在它几乎可以工作,但它总是重复人物。喜欢而不是一系列带有标题的6个按钮: L e a g u e,代码生成重复的字符,如: Leaauu。

我的代码是:

- (IBAction)shuffleButttonTitles:(id)sender {

    // The mutable array must be created here to create a new instance each time the button is tapped
    letters = [[NSMutableArray alloc] init];
    str = @"League";

    length = str.length;

    NSString *letter;

    UIButton *button;

    // First loop through the string and add each letter to an array
    for (int i = 0; i < length; i++) {

        letter = [NSString stringWithFormat:@"%c", [str characterAtIndex:i]];
        [letters addObject:letter];

    }

    // Shuffle the string for the label/buttons
    for (int i = 0; i < length; i++) {

        int value = arc4random() % (length - 1);
        [letters exchangeObjectAtIndex:i withObjectAtIndex:value];

        //Create the button and shuffle the letters for their titles
        button = [[UIButton alloc] initWithFrame:CGRectMake(50 * i, 350, 44, 44)];

        // HERE THE CODE REPEATS THE CHARACTERS
        [button setTitle:[letters objectAtIndex:i] forState:UIControlStateNormal];

        //Store the button in our array
        [myButtons addObject:button];
        NSLog(@"Letters in Array: %lu", letters.count);
    }

    for (UIButton *button in myButtons){

        [button setBackgroundColor:[UIColor redColor]];
        [self.view addSubview:button];


    }

    // Now we set the randomized title to the label 
    NSString *results = [letters componentsJoinedByString:@""];
    string.text = results;


}

1 个答案:

答案 0 :(得分:0)

在网上搜索了一下后,我发现了它。我发布了其他人的完整代码。此代码从Characters.txt文件中获取一个随机字符串并随机播放该字符串。然后它会轻微地旋转瓷砖。你可以在弄清楚anagram后输入正确的单词,然后如果你得到它或者没有得到它,就会显示一个警告视图。

#define kTileSpacing 20
#define randomf(minX,maxX) ((float)(arc4random() % (maxX - minX + 1)) + (float)minX)

@interface ViewController ()

@end

@implementation ViewController
{

}

@synthesize progressView;

- (void)viewDidLoad {

    [super viewDidLoad];


    NSString *path = [[NSBundle mainBundle] pathForResource:@"Anagrams" ofType:@"plist"];
    dictionary = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSString *quotesFile = [[NSBundle mainBundle] pathForResource:@"Characters" ofType:@"txt"];
    fileContents = [NSString stringWithContentsOfFile:quotesFile encoding:NSUTF8StringEncoding error:NULL];

    // [txtField becomeFirstResponder];
    //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkWord:) name:nil object:nil];
}

- (IBAction)clear:(id)sender {

    quoteArray = [fileContents componentsSeparatedByString:@"\n"];

    NSString *quoteToDisplay;

    currentQuestion = arc4random() % quoteArray.count;
    quoteToDisplay = [quoteArray objectAtIndex: currentQuestion];
    welldone.text = quoteToDisplay;

    txtField.text = nil;
    [txtField becomeFirstResponder];

    for (UILabel *lbl in myButtons) {

        [lbl removeFromSuperview];

    }
}

- (IBAction)ShuffleString:(id)sender {

    [self clear:nil];

    // The mutable array must be created here to create a new instance each time the button is tapped
    charactersArray = [[NSMutableArray alloc] init];
    indexArray = [[NSMutableArray alloc] init];
    myButtons = [[NSMutableArray alloc] init];

    // 1. Shuffle the plist with the words to form anagrams from
    currentQuestion = arc4random() % quoteArray.count;
    str = [quoteArray objectAtIndex: currentQuestion]; //[[dictionary objectAtIndex:currentQuestion] objectForKey:@"Anagram"];
    length = str.length;

    NSString *letter;

    // 2. Loop throught the chosen word and break it down into its letters and add them to an array
    for (int i = 0; i < str.length; i++) {

//        [charactersArray removeObjectAtIndex:i];
        letter = [NSString stringWithFormat:@"%c", [str characterAtIndex:i]];
        [charactersArray addObject:letter];
       // NSLog(@"Number of letters: %@", charactersArray);

    }

    while ([charactersArray count]) {

        int randomizing = arc4random() % [charactersArray count];
        [indexArray addObject:[charactersArray objectAtIndex:randomizing]];
        [charactersArray removeObjectAtIndex:randomizing];
      //  NSLog(@"NO REPEAT SHUFFLE: %lu", (unsigned long)indexArray.count);

    }


    /***************/
    CGFloat staticY = self.view.bounds.size.height / 9 * 1; // Static X for all buttons.
    CGFloat staticWidth = 46; // Static Width for all Buttons.
    CGFloat staticHeight = 46; // Static Height for all buttons.

    CGFloat staticPadding = 10; // Padding to add between each button.
    float tileSize = ceilf( self.view.bounds.size.width / str.length );
    NSLog(@"size %f", tileSize);
    CGFloat xOffset = (self.view.bounds.size.width - str.length * (44+staticPadding));
    NSLog(@"xOffset %f", tileSize);
    xOffset = tileSize/ 2;

    for (int i = 0; i < str.length; i++) {

        singleCharacterLabel = [[UILabel alloc] init];
        singleCharacterLabel.textAlignment = NSTextAlignmentCenter;
        singleCharacterLabel.font = [UIFont fontWithName:@"Verdana-Bold" size:21];

        singleCharacterLabel.frame = CGRectMake((staticPadding + (i * (staticHeight + staticPadding))), staticY, staticWidth, staticHeight);
       // NSLog(@"X: %f", (staticPadding + (i * (staticHeight + staticPadding))));
        //singleCharacterLabel.center = CGPointMake(i * 50 + self.view.bounds.origin.x + self.view.bounds.size.width /3, 80); // i * int +self... int = space between labels. Here it is '50'
    //    singleCharacterLabel.center = CGPointMake(self.view.bounds.size.width * i, self.view.bounds.size.height / 5 * 1); // 1/4th down from the top
        singleCharacterLabel.layer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Tile.png"]].CGColor;

        NSString *anagramString = [indexArray objectAtIndex:i];
        singleCharacterLabel.text = anagramString;
        [myButtons addObject:singleCharacterLabel];

        //1
        //set random rotation of the tile
        //anywhere between -0.2 and 0.3 radians
        float rotation = randomf(0,50) / (float)100 - 0.2;
        singleCharacterLabel.transform = CGAffineTransformMakeRotation( rotation );

        //2
        //move randomly upwards
        int yOffset = (arc4random() % 10) - 10;
        singleCharacterLabel.center = CGPointMake(singleCharacterLabel.center.x, singleCharacterLabel.center.y + yOffset);


        [self.view addSubview:singleCharacterLabel];
        //NSLog(@"LOOP: %@", anagramString);

    }


}

- (IBAction)checkWord:(id)sender {

    if (([txtField.text  isEqual:str])) {
        alertCorrect = [[UIAlertView alloc] initWithTitle:@"" message:@"Well done!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Next", nil];
        [alertCorrect show];
    } else {
        alertWrong = [[UIAlertView alloc] initWithTitle:@"" message:@"Sorry, try again." delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alertWrong show];

    }

    //   NSLog(@"String is: %lu", str.length);

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (alertView == alertCorrect) {
        if (buttonIndex == 0) {
            [self ShuffleString:nil];
            NSLog(@"next");
        }
    }

    if (alertView == alertWrong) {
        if (buttonIndex == 1) {
            // Wrong answer. Close view and let user try again
        }

    }

}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if (txtField.text.length == length) {
        [self checkWord:nil];
        NSLog(@"You entered %lu characters", length);
    }

    return YES;
}