Fork me on GitHub

UI拓展练习1----打地鼠

  //打地鼠核心代码:
1
#import "ViewController.h" 2 #define Krandom arc4random()%(115-100+1)+100 3 @interface ViewController () 4 { 5 NSInteger _n; //记录当前的Krandom值 6 CGFloat _grade;//记录点击中的次数 7 NSInteger _counter;//记录循环次数 8 } 9 10 11 @property(nonatomic, retain)UIButton *but; 12 @property(nonatomic, retain)UIButton *but1; 13 @property(nonatomic, retain)NSTimer *timer; 14 @property(nonatomic, retain)UILabel *textCJ; 15 16 17 @end 18 19 @implementation ViewController 20 21 - (void)viewDidLoad { 22 [super viewDidLoad]; 23 _grade = 0; 24 _counter = 0; 25 [self loadButton]; 26 [self star]; 27 [self stop]; 28 29 } 30 31 //第一步 完成基本布局(位置大小背景色,及相应点击事件)-------------------------------------- 32 //地鼠button布局 和 分数显示初始化 33 -(void)loadButton 34 { 35 NSInteger n = 100; 36 //用循环方式创建button按钮 4*4方格 37 for (int i = 0 ; i < 4; i++) { 38 for (int j = 0 ; j <4 ; j++ ) { 39 //设置按钮类型 40 _but = [UIButton buttonWithType:UIButtonTypeCustom]; 41 //用循环动态确定按钮位置 前后左右的间距要把握好 42 _but.frame = CGRectMake(i * self.view.frame.size.width/4 +10 , j * self.view.frame.size.width/4 + 20 , self.view.frame.size.width/4 - 20 , 50); 43 //添加按钮 44 [self.view addSubview:_but]; 45 //设置按钮背景色 46 [_but setBackgroundImage:[UIImage imageNamed:@"3"] forState:UIControlStateNormal]; 47 //设置按钮tag值 48 [_but setTag:n]; 49 n++; 50 } 51 _textCJ = [[UILabel alloc] initWithFrame:CGRectMake(140, 400, 100, 40)]; 52 _textCJ.backgroundColor = [UIColor yellowColor]; 53 54 [self.view addSubview:_textCJ]; 55 56 NSString *str = [[NSString alloc] initWithFormat:@"%2.f",_grade]; 57 58 _textCJ.text = str; 59 } 60 } 61 62 //开始按钮 与 计时器timmer初始化 63 -(void)star 64 { 65 _but1 = [[UIButton alloc] initWithFrame:CGRectMake(30, self.view.frame.size.height - 30 , self.view.frame.size.width/2 - 60 , 30)]; 66 _but1.backgroundColor = [UIColor greenColor]; 67 //添加按钮 68 [self.view addSubview:_but1]; 69 [_but1 setTitle:@"开始" forState:UIControlStateNormal]; 70 //添加按钮点击事件 71 [_but1 addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; 72 //计时器 73 _timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(paint:) userInfo:nil repeats:YES]; 74 } 75 //结束按钮 76 -(void)stop 77 { 78 UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom]; 79 but.frame = CGRectMake(self.view.frame.size.width/2 + 30, self.view.frame.size.height - 30, self.view.frame.size.width/2 - 60 , 30); 80 but.backgroundColor = [UIColor redColor]; 81 [but setTitle:@"结束" forState:UIControlStateNormal]; 82 83 [but addTarget:self action:@selector(ting:) forControlEvents:UIControlEventTouchUpInside]; 84 [self.view addSubview:but]; 85 } 86 87 88 //第二步,处理按钮点击事件-------------------------------------- 89 90 //结束按钮的点击事件(1.按钮背景色设置为最初状态 2.计算成绩 3. ) 91 -(void)ting:(UIButton *)butt 92 { 93 [_timer invalidate]; //停止计时器,释放计时器 94 95 //同时通过循环形式,将背景色变为最初状态 96 for (int i = 100 ; i < 116 ; i ++ ) { 97 //用tag值,找button 98 butt = (UIButton *)[self.view viewWithTag:i]; 99 [butt setBackgroundImage:[UIImage imageNamed:@"3"] forState:UIControlStateNormal]; 100 } 101 102 //计算出成绩 ,并在label上显示 103 _grade = _grade/50 * 100; //地鼠会出现50次,求出百分制成绩 104 //将NSInteger类型的成绩转换为字符串类型 105 NSString *str = [[NSString alloc] initWithFormat:@"%.2f",_grade]; 106 _textCJ.text = str; //将字符串类型的成绩赋给显示label 107 108 _grade = 0; //重置成绩 _grade为点击的次数 109 //成绩重置为0时,重新开始计数 110 _timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(paint:) userInfo:nil repeats:YES]; 111 112 } 113 114 //触发计时器是执行的事件 115 - (void)paint:(UIButton *)bt//计时器触发事件 116 { 117 for (int i = 100;i < 116;i++) 118 { 119 _but = (UIButton *)[self.view viewWithTag:i]; 120 [_but setBackgroundImage:[UIImage imageNamed:@"3"] forState:UIControlStateNormal]; 121 } 122 123 //记录当前tag值 让tag值的出现成为随机事件 124 _n = Krandom;//随机事件宏定义Krandom 125 126 bt = (UIButton *)[self.view viewWithTag:_n];//找出随机tag值的button位置 127 128 //找出随机tag值的button位置后,为其添加新的背景图片 129 [bt setBackgroundImage:[UIImage imageNamed:@"4.jpg"] forState:UIControlStateNormal]; 130 131 //按钮点击事件 132 [bt addTarget:self action:@selector(selector:) forControlEvents:UIControlEventTouchUpInside]; 133 134 if (_counter >= 50)//每一次触发计数一次,若果触发50次就结束计时器,跳出循环 135 { 136 _counter = 0;//重置计数 137 //并触发停止事件 138 [self ting:bt]; 139 } 140 141 _counter ++;//计数累加 142 //NSLog(@"this button tag is %ld",bt.tag); 143 } 144 145 146 //击打地鼠的点击事件 147 - (void)selector:(UIButton *)sender 148 { 149 if (sender.tag == _n)//判断是否所击打位置是当前显示地鼠位置 150 { 151 [sender setBackgroundImage:[UIImage imageNamed:@"5"] forState:UIControlStateNormal]; 152 153 _grade++; 154 } 155 } 156 157 //计时器触发事件 158 //开始按钮点击事件,将计时器添加到NSRunloop循环中 159 - (void)click 160 { 161 [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode]; 162 }

 

大体思路:

      1.用循环方式完成基本布局

      2.计时器timmer的使用要和按钮状态保持一致

 

效果图:

 

 

posted @ 2015-09-27 15:28  DengHuiCheng  阅读(236)  评论(0编辑  收藏  举报