Я был бы признателен за помощь для нового программиста какао - PullRequest
1 голос
/ 08 марта 2011

Я делаю простую программу для моей дочери, которая разработала игру.Я просто хочу, чтобы Мак придумал случайное число от 1 до 6, сравнил его с предположением пользователя, а затем получил разницу, которая используется для определения того, сколько мест игрок может переместить в своей настольной игре.Все работает, кроме разницы, которую генерирует программа, всегда 3. Она генерирует случайное число правильно и правильно читает вводимые пользователем данные.Вот кодБуду очень признателен за помощь.Я новичок в этом и понимаю, что, возможно, есть очень очень простой ответ.Я искал и искал и не нашел решения.В какой-то момент это правильно создавало разницу, но теперь это не так.Большое спасибо!

//
//  AstroGuessAppDelegate.h
//
//  Created by Trent Evans on 3/7/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>

int macPick;
int numberGuess;
int numberDiff;

@interface AstroGuessAppDelegate : NSObject {
    IBOutlet NSWindow *window;
    IBOutlet id moveResultLabel;
    IBOutlet id thinkingLabel;
    IBOutlet NSComboBox *numberGuessBox;
}
- (IBAction)compareNumbersAndSendResults:(id)sender;
- (IBAction)macThinkOfNumber:(id)sender;
@end



//
//  AstroGuessAppDelegate.m
//
//  Created by Trent Evans on 3/7/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "AstroGuessAppDelegate.h"

@implementation AstroGuessAppDelegate


- (IBAction)macThinkOfNumber:(id)sender {

    macPick = (arc4random() % 6) + 1;
    NSString *thinkingLabelText = [NSString stringWithFormat: @"Ok. I'm thinking of a number."];
    [thinkingLabel setStringValue:thinkingLabelText];

}

- (IBAction)compareNumbersAndSendResults:(id)sender {

    numberGuess = [numberGuessBox intValue];
    numberDiff = macPick - numberGuess;
    if (numberDiff<0) {
        numberDiff = numberDiff * -1;
    }
    NSString *moveResultLabelText;
    if (numberDiff=0) {
        moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nBLAST OFF!\nMove forward 6 spaces", macPick, numberGuess, numberDiff];
    }
    if (numberDiff=1) {
        moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nORBIT!\nMove forward 4 spaces", macPick, numberGuess, numberDiff];

    }
    if (numberDiff=2) {
        moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nRE-ENTRY!\nMove forward 2 spaces", macPick, numberGuess, numberDiff];

    }
    if (numberDiff=3) {
        moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nSPLASHDOWN!\nMove forward 1 space", macPick, numberGuess, numberDiff];

    }
    else {
        moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nBLACK HOLE!\nSorry. You don't get to move.", macPick, numberGuess, numberDiff];

    }


    [moveResultLabel setStringValue:moveResultLabelText];

}


@end

Ответы [ 2 ]

1 голос
/ 08 марта 2011

В ваших операторах if у вас есть оператор присваивания =, а не оператор сравнения ==, поэтому каждый if имеет значение true, а последний выполненный является оператором для 3.

Вам лучше использовать switch для этого:

switch(numberDiff)
{  case 0:
       moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nBLAST OFF!\nMove forward 6 spaces", macPick, numberGuess, numberDiff];
       break;
   case 1:
      etc.
   default:
      moveResultLabelText = [NSString stringWithFormat:@"My number was %i. Your number was %i. The difference is %i. \nBLACK HOLE!\nSorry. You don't get to move.", macPick, numberGuess, numberDiff];
}

Далее вы объявили все свои переменные в качестве глобалов файлов вверху:

int macPick;
int numberGuess;
int numberDiff;

Если они совместно используются разными методами, то они должны быть переменными экземпляра, macPick является переменной экземпляра в этом случае. Это должно быть объявлено в @interface:

@interface AstroGuessAppDelegate : NSObject
{
   int macPick;
   etc.

Похоже, что два других используются только compareNumbersAndSendResults, поэтому объявили их там:

- (IBAction)compareNumbersAndSendResults:(id)sender
{
   int numberGuess;
   int numberDiff;
   etc.

При незначительном изменении ноты:

numberDiff = numberDiff * -1;

до

numberDiff = -numberDiff;

или даже использовать функцию abs:

numberDiff = abs(macPick - numberGuess);
0 голосов
/ 08 марта 2011

Хех, мне потребовалась минута, чтобы понять, что происходит.

Проще говоря, есть разница между:

if (numberDiff=1) {

И

if (numberDiff==1) {

Первый выполняет задание . Он будет принимать значение 1, присваивать его numberDiff и использовать новое значение numberDiff в качестве условия для оператора if. Поскольку 1 является истинным значением, это будет успешным.

Второй делает сравнение . Он будет принимать значение 1 и сравнивать его со значением numberDiff. Если два значения равны, то общий оператор будет давать истинное значение.

Таким образом, вам нужно использовать ==, а не =.

Вы всегда видите результаты для случая «3», потому что это последний оператор if. Программа может присвоить 3 в numberDiff, поэтому она обновит ваш NSTextField текстом из этого случая.

...