1

我正在为设计游戏的女儿制作一个简单的程序。我只是想让 Mac 提供一个从 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
4

2 回答 2

1

在您的if语句中,您有赋值运算符=而不是比较运算符==,因此 eachif为真,最后执行的是 for 3

你最好使用 a 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);
于 2011-03-08T06:21:26.530 回答
0

嘿,我花了一分钟才弄清楚发生了什么。

简而言之,两者之间有区别:

if (numberDiff=1) {

if (numberDiff==1) {

第一个是做作业。它将获取 value 1,将其分配给numberDiff,并使用新 valuenumberDiff作为if语句的条件。由于1是真值,这将成功。

第二个是做比较。它将获取该值1并将其与 的值进行比较numberDiff。如果这两个值相等,那么整个语句将产生一个真值。

所以基本上,你需要使用==而不是=.

您总是会看到“3”案例的结果,因为这是最后一个 if 语句。该程序能够分配3numberDiff,因此它将NSTextField使用该案例中的文本更新您。

于 2011-03-08T06:20:30.913 回答