[Objective-C]퍼즐 게임을 만들어보자. (2)

2011. 6. 2. 16:34제2외국어/iOS


이어서 시작하겠습니다.

puzzleViewController.m 로 가주세요.


.h에서 @property 한 것들을 @synthesize 해주셔야 합니다.


@synthesize button1;
@synthesize button2;
@synthesize button3;
@synthesize button4;
@synthesize button5;
@synthesize button6;
@synthesize button7;
@synthesize button8;
@synthesize button9;
@synthesize button10;
@synthesize button11;
@synthesize button12;
@synthesize button13;
@synthesize button14;
@synthesize button15;
@synthesize button16;


[ 좋은 습관 들이기 ]
.h 에서
@property

.m 에서
@synthesize

viewDidUnload에서 각각 nil 로

dealloc에서 각각  release 시키기.


왜 하는지는 따로 올리도록 하겠습니다.



그리고 나서 viewDidLoad에서 각 버튼들을 배열에 넣어줍시다.


좀 더 편하게 사용하기 위해서입니다.


viewDidLoad는 처음 실행될 때 시작하는 함수입니다.

( C#에서 보면 Formload 와 같다고 보시면 됩니다. )







1. New Game 버튼에 대한 함수.
-(IBAction)newButton
{   
   
    static NSString *imageName[] = {@"(0,0).png",@"(0,1).png",@"(0,2).png",@"(0,3).png",
        @"(1,0).png",@"(1,1).png",@"(1,2).png",@"(1,3).png",
        @"(2,0).png",@"(2,1).png",@"(2,2).png",@"(2,3).png",
        @"(3,0).png",@"(3,1).png",@"(3,2).png",@"(3,3).png"};
   
    int last = 14;
    int key = 0;
   
    UIImage *image = [UIImage alloc];
    for(int i=0; i<15; i++)
    {
        srand(time(NULL));
        if(last == 0)
            key = 0;
        else
            key = random()%last;
       
        image = [UIImage imageNamed: imageName[key] ];
       
        [button_arr[i] setImage:image forState:UIControlStateNormal];
        button_arr[i].hidden = NO;
        if(last != key)
        {
            NSString *temp = imageName[last];
            imageName[last] = imageName[key];
            imageName[key] = temp;
        }
        last--;
    }

    button_arr[15].hidden = YES;   // 마지막 버튼은 안 보여주기.
   
    [image release];
}

각 이미지들의 파일이름들을 NSString 배열에 넣어서 random()함수를 사용해서 각 버튼들에 집어 넣는 방식입니다.

viewDidLoad에서 넣어준 배열을 이용했습니다.


2. 퍼즐 버튼들을 눌렀을 때 검사를 하여 이미지들을 바꿔주는 함수입니다.
( 인터페이스 빌더에서 각 버튼에 Tag를 사용한 이유가 밝혀집니다. )

-(IBAction)buttonPressed:(id)sender
{
    UIButton *click = (UIButton *)sender;               // 누른 버튼에 대한 정보를 click 변수에 넣습니다.
    int tag_id = click.tag;
    int change_id = 0;
    BOOL ok = NO;
    UIImage *imageName = nil;
   
    // 움직일 수 있는지 검사
    // 좌
    if(tag_id-1 != 0 && tag_id-1 != 4 && tag_id-1 != 8 && tag_id-1 != 12)
    {
        if(button_arr[tag_id-1-1].hidden == YES)
        {
            ok = YES;
            change_id = tag_id-1;
        }
    }
   
    // 우
    if(tag_id+1 != 5 && tag_id+1 != 9 && tag_id+1 != 13 && tag_id+1 != 17)
    {
        if(button_arr[tag_id-1+1].hidden == YES)
        {
            ok = YES;
            change_id = tag_id+1;
        }
    }
   
    // 상
    if(tag_id-4 >0)
    {
        if(button_arr[tag_id-1-4].hidden == YES)
        {
            ok = YES;
            change_id = tag_id-4;
        }
    }
   
    // 하
    if(tag_id+4 < 17)
    {
        if(button_arr[tag_id-1+4].hidden == YES)
        {
            ok = YES;
            change_id = tag_id+4;
        }
    }
   
    // 움직일 수 있다면!  ok == YES 라면; 교환
    if(ok == YES)
    {
        button_arr[tag_id-1].hidden = YES;
        imageName = button_arr[tag_id-1].imageView.image;
        [button_arr[tag_id-1] setImage:button_arr[change_id-1].imageView.image forState:UIControlStateNormal];
        [button_arr[change_id-1] setImage:imageName forState:UIControlStateNormal];
        button_arr[change_id-1].hidden = NO;
    }    
}

Tag 버튼을 이용해서 (고정되어 있기 때문에) 근처(상하좌우)에 숨겨진 버튼이 있는지 없는지 검사하여
있다면 숨겨진 버튼의 이미지를 교환하는 방식입니다.
UIControlStateNormal 이지미 상태를 이렇게 해준 이유는
원래 버튼은 하이라이트와 눌렀을 때의 상태로 지정해 줄 수 있는데 이걸 노멀하게 해주어서 안 바뀌게 해줍니다.


3. Check!! 버튼을 눌렀을 때 입니다.
-(IBAction)checkButton
{
    static NSString *imageName[] = {@"(0,0).png",@"(0,1).png",@"(0,2).png",@"(0,3).png",
        @"(1,0).png",@"(1,1).png",@"(1,2).png",@"(1,3).png",
        @"(2,0).png",@"(2,1).png",@"(2,2).png",@"(2,3).png",
        @"(3,0).png",@"(3,1).png",@"(3,2).png",@"(3,3).png"};
    BOOL ok = YES;
   
    UIImage *image = nil;
    for(int i=0; i<16; i++)
    {
        image = [UIImage imageNamed:imageName[i]];
        if(button_arr[i].imageView.image != image)
        {
            ok = NO;
            break;
        }
    }
    [image release];
    UIAlertView *alter = nil;
    if(ok == YES)
    {
         alter= [[UIAlertView alloc]initWithTitle:@"다 했네?"
                                                       message:@"이 어메이징한 녀석!!"
                                                      delegate:nil
                                            cancelButtonTitle:@"exit"
                                             otherButtonTitles:nil];
       
    }
    else {
        alter= [[UIAlertView alloc]initWithTitle:@"훗.."
                                         message:@"이정도로?? 아직이야!"
                                        delegate:nil
                               cancelButtonTitle:@"exit"
                               otherButtonTitles:nil];
    }
    [alter show];
    [alter release];
}

New Game 과 마찬가지로 배열을 이용하여 검사를 하고 거기에 추가적으로 Alter  메시지를 뿌려주는 부분이 있습니다.


이제는 인터페이스 빌더에서 연결만 하면 끝납니다.

인터페이스 빌더에서

IBOutlet 해주었던 것을 연결하는 부분입니다.


File's Owner 를 오른쪽 버튼으로 클릭하시면

<--- 화면 처럼이 아니라 연결이 안 되어 있을 것 입니다.


하나 하나 손수 연결을 시작해줍시다.

File's Owner  를  컨트롤 키를 누른 상태에서 각 각 연결해주면 됩니다.

(File's Owner --------> 버튼 )






이 부분부터는 각 액션함수 연결입니다.


<-- 여기는 File's Owner 가 아닌 각 버튼들에서 File's Owner로 컨트롤 키를

눌러 연결하시면 됩니다.

( 버튼에서 ------> File's Owner)


Touch Up Inside 이벤트.

퍼즐 버튼 ( buttonPressed )

New Game ( newButton )

Check!! ( checkButton )


입니다.












끝입니다.. 실행해보세요.