#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
UIButton *prevBtn; // 이전 버튼
UILabel *life; // 생명 텍스트
}
// 현재 버튼
@property(strong, nonatomic) UIButton *button;
// 카드 앞면 들어갈 배열
@property(strong, nonatomic) NSMutableArray *frontCard;
// 액션 메소드(프로그램에서 클릭시 구동되는 시작 메소드)
- (IBAction)action:(id)sender;
@end
#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 alloc] initWithObjects:@"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 alloc] init]; // label이란 레이블 변수 생성
label.frame = CGRectMake(80, 15, 160, 20); // 가로 80 세로 15의 위치에서 가로 160, 세로 20크기의 레이블 생성
label.text = @"카드 짝 맞추기 게임"; // 레이블안에 들어갈 텍스트 내용
label.font = [UIFont systemFontOfSize:20.0]; // 레이블에 적용된 텍스트의 크기
[self.view addSubview:label]; // 레이블 화면에 보여주기
// 제일 하단에 생명 하트 표시를 레이블을 이용해 텍스트로 표시
life = [[UILabel alloc] init];
life.frame = CGRectMake(15, 350, 300, 40);
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), 65, 65);
// 버튼이 생성될때 마다 태그의 값을 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 alloc] initWithTitle:@"경고" message:@"2번만 클릭 가능합니다" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil, nil];
[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-1] intValue];
// 이전 버튼에 현재의 버튼을 저장
prevBtn = button;
// 두번째 클릭을 위해 카운터 1증가
count = count + 1;
// 뒤집힌 카드가 다시 클릭되는것을 방지하기 위해 현재의 버튼 비활성화
button.enabled = NO;
}
// 두번째 버튼 클릭시
else if(count == 1)
{
// 처음 카드와 두번째 카드의 이미지 번호가 같다면
if([frontCard[button.tag-1] intValue] == chkImg)
{
// 성공횟수 1증가
succes = succes + 1;
// 카드 클릭 카운터 변수 초기화
count = 0;
// 이제 두 카드가 클릭되면 안됨으로 둘다 비활성화
prevBtn.enabled = NO;
button.enabled = NO;
// 모든 카드가 다 맞았을때
if(succes == 8)
{
// 게임종료 경고창 호출
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"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 alloc] initWithTitle:@"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
'Programing > IOS' 카테고리의 다른 글
테이블 셀 커스텀 디자인 (0) | 2013.09.13 |
---|---|
테이블뷰에 웹뷰가 포함된 소스 (0) | 2013.09.11 |
Slider 및 TextField 및 OnOff 스위치 연습 (0) | 2013.08.26 |
TableView 연습 코딩 (0) | 2013.08.26 |
기본 MP3 플레이어 기능 어플 (0) | 2013.08.21 |