8

ここに画像の説明を入力

私のスクリーンショットは、私が単語マッチングゲームに取り組んでいることを示しています.このゲームでは、異なる位置の特定のシーケンスで異なる UIButtons に単語を割り当て (私の赤い矢印はこのシーケンスを示しています)、残りの UIButtons にランダムな文字の 1 つを割り当てます ( AZ). UIButtons をクリックすると、そのタイトルが現在のセクションの前にある UILabel に割り当てられます: この UILabel テキストをタイマーの前にある UILabels テキストの下に移動します。このプロセスはすべて実装済みです。

しかし、私の問題は、プレーヤーが「DOG」である最初の単語を見つけた場合、黒い線で表示されることです。彼はシーケンスの 2 つの UIButtons をクリックしますが、シーケンスの 3 番目のボタンは押しません (黒い線で示されているように)。したがって、ここでは、プレーヤーがシーケンスにない UIButtons を押したときに、前のテキスト (" DO") の UILabel であり、UILabel の Text は "G" のみになりました。UIButtons のタイトルを取得して UILabel を割り当てるコードを次に示します。

- (void)aMethod:(id)sender 
       {
    UIButton *button = (UIButton *)sender;
    NSString    *get = (NSString *)[[button titleLabel] text];
    NSString *origText = mainlabel.text;
    mainlabel.text = [origText stringByAppendingString:get];

 if ([mainlabel.text length ]== 3) 
    {
if([mainlabel.text isEqualToString: a]){
    lbl.text=@"Right";
    [btn1 removeFromSuperview];
    score=score+10;
    lblscore.text=[NSString stringWithFormat:@"%d",score];
    words=words-1;
    lblwords.text=[NSString stringWithFormat:@"%d",words];
    mainlabel.text=@"";
    a=@"tbbb";
}

    else    if([mainlabel.text isEqualToString: c]){
    lbl.text=@"Right";
    [btn2 removeFromSuperview];
    score=score+10;
    lblscore.text=[NSString stringWithFormat:@"%d",score];
    words=words-1;
    lblwords.text=[NSString stringWithFormat:@"%d",words];
    mainlabel.text=@"";
c=@"yyyy";

}
 else   
     if([mainlabel.text isEqualToString: d]){
    lbl.text=@"Right";
    [btn3 removeFromSuperview];
    score=score+10;
    lblscore.text=[NSString stringWithFormat:@"%d",score];
    words=words-1;
    lblwords.text=[NSString stringWithFormat:@"%d",words];
    mainlabel.text=@"";
    d=@"yyyy";
}
else {
    lbl.text=@"Wrong";
   mainlabel.text=@"";
  }

 }}

事前にサンクス

4

4 に答える 4

2

楽しい質問:この特定のケースでは、UIButtonのサブクラス化についてLukeに同意します。このようにして、グリッド上の各ボタンに(X、Y)と、予想されるすべての次のプレス位置の(Xnext、Ynext)リストを指定できます(ボタン自体を使用して複数の単語を作成できる場合)。外部的には、現在ヒットしているものと予想されるもの(Xnext、Ynext)を比較します。2つが一致しない場合、これはあなたが探している信号です。

これは、前方および後方の水平方向(バックウェアを実装することを選択した場合)、上方および下方の垂直方向(上方に実装することを選択した場合)、および任意の対角線、またはその他の考えられる組み合わせのすべての状況を説明する答えです。と!

これは、たとえばDを押してから、Oを押してから、Gを押すのではなくDをもう一度押しようとすることも考慮に入れます。また、誤ったGを押すことも処理します。

新しい.m.hファイルのペア(新しいオブジェクト)を作成し、それに名前を付けます。

カスタムUIButton(hファイル)を実装するためのサンプルコード:

@interface myConnectedUIButton : UIButton {

    BOOL             isAWordBeginCharacter;
    unsigned int     beginWordKey;

    unsigned int     myGridX;
    unsigned int     myGridY;

    NSMutableArray * myConnectedSet;

}

-(id)init;
-(void)initWithGridX:(unsigned int)X GridY:(unsigned int)Y BeginChar:(BOOL)yesNo BeginWordKey:(unsigned int)key;
-(void)setGridPosWithX:(unsigned int)X Y:(unsigned int)Y;
-(void)setGridX:(unsigned int)X;
-(void)setGridY:(unsigned int)Y;
-(unsigned int)getGridX;
-(unsigned int)getGridY;

-(void)setIsABeginChar:(BOOL)yesNo;
-(BOOL)getIsABeginChar;

-(void)addPosToConnectedSetGridX:(unsigned int)X GridY:(unsigned int)Y WordKey:(unsigned int)key; 
-(NSArray *)getMyConnectedSetArray;
-(void)clearConnectedSet;

@end

あなたの.mファイルで

@implementation myConnectedUIButton

-(id)init{
    [super init];

    // Lets go ahead and initialize the NSMutableArray here also IFF it hasnt already been allocated
    if( nil == myConnectedSet ){
        myConnectedSet = [[NSMutableArray alloc] init];
    }

    // Lets also zero out the x, y position
    myGridX = 0;
    myGridY = 0;

    // Lets also state that this is NOT a begin char for the time being and 0 for the begin char key
    isAWordBeginCharacter = NO;
    beginWordKey = 0;

    return self;
}

