posted by 프띠버리 2013. 8. 29. 12:49



ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController

{

    UIButton *prevBtn;              // 이전 버튼

    UILabel *life;                  // 생명 텍스트

}


// 현재 버튼

@property(strongnonatomicUIButton *button;

// 카드 앞면 들어갈 배열

@property(strongnonatomicNSMutableArray *frontCard;


// 액션 메소드(프로그램에서 클릭시 구동되는 시작 메소드)

- (IBAction)action:(id)sender;


@end





ViewController.m

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController

@synthesize button;             // 지금 버튼 선언

@synthesize frontCard;          // 카드 배열 선언

int count;                      // 카드 클릭 카운터 변수 선언

int chkImg;                     // 이전 클릭된 이미지를 정수로 입력받을 변수 선언

int succes;                     // 성공 횟수 변수 선언

int intvalCount;                // 오버 횟수 클릭시 처리할 변수 선언

int fail;                       // 실패 횟수 변수 선언


// 초기 화면

- (void)viewDidLoad

{

    // 초기화 메소드 불러오기

    [self initScreen];

    

    [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


// 초기화 메소드

-(void)initScreen

{

    // 화면 전체 클리어

    for(UIView *subview in [self.view subviews])

    {

         [subview removeFromSuperview];

    }

    

    // 버튼을 그리기 위한 for문용 변수 i, j  생성되는 버튼에 태그숫자를 붙여줄 변수 선언

    int i, j, tagNum;


    //  변수 초기화

    succes = 0;

    intvalCount = 0;

    fail = 0;

    count = 0;

    chkImg = 0;

    

    // 유동성 배열을 생성하여 초기 값을 집어 넣음

    frontCard = [[NSMutableArray allocinitWithObjects:@"1"@"1"@"2"@"2"@"3"@"3"@"4"@"4"@"5"@"5"@"6"@"6"@"7"@"7"@"8"@"8"nil];

    

    // 유동성 배열의 내용을 섞어 주는 메소드 호출

    [self shuffle];

    

    // 버튼의 태그 수를 0으로 지정

    tagNum = 0;

    

    // 제일 상단 제목 레이블로 만들기

    UILabel *label = [[UILabel allocinit];            // label이란 레이블 변수 생성

    label.frame = CGRectMake(801516020);          // 가로 80 세로 15 위치에서 가로 160, 세로 20크기의 레이블 생성

    label.text = @"카드  맞추기 게임";                     // 레이블안에 들어갈 텍스트 내용

    label.font = [UIFont systemFontOfSize:20.0];        // 레이블에 적용된 텍스트의 크기

    [self.view addSubview:label];                       // 레이블 화면에 보여주기


    // 제일 하단에 생명 하트 표시를 레이블을 이용해 텍스트로 표시

    life = [[UILabel allocinit];

    life.frame = CGRectMake(1535030040);

    life.font = [UIFont systemFontOfSize:25];

    life.text = @"생명 : ♡ ♡ ♡ ♡ ♡ ♡ ♡ ♡";

    [self.view addSubview:life];


    // 16개의 버튼 생성 하기

    for(i=0;i<4;i++)                        // 4줄로 만듬

    {

        for(j=0;j<4;j++)                    // 한줄에 4개씩 만듬

        {

            // 버튼에 이미지를 입히기 위해 커스텀 타입으로 생성

            button  = [UIButton buttonWithType:UIButtonTypeCustom];

            // 버튼의 위치를 for문을 이용하여 만듬

            button.frame = CGRectMake(15+(j*75), 50+(i*75), 6565);

            // 버튼이 생성될때 마다 태그의 값을 1 증가시킴

            tagNum += 1;

            // 버튼 태그의 값에 1 증가된 값을 집어 넣음

            button.tag = tagNum;

            // 버튼의 이미지는 backcard.jpg이고 효과는 없음

            [button setImage:[UIImage imageNamed:@"backcard.jpg"forState:UIControlStateNormal];

            // 버튼을 클릭시 sction:메소드를 실행

            [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];

            // 버튼을 화면에 보여줌

            [self.view addSubview:button];

        }

    }

    

    // 개발자요 버튼 위치 확인 부분

    for(i=0;i<16;i++)

    {

        NSLog(@"%@"frontCard[i]);

    }

}


// Mutable 배열 섞기

int randomSort(id obj1, id obj2, void*context)

{

    return (arc4random()%3 - 1);

}


- (void)shuffle

{

    [frontCard sortUsingFunction:randomSort context:nil];

}

//------------ 여기까지 배열 섞기 고정 메소드


// 버튼 클릭시 호출 되는 action: 메소드

- (IBAction)action:(id)sender

{

    // 버튼의 클릭횟수가 2보다 작을때

    if(intvalCount < 2)

    {

        // 버튼의 태그값을 알랴줌

        button = sender;

        // 버튼의 태그값에 맞춰서 체크하는 메소드 호출

        [self checkCard];

        // 1초의 대기 시간동안 클릭횟수가 2 넘어가지 않으면 intvalCtn 메소드를 호출

        [self performSelector:@selector(intvalCtn) withObject:nil afterDelay:1.0];


    }

    // 버튼의 클릭횟수가 2이상이 된다면

    else

    {

        // 경고창 호출

        UIAlertView *alert = [[UIAlertView allocinitWithTitle:@"경고" message:@"2번만 클릭 가능합니다" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nilnil];

        [alert show];

        // 클릭횟수 변수 초기화

        intvalCount = 0;

    }

    // 클릭횟수 변수 1증가

    intvalCount += 1;

}


// 버튼의 클릭횟수가 2 넘어가지 않을때 호출되는 메소드

- (void) intvalCtn

{

    // 클릭횟수 변수 초기화

    intvalCount = 0;

}


// 클릭한 카드 2개를 비교하여 같은지 아닌지  에러 부분 체크 하는 메소드

- (void) checkCard

{

    

    // 버튼 클릭시 뒤집어 질때 태그와 배열의 값에 맞춰서 앞면 이미지 표시

    NSString *imageName = [NSString stringWithFormat:@"frontcard0%@.jpg"frontCard[button.tag-1]];

    [button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

    

    // 처음 버튼 클릭시

    if(count == 0)

    {

        // 이전 이미지용 변수에 지금 클릭된 이미지의 태그값에 해당하는 이미지 번호를 정수화 하여 저장

        chkImg = [frontCard[button.tag-1intValue];

        // 이전 버튼에 현재의 버튼을 저장

        prevBtn = button;

        // 두번째 클릭을 위해 카운터 1증가

        count = count + 1;

        // 뒤집힌 카드가 다시 클릭되는것을 방지하기 위해 현재의 버튼 비활성화

        button.enabled = NO;


    }

    // 두번째 버튼 클릭시

    else if(count == 1)

    {

        // 처음 카드와 두번째 카드의 이미지 번호가 같다면

        if([frontCard[button.tag-1intValue] == chkImg)

        {

            // 성공횟수 1증가

            succes = succes + 1;

            // 카드 클릭 카운터 변수 초기화

            count = 0;

            // 이제  카드가 클릭되면 안됨으로 둘다 비활성화

            prevBtn.enabled = NO;

            button.enabled = NO;

            

            // 모든 카드가  맞았을때

            if(succes == 8)

            {

                // 게임종료 경고창 호출

                UIAlertView *alert = [[UIAlertView allocinitWithTitle:@"VICTORY" message:@"클리어를 축하합니다." delegate:self cancelButtonTitle:@"메인으로" otherButtonTitles:@"다시하기"nil];

                [alert show];

                // 성공 횟수 초기화

                succes = 0;

            }

        }

        // 처음 카드와 두번째 카드의 이미지 번호가 다르다면

        else

        {

            // 이전 버튼을 클릭할수 있도록 활성화

            prevBtn.enabled = YES;

            // 실패 횟수 증가

            fail = fail + 1;

            

            // 뒤집힌 카드를 확인 하기 위해 0.5초후에 다시 뒷면으로 뒤집히게 

            [self performSelector:@selector(delayImg) withObject:nil afterDelay:0.5];

            

            // 실패 횟수에 따른 하트 감소 레이블 텍스트 표시

            if(fail == 1)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡ ♡ ♡ ♡ ♡ ♡";


            }

            else if(fail == 2)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡ ♡ ♡ ♡ ♡";

            }

            else if(fail == 3)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡ ♡ ♡ ♡";

            }

            else if(fail == 4)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡ ♡ ♡";

            }

            else if(fail == 5)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡ ♡";

            }

            else if(fail == 6)

            {

                life.text = @"";

                life.text = @"생명 : ♡ ♡";

            }

            else if(fail == 7)

            {

                life.text = @"";

                life.text = @"생명 : ♡";

            }

            // 하트가  떨어지면

            else if(fail == 8)

            {

                life.text = @"";

                

                // 게임 실패 경고창 호출

                UIAlertView *alert = [[UIAlertView allocinitWithTitle:@"LOSE" message:@"실패하였습니다." delegate:self cancelButtonTitle:@"메인으로" otherButtonTitles:@"다시하기"nil];

                [alert show];

                // 실패 횟수 0으로 초기화

                fail = 0;

            }

            

            //  클릭 카운터 변수 초기화

            count = 0;

        }

    }

}


// 0.5초후 뒷면 보여줄 메소드

- (void)delayImg

{

    // 이전 버튼의 이미지를 다시 뒷면이 되게 

    [prevBtn setImage:[UIImage imageNamed:@"backcard.jpg"forState:UIControlStateNormal];

    // 지금 버튼의 이미지를 다시 뒷면이 되게 

    [button setImage:[UIImage imageNamed:@"backcard.jpg"forState:UIControlStateNormal];

}


// 경고창 반응

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    // 다시하기를 클릭했을때

    if(buttonIndex == alertView.firstOtherButtonIndex)

    {

        // 게임 내용 다시 초기화

        [self initScreen];

    }

}


@end