交代一下我做程序的工具:mac os x虛擬機10.9.3 Xcode6 百度^-^ 參考書iPhone30天精通
總結與經驗,還有遇到的問題,都在程序裡面寫出來了,看著長,其實從頭往下看10分鐘就全都搞懂了,我的注釋很“白話”。
// ViewController.h
// 12.1@end
// ViewController.m
// 12.1
//
// Created by 李迪 on 15-7-28.
// Copyright (c) 2015年 李迪. All rights reserved.
//
#import ViewController.h
@interface ViewController ()
@end
@implementation ViewController
@synthesize startDate,pokerImage,timer;
int spadeOn;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//當視圖控制器(ViewController)讀取到內存的時候就建立一個提示框,介紹游戲
//把游戲撲克圖像視圖對象定義為“撲克背面”----起始時為撲克背面
pokerImage.image = [UIImage imageNamed:@0000.png];
//顯示本提示框,下面的提示框只有一個“確定”選項,當按確定的時候對話框就隱藏起來了
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@考反應撲克游戲 message:@當黑桃出現時以最快速度按下撲克 delegate:self cancelButtonTitle:@游戲開始 otherButtonTitles:nil, nil];
[alert show];
}
//接下來就是啟動游戲的方法了,也是UIAlertView默認的方法,當提示框隱藏時自動執行的代碼,不需要實現代理什麼的,只要把方法名寫對就可以了
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
//讓“控制器”spadeOn為0,這樣如果剛開始就點擊撲克牌的話就有提示,做出的反應是錯誤的。
spadeOn = 0;
//做定時器,定時更換游戲顯示的撲克
//要判斷計時器是否開了,沒開就打開,如果開了就不用管了,所以用一個if語句控制。
//isValid這個方法是判斷計時器是否在運行,返回的是布爾類型的值
//我做的這個定時器是讓它一直重復執行的,每1秒換一張撲克,所以在點擊撲克然後做出點擊是否正確的判斷的時候,需要暫停該計時器,即在pokerPressed方法內做出暫停的舉動。
if (![self.timer isValid]){
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onAceTimer) userInfo:nil repeats:YES];
//注意:我在之前程序一直有bug,就是停止後面的計時器的方法一直不奏效,原因就是我前面的語句沒有“self.timer = ”這句代碼,也就是我定義的計時器一直就是一個空指針,所以沒辦法給這個空指針計時器暫停,後來加上“self.timer = ”這句代碼之後,使用暫停語句就可以給計時器暫停了。
}
}
//這個是點擊撲克牌的響應方法,與此方法鏈接的就是button,我把button放大了,讓它鋪在撲克牌的圖片上面,這樣點擊撲克牌的畫面就是點擊button
-(IBAction)pokerPressed{
//計時器開啟了,那麼咱就給他關閉了
if (self.timer) {
[self.timer invalidate];
self.timer = nil;
}
//不同情況下點擊撲克會有不同的結果,現在就先寫一下IBAction的方法,最後寫啟動程序的方法吧
//兩種情況發生,一種點對的,一種是點錯的。對的情況就要算出反應時間,錯的情況便彈出警告框。
NSString *reactionTime;//兩種情況的提示語也不同,在這裡做一下判斷
if (spadeOn==1) {
double noSeconds = (double)[self.startDate timeIntervalSinceNow]*-1000; //timeIntervalSinceNow * -1000;
reactionTime = [[NSString alloc] initWithFormat:@響應速度為%1.0f毫秒,繼續。,noSeconds];
}
if (spadeOn==0) {
reactionTime = @請不要急,等黑桃A出現再按;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@再來一次 message:reactionTime delegate:self cancelButtonTitle:@確定 otherButtonTitles:nil, nil];
[alert show];
}
//上面的提示框按下“開始游戲”的時候,提示框便消失了,那麼便可以利用視圖隱藏後調用的方法
//( -(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex )來啟動游戲。
//計時器調用本方法來顯示一張張撲克牌的方法
-(void)onAceTimer{
int rNumber = rand()%4;//4張撲克牌,0,1,2,3四個隨機數,控制4張撲克牌的顯示
switch (rNumber) {
case 0:
pokerImage.image = [UIImage imageNamed:@11.png];
spadeOn = 1;
startDate = [NSDate date];//黑桃出現的時候,便創建date對象,後面便可以調用NSDate方法來得到時間差了
break;
case 1:
pokerImage.image = [UIImage imageNamed:@21.png];
spadeOn = 0;
break;
case 2:
pokerImage.image = [UIImage imageNamed:@31.png];
spadeOn = 0;
break;
case 3:
pokerImage.image = [UIImage imageNamed:@41.png];
spadeOn = 0;
}//隨機的4種結果,只有第一種結果會顯示黑桃A,所以讓自定義的控制條件spadeOn = 1,其他都為0,然後後面會有如果spadeOn分別為1或0時,點擊撲克會出現不同效果的IBAction方法。
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end