-(void)initWithGridX:(unsigned int)X GridY:(unsigned int)Y BeginChar:(BOOL)yesNo BeginWordKey:(unsigned int)key{
    // Lets go ahead and initialize the NSMutableArray here also IFF it hasnt already been allocated
    if( nil == myConnectedSet ){
        myConnectedSet = [[NSMutableArray alloc] init];
    }

    myGridX = X;
    myGridY = Y;

    isAWordBeginCharacter = yesNo;
    beginWordKey = key;
}

-(void)setGridPosWithX:(unsigned int)X Y:(unsigned int)Y{
    myGridX = X;
    myGridY = Y;
}

-(void)setGridX:(unsigned int)X{
    myGridX = X;
}

-(void)setGridY:(unsigned int)Y{
    myGridY = Y;
}

-(unsigned int)getGridX{
    return myGridX;
}

-(unsigned int)getGridY{
    return myGridY;    
}

-(void)setIsABeginChar:(BOOL)yesNo{
    isAWordBeginCharacter = yesNo;
}

-(BOOL)getIsABeginChar{
    return isAWordBeginCharacter;
}

-(void)addPosToConnectedSetGridX:(unsigned int)X GridY:(unsigned int)Y WordKey:(unsigned int)key{
    [myConnectedSet addObject:[GridPointNext GridPointNextWithX:X GridPointY:Y  NextWordKey:key]];
}

-(NSArray *)getMyConnectedSetArray{
    return myConnectedSet;
}

-(void)clearConnectedSet{
    [myConnectedSet removeAllObjects];
}

-(void)dealloc{
    [myConnectedSet release];

    [super dealloc];
}

@end

また、「GridPointNext」オブジェクトも必要になります。

グリッドオブジェクトヘッダーは次のようになります。

@interface GridPointNext : NSObject {
    unsigned int GridPointX;
    unsigned int GridPointY;

    unsigned int nextWordKey;
}

+(GridPointNext *)GridPointNextWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key;
-(id)initWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key;

-(unsigned int)getGridX;
-(unsigned int)getGridY;
-(unsigned int)getNextWordKey;

@end

オブジェクトのmファイルは次のようになります。

@implementation GridPointNext

+(GridPointNext *)GridPointNextWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key{
    GridPointNext * aPoint = [[GridPointNext alloc] initWithX:X GridPointY:Y NextWordKey:key];

    [aPoint autorelease];

    return aPoint;
}

-(id)initWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key{
    GridPointX  = X;
    GridPointY  = Y;

    nextWordKey = key;

    return self;
}


-(unsigned int)getGridX{
    return GridPointX;
}

-(unsigned int)getGridY{
    return GridPointY;
}

-(unsigned int)getNextWordKey{
    return nextWordKey;
}

@end

あなたはdealloc部分を処理する必要があります。これにより、少なくとも、カスタムボタンとその周りの単語リストアルゴリズムを作成するためのツールがいくつか提供されます。

于 2012-06-01T22:39:10.767 に答える
2

左から右に各ボタンにタグを割り当てます。だからあなたは、

GButton.tag = 0; TButton.tag = 1; DButton.tag = 2; . . . VButton.tag = 9; . . . EButton.tag = 18; . . . CButton.tag = 26;

以前に押されたボタンと現在押されているボタンを追跡します。ボタン デリゲートがヒットしたときに、以下の関数を呼び出します。

以下のコードを .h ファイルに書き込みます

#define SEQ_TYPE_ANY  0
#define SEQ_TYPE_RIGHT 1
#define SEQ_TYPE_LEFT 2
#define SEQ_TYPE_TOP 3
#define SEQ_TYPE_BOTTOM 4
#define SEQ_TYPE_RIGHT_DIAGONAL_DOWN 5
#define SEQ_TYPE_RIGHT_DIAGONAL_UP 6
#define SEQ_TYPE_LEFT_DIAGONAL_DOWN 7
#define SEQ_TYPE_LEFT_DIAGONAL_UP 8

#define NO_OF_BUTTONS_IN_ROW 9

//Add below variables into your class
int curentSequence;
UILabel *resultLabel;
UIButton *previousButton;

//Declare property for previousButton
@property(nonatomic, retain) UIButton *previousButton;


//Write below code to .m file
@synthesize previousButton;

