Убедитесь, что вход является числом и был ли номер повторен или нет? - PullRequest
0 голосов
/ 03 января 2019

я знаю, что было несколько вопросов об этой игре, но у меня есть еще несколько инструкций, поэтому это немного усложняет. Я почти закончил, у меня есть еще пара вещей, чтобы закончить. мой код выглядит следующим образом:

- (NSString *)output {

    NSMutableString *resultOutput = [[NSMutableString alloc] init];
    int secretNumber= arc4random_uniform(10);
    int numberChosen;
    int attempt=0;

    NSMutableArray<NSNumber*> *myArray = [[NSMutableArray alloc] init];

    printf("Guess a Number\n");
    printf("\n");
    scanf("%d", &numberChosen);

    while (numberChosen != secretNumber) {

        if (numberChosen < secretNumber) {
            printf("Too Low\n");
            printf("Guess Again\n");
            scanf("%d", &numberChosen);
            attempt++;
        }
        else if (numberChosen > secretNumber) {
            printf("Too high\n");
            printf("Guess Again\n");
            scanf("%d", &numberChosen);
            attempt++;
        }
        else if (numberChosen ==secretNumber) {
            attempt++;
            break;
        }

        [myArray addObject:[NSNumber numberWithInt:numberChosen]];
    }
    if (numberChosen == secretNumber) {
        NSLog(@"\nGood job, you guessed in %i tries", attempt);

    }

    return resultOutput;
}

Мой вывод должен быть:

Guess a number:
> 12
Too Low!
Guess a number:
> 65
Too High!
Guess a number:
> 65
Already Guessed!
Guess a number:
> asdf
Not a number! Try again!
Guess a number:
> 42
You got it! You took 3 attempts!

Я дошел до создания цикла, который проверяет, выше вы или ниже, и сколько попыток потребовалось. Теперь я застрял в том, чтобы проверить, была ли введенная буква буквой и, если да, отобразить на консоли, что она недействительна. У меня также возникают проблемы с проверкой, введен ли уже номер, и отображением сообщения о том, что этот номер уже угадан.

Помощь будет оценена, спасибо!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Где возможно, используйте типы Objective-C, чтобы вы могли использовать встроенные классы, такие как числовой форматер, для анализа ввода и NSArray для записи предыдущих догадок.Используйте методы для организации кода, чтобы алгоритм игры был понятен.

@property(strong,nonatomic) NSMutableArray *priorGuesses;

- (NSNumber *)promptForNumber {
    char cstring[256];

    NSLog(@"Guess a Number\n");
    scanf("%s", cstring);         // note that input exceeding 256 chars will write past this buffer

    NSString *string = [NSString stringWithCString:cstring encoding:NSUTF8StringEncoding];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    return [formatter numberFromString:string];
}

- (BOOL)isUnique:(NSNumber *)number {
    if ([self.priorGuesses containsObject:number]) return NO;
    [self.priorGuesses addObject:number];
    return YES;
}

- (void)game {
    BOOL gameOn = YES;
    self.priorGuesses = [NSMutableArray array];

    NSInteger secretNumber= arc4random_uniform(10);
    NSNumber *guess = @(-1);

    while (gameOn) {
        guess = [self promptForNumber];
        if (guess && [self isUnique:guess]) {
            NSInteger guessInt = [guess intValue];
            if (guessInt == secretNumber) {
                // notice that there's no need to count attempts in a separate var
                NSLog(@"Good job, you guessed in %ld tries", self.priorGuesses.count);
                gameOn = NO;
            } else if (guessInt > secretNumber) {
                NSLog(@"Too high");
            } else {  // by implication, guessInt < secretNumber
                NSLog(@"Too low");
            }
        } else {
            NSLog((guess)? @"Already guessed\n" : @"Not a number\n");
        }
    }
}
0 голосов
/ 03 января 2019

Используйте возвращаемое значение scanf.

Из документации

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Эта функция возвращает количество назначенных элементов ввода. Это может быть меньше, чем предусмотрено, или даже ноль, в случае сбоя сопоставления.
Ноль означает, что, хотя вход был доступен, преобразований нет были назначены; обычно это происходит из-за неправильного ввода символов, такой как буквенный символ для преобразования `% d '. Значение EOF равно возвращается, если произошла ошибка ввода перед любым преобразованием, таким как конец файла происходит. Если ошибка или конец файла происходит после преобразования началось, число успешно завершенных конверсий вернулся.

Edit:

Если вы используете возвращаемое значение, вы должны очистить буфер в случае ввода букв.

Это выполнение всех условий. Вместо массива набор используется для избежания дублирования:

int secretNumber = arc4random_uniform(10);
int numberChosen = 0;
int returnValue = -1;
int attempt = 0;

NSMutableSet<NSNumber*> *set = [[NSMutableSet alloc] init];

printf("Guess a Number\n");
printf("\n");

while (numberChosen != secretNumber) {
    returnValue = scanf("%d", &numberChosen);
    attempt++;
    if (numberChosen == secretNumber) {
        break;
    }
    else if ([set containsObject:@(numberChosen)]) {
        printf("Already Guessed!\n");
    }
    else if (returnValue == 0) {
        printf("Not a number!\n");
        int c;
        while((c = getchar()) != '\n' && c != EOF);
    }
    else if (numberChosen < secretNumber) {
        printf("Too Low\n");
        [set addObject:@(numberChosen)];
    }
    else if (numberChosen > secretNumber) {
        printf("Too high\n");
        [set addObject:@(numberChosen)];
    }
    printf("Guess Again\n");
    printf("\n");

}
NSLog(@"\nGood job, you guessed in %i tries", attempt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...