-(BOOL) isAdjacent:(UIButton *)currentButton
{
     if(previousButton == nil)
     {
          resultLabel.text = currentButton.titleLabel.text;
          curentSequence = SEQ_TYPE_ANY;
          return TRUE;
     }


     if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT) &&
          (previousButton.tag + 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_ANY;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT) &&
        (previousButton.tag - 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_LEFT;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_TOP) &&
             (previousButton.tag - NO_OF_BUTTONS_IN_ROW == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_TOP;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_BOTTOM) &&
             (previousButton.tag + NO_OF_BUTTONS_IN_ROW == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_BOTTOM;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT_DIAGONAL_DOWN) &&
             (previousButton.tag + NO_OF_BUTTONS_IN_ROW + 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_RIGHT_DIAGONAL_DOWN;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT_DIAGONAL_UP) &&
             (previousButton.tag -  NO_OF_BUTTONS_IN_ROW + 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_RIGHT_DIAGONAL_UP;
          return TRUE;
     }

     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT_DIAGONAL_UP) &&
             (previousButton.tag - NO_OF_BUTTONS_IN_ROW - 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_LEFT_DIAGONAL_UP;
          return TRUE;
     }
     else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT_DIAGONAL_DOWN) &&
             (previousButton.tag + NO_OF_BUTTONS_IN_ROW - 1 == currentButton.tag))
     {
          resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text];
          curentSequence = SEQ_TYPE_LEFT_DIAGONAL_DOWN;
          return TRUE;
     }
     else
     {
          resultLabel.text = @"";
          curentSequence = SEQ_TYPE_ANY;
          return FALSE;
     }     
}

// Event handler for button event
- (void)aMethod:(id)sender
{
     UIButton *currentButton = (UIButton *)sender;
     BOOL result = [self isAdjacent:currentButton];
     if(result == FALSE)
     {
          self.previousButton = nil;
          resultLabel.text = @"";
          curentSequence = SEQ_TYPE_ANY;
     }
     else
     {
          self.previousButton = sender;
     }
}

それが役立つことを願っています。

于 2012-06-06T07:18:06.640 に答える
1

私の理解が正しければ、押されたボタンが以前に押されたボタンに隣接しているかどうかを知る必要がありますか? この関数を使用して、グリッド内の隣接性をテストします。

bool isAdjacent(UIButton* current, UIButton* previous) {
    if( !previous )
        return false;

    //Create a rectangle around the previous button (assuming all buttons are in a fixed grid)
    CGRect previousRect = previous.frame;
    CGRect adjacentRect = CGRectMake(previous.frame.origin.x - previous.frame.size.width,
                                     previous.frame.origin.y - previous.frame.size.height,
                                     previous.frame.size.width*3,
                                     previous.frame.size.height*3);
    return CGRectIntersectsRect(adjacentRect, previousRect);
}

そして、それらが隣接している場合にのみ追加します。つまり:

- (void)aMethod:(id)sender 
{
    UIButton *button = (UIButton *)sender;
    static UIButton* previous = nil;
    NSString    *get = (NSString *)[[button titleLabel] text];
    NSString *origText = mainlabel.text;

   if( isAdjacent(button, previous) )
       mainlabel.text = [origText stringByAppendingString:get];

   previous = button;

   //Rest of function
}
于 2012-05-31T12:14:31.633 に答える
0

私が正しく理解していれば。選択した文字がすべて隣り合っている場合にのみ、ユーザーは正しい単語を持つことができますか?

これを試しましたか: 2 つの参照を保持します。previousPressedButton 用の 1 つの UIButton と lastPressedButton 用の 1 つの UIButton。

最初にユーザーが D を押します。lastPressedButton は D を参照します。次に、ユーザーが O を押します。previousPressedButton は D になります。lastPressedButton は O になります。

ここで、UIButtons の幅と高さを取得し、lastPressedButton.frame.origin.x が wi​​dth または -width よりも小さいかどうかを比較します。また、lastPressedButton.frame.origin.y が height または -height よりも小さいかどうかを確認します。これで、前のボタンに触れているかどうかがわかります。これを使用して、それが新しい単語かどうかを判断します。

これをメソッドに入れます。

    -(BOOL)isAdjacentLetter {
          float buttonWidth = lastPressedButton.size.width;
          float buttonHeight = lastPressedButton.size.height;
          if(lastPressedButton.frame.origin.x>previousPressedButton.frame.origin.x+buttonWidth) return NO;
          if(lastPressedButton.frame.origin.y>previousPressedButton.frame.origin.y+buttonHeight) return NO;
          if(lastPressedButton.frame.origin.x<previousPressedButton.frame.origin.x-buttonWidth) return NO;
          if(lastPressedButton.frame.origin.y<previousPressedButton.frame.origin.y-buttonHeight) return NO;

          return YES;
}

次に、ボタンがクリックされるたびに。あなたが使用することができます

if ([self isAdjacentLetter]) {
   //still same word
} else {
   //new word. erase
}

または、私が別の方法で理解している場合。言葉は、文字が一列に並んでいる場合にのみ作成できます。たとえば、左から右へ。下から上へ。右下から左上など。この場合、すべての方向を決定します。左上は 0、上は 1、右上は 2、右は 3、右下は 4、下は 5、左下は 6、左は 7 などです。

2 つのボタンをクリックすると、方向が保存されます。例: 左から右の場合、方向 = 3; 次に、別のボタンをクリックすると、新しい方向を確認します。3 の場合、単語はまだ同じ方向にあります。それ以外の場合は、消去して最初からやり直してください。

お役に立てれば。

于 2012-06-02T08:01:42.920 に答える