• 舒尔特表游戏

    • 一舒尔特表简介
    • 二 舒尔特表游戏说明
      • 说明
      • 作用
      • 规则
      • 评测
      • 图示
    • 三跳到下一界面
    • 四获取目标ViewController
    • 五返回到主界面
    • 六计时时钟的调用
    • 七创建存储随机数不重复的数组
    • 八动态创建按钮布局
    • 九UIAlertView 的代理方法
    • 十协议代理
      • 图示
      • 定义协议和代理
      • 定义协议和代理
      • ViewController遵从游戏视图控制器协议
      • 声明作为游戏视图控制器的代理
    • 十一代码示例
      • ViewControllerh
      • ViewControllerm
      • GameViewControllerh
      • GameViewControllerm
    • 十二示例图示

舒尔特表游戏.


一、舒尔特表简介

  1. 舒尔特表可以通过动态的练习锻炼视神经末梢。心理学上用此表来研究和发展心理感知的速度,其中包括视觉定向搜索运动的速度。

  2. 培养注意力集中、分配、控制能力;拓展视幅;加快视频;提高视觉的稳定性、辨别力、定向搜索能力。

  3. 练习的时间越长,看表所需的时间会越短。随着练习的深入,眼球的末梢视觉能力提高, 不仅初学者可以有效地拓展视幅,加快阅

读 节奏,锻炼眼睛快速认读;而且对于进入提高阶 段之后,同时拓展纵横视幅,达到一目十行、一目一页非常有效。


二、 舒尔特表游戏说明

1. 说明

是全世界范围内最简单、最有效也是最科学的注意力训练方法。

2. 作用

1.培养注意力集中、分类、控制能力

2.拓展视幅、加快视频

3.提高视觉稳定性、辨别力以及定向搜索能力

3. 规则

从小到大点击数字

4. 评测

时间越短,注意力水平越高!

5.图示


三、跳到下一界面


四、获取目标ViewController

// 是ViewController内置的方法
// 所有在StoryBoard中的连线在推出新的视图控制器[之前]都会调用这个方法
// 可以通过segue的一个属性获取到目标视图控制器
-(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender{GameViewController *segueViewCon = [segue destinationViewController];
}

五、返回到主界面

/**返回到主界面*/
- (IBAction)returnToMain:(id)sender {// 关闭当前视图控制器。// 因为当前视图控制器是被上级视图控制器推出来的// 因此,关闭了当前这个视图控制器,原来的就露出来了// 提醒:关闭之后,当前视图控制器会被释放// 再次点击上级视图控制器的按钮,本视图控制器的ViewDidLoad方法仍然会执行。[self dismissViewControllerAnimated:YES completion:nil];
}

六、计时(时钟的调用)

    // 设置并启动时钟// 第一个参数:多长时间会触发一次,以秒为单位// 第二个参数:如果看到函数的参数有target,一般情况下,都用self// 第三个参数:SEL,需要调用其他的方法,就是每次时钟被触发的时候,去执行的方法// 最多可以带一个参数,就是时钟本身// 第四个参数,暂时不用考虑,设置成nil// 第五个参数:是否重复,通常会设置YES_gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];// 记录一下游戏开始时间,以当前系统的时间作为游戏开始时间_gameStartTime = [NSDate date];// 在此处设置游戏计时器标签的内容,提示玩家当前过了多少秒// fireDate 是时钟的当前触发时间NSInteger deltaTime = [timer.fireDate timeIntervalSinceDate:_gameStartTime];//2.3.1 关闭游戏时钟[_gameTimer invalidate];

七、创建存储随机数不重复的数组

/**创建存储随机数的数组*/
-(NSArray*)createRandomArray{//1.判断控件个数是否为nil或者为0,设置默认为 3if(!_cols || 0==_cols){_cols = DEFUALT;}//2.创建 _cols * _cols 的数组NSMutableArray* arrayM = [NSMutableArray array];NSInteger count = _cols * _cols;for (NSInteger i=1; i<=count; i++) {[arrayM addObject:@(i)];}//3.使用随机数打乱数组// 打乱数组的顺序// 思路:需要使用到随机数,不能重复// 1,2,3,4,5,6,7,8,9// 先随机出来一个位置的数字0~8 假设是5,用位置5的数字与位置0的数字进行交换// 6,2,3,4,5,1,7,8,9// 再随机出来一个位置的数字1~8 假设是3,用位置3的数字与位置1的数字进行交换// 6,4,3,2,5,1,7,8,9// 在随机出来一个位置的数字2~8 假设是8,用位置8的数字与位置2的数字进行交换// 6,4,9,2,5,1,7,8,3// ...... 以此类推,就可以得到一个随机顺序的数组NSInteger see;for (NSInteger i=0; i<count; i++) {see = arc4random_uniform(count-1-i);[arrayM exchangeObjectAtIndex:i withObjectAtIndex:see];}NSLog(@"%@",arrayM);return arrayM;
}

八、动态创建按钮布局

 //5.更加计算的位置,动态创建控件for (NSInteger i=0; i<_cols; i++) {for (NSInteger j=0; j<_cols; j++) {NSInteger startX = MARGIN_WIDTH + (MARGIN_WIDTH+width)*j;NSInteger startY = MARGIN_WIDTH + (MARGIN_WIDTH+width)*i;UIButton * button = [[UIButton alloc]initWithFrame:CGRectMake(startX, startY, width, width)];//5.给控件设置值和一些属性]//5.1 文字[button setTitle:[NSString stringWithFormat:@"%@",arrayList[index++]] forState:UIControlStateNormal];//5.2 字体颜色[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];//5.3 背景颜色[button setBackgroundColor:[UIColor grayColor]];//6。给控件点击事件添加代理[button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];//.把控件添加到myView中[_myVIew addSubview:button];}}

九、UIAlertView 的代理方法

1.遵从< UIAlertViewDelegate > 协议;
2.代理方法

-(void)alertView:(UIAlertView*)alerView clickedButtonAtIndex:(NSInteger)clickIndex{NSLog(@"点击了%ld",clickIndex);[self returnToMain:nil];
}
 UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];;[alert show];

十、协议代理

1. 图示

2.定义协议和代理

// 定义协议
@protocol GameViewControllerDelegate <NSObject>// 游戏完成
- (void)gameViewDidDone:(NSTimeInterval)gameTime;@end@interface GameViewController : UIViewController <UIAlertViewDelegate>// 定义代理
@property (weak, nonatomic) id<GameViewControllerDelegate> delegate;

3.定义协议和代理

         //2.5 // 委托代理执行方法,如果没有设置代理,这条指令不生效,但是也不会报错[_delegate gameViewDidDone:_usedTime.text];

4.ViewController遵从游戏视图控制器协议

#import <UIKit/UIKit.h>
#import "GameViewController.h"
// 遵从游戏视图代理
@interface ViewController : UIViewController <GameViewControllerDelegate>
@end

5.声明作为游戏视图控制器的代理

// 是ViewController内置的方法
// 所有在StoryBoard中的连线在推出新的视图控制器[之前]都会调用这个方法
// 可以通过segue的一个属性获取到目标视图控制器
-(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender{GameViewController *segueViewCon = [segue destinationViewController];[segueViewCon setCols:_selectSizi];// 申请成为游戏视图的代理,设置后,游戏视图控制器的协议方法就会在当前视图控制器中执行[segueViewCon setDelegate:self];}

提示:
1.Storyboard中用连线打开视图控制器都会调用prepareForSegue方法
2.用segue的destinationViewController属性可以获得目标控制器


十一、代码示例

1. ViewController.h

//
//  ViewController.h
//  03_UIView06_舒尔特表
//
//  Created by 杞文明 on 15/12/24.
//  Copyright © 2015年 杞文明. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "GameViewController.h"
// 遵从游戏视图代理
@interface ViewController : UIViewController <GameViewControllerDelegate>/**最高记录*/
@property (weak, nonatomic) IBOutlet UILabel *recordLb;@end

2. ViewController.m

//
//  ViewController.m
//  03_UIView06_舒尔特表
//
//  Created by 杞文明 on 15/12/24.
//  Copyright © 2015年 杞文明. All rights reserved.
//
#import "ViewController.h"@interface ViewController (){//记住选择的是多少个数NSInteger _selectSizi;
}
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];
}// 是ViewController内置的方法
// 所有在StoryBoard中的连线在推出新的视图控制器[之前]都会调用这个方法
// 可以通过segue的一个属性获取到目标视图控制器
-(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender{GameViewController *segueViewCon = [segue destinationViewController];[segueViewCon setCols:_selectSizi];// 申请成为游戏视图的代理,设置后,游戏视图控制器的协议方法就会在当前视图控制器中执行[segueViewCon setDelegate:self];}/**选择多少的个数*/
- (IBAction)selectCount:(UIButton*)button {//记住选中的个数_selectSizi =  button.tag;//设置背景颜色button.backgroundColor = [UIColor redColor];
}/**设置时间*/
- (void)gameViewDidDone:(NSString *)timeString{_recordLb.text = [NSString stringWithFormat:@"最高记录:%@",timeString];NSLog([NSString stringWithFormat:@"最高记录:%@",timeString]);
}@end

3. GameViewController.h

//
//  GameViewController.h
//  03_UIView06_舒尔特表
//
//  Created by 杞文明 on 15/12/24.
//  Copyright © 2015年 杞文明. All rights reserved.
//
#import <UIKit/UIKit.h>// 1. 定义协议
// 协议名称通常是:委托方类名+Deleage
@protocol GameViewControllerDelegate <NSObject>
// 游戏完成
- (void)gameViewDidDone:(NSString *)timeString;
@end@interface GameViewController : UIViewController
/**定义代理*/
@property(weak,nonatomic)id<GameViewControllerDelegate> delegate;
/**显示控件的view*/
@property (weak, nonatomic) IBOutlet UIView *myVIew;
/**控件的行数   控件个数为 _cols * cols*/
@property NSInteger cols;
@property NSInteger answerCount;
/**计时*/
@property (weak, nonatomic) IBOutlet UILabel *usedTime;@end

4. GameViewController.m

//
//  GameViewController.m
//  03_UIView06_舒尔特表
//
//  Created by 杞文明 on 15/12/24.
//  Copyright © 2015年 杞文明. All rights reserved.
//#import "GameViewController.h"
#define MARGIN_WIDTH 3
#define DEFUALT 2@interface GameViewController ()
{// 游戏开始的时间NSDate      *_gameStartTime;// 游戏时钟NSTimer     *_gameTimer;NSString* _message;
}
@end@implementation GameViewController/**加载*/
-(void)viewDidLoad{[super viewDidLoad];//加载控件[self createViews];//计时开始[self startTimer];
}/**返回到主界面*/
- (IBAction)returnToMain:(id)sender {// 关闭当前视图控制器。// 因为当前视图控制器是被上级视图控制器推出来的// 因此,关闭了当前这个视图控制器,原来的就露出来了// 提醒:关闭之后,当前视图控制器会被释放// 再次点击上级视图控制器的按钮,本视图控制器的ViewDidLoad方法仍然会执行。[self dismissViewControllerAnimated:YES completion:nil];
}/**开始计时*/
-(void)startTimer{//设置时钟// 设置并启动时钟// 第一个参数:多长时间会触发一次,以秒为单位// 第二个参数:如果看到函数的参数有target,一般情况下,都用self// 第三个参数:SEL,需要调用其他的方法,就是每次时钟被触发的时候,去执行的方法// 最多可以带一个参数,就是时钟本身// 第四个参数,暂时不用考虑,设置成nil// 第五个参数:是否重复,通常会设置YES_gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];// 记录一下游戏开始时间,以当前系统的时间作为游戏开始时间_gameStartTime = [NSDate date];
}/**计时的处理*/
-(void)updateTime:(NSTimer*)timer{// 在此处设置游戏计时器标签的内容,提示玩家当前过了多少秒// fireDate 是时钟的当前触发时间NSInteger deltaTime = [timer.fireDate timeIntervalSinceDate:_gameStartTime];// 设置时间的字符串 00:00 mm:ssNSString *text = [NSString stringWithFormat:@"%02d:%02d", deltaTime / 60, deltaTime % 60];// 设置计时器标签文字[_usedTime setText:text];NSLog(@"过了一秒 %ld", deltaTime);
}/**创建存储随机数的数组*/
-(NSArray*)createRandomArray{//1.判断控件个数是否为nil或者为0,设置默认为 3if(!_cols || 0==_cols){_cols = DEFUALT;}//2.创建 _cols * _cols 的数组NSMutableArray* arrayM = [NSMutableArray array];NSInteger count = _cols * _cols;for (NSInteger i=1; i<=count; i++) {[arrayM addObject:@(i)];}//3.使用随机数打乱数组// 打乱数组的顺序// 思路:需要使用到随机数,不能重复// 1,2,3,4,5,6,7,8,9// 先随机出来一个位置的数字0~8 假设是5,用位置5的数字与位置0的数字进行交换// 6,2,3,4,5,1,7,8,9// 再随机出来一个位置的数字1~8 假设是3,用位置3的数字与位置1的数字进行交换// 6,4,3,2,5,1,7,8,9// 在随机出来一个位置的数字2~8 假设是8,用位置8的数字与位置2的数字进行交换// 6,4,9,2,5,1,7,8,3// ...... 以此类推,就可以得到一个随机顺序的数组NSInteger see;for (NSInteger i=0; i<count; i++) {see = arc4random_uniform(count-1-i);[arrayM exchangeObjectAtIndex:i withObjectAtIndex:see];}NSLog(@"%@",arrayM);return arrayM;
}/**创建控件 更加传递过来的个数,来生成对应的控件数*/
-(void)createViews{//1.判断控件个数是否为nil或者为0,设置默认为 3if(!_cols || 0==_cols){_cols = DEFUALT;}//2.控件之间的间隔是固定的为 MARGIN_WIDTH//3.根据控件的个数,和间隔来计算每个控件的宽度NSInteger width = (self.view.bounds.size.width - (_cols +1 )*MARGIN_WIDTH)/_cols;//4.获取数组NSArray *arrayList = [self createRandomArray];NSInteger index = 0;//5.更加计算的位置,动态创建控件for (NSInteger i=0; i<_cols; i++) {for (NSInteger j=0; j<_cols; j++) {NSInteger startX = MARGIN_WIDTH + (MARGIN_WIDTH+width)*j;NSInteger startY = MARGIN_WIDTH + (MARGIN_WIDTH+width)*i;UIButton * button = [[UIButton alloc]initWithFrame:CGRectMake(startX, startY, width, width)];//5.给控件设置值和一些属性]//5.1 文字[button setTitle:[NSString stringWithFormat:@"%@",arrayList[index++]] forState:UIControlStateNormal];//5.2 字体颜色[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];//5.3 背景颜色[button setBackgroundColor:[UIColor grayColor]];//6。给控件点击事件添加代理[button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];//.把控件添加到myView中[_myVIew addSubview:button];}}
}/**控件的点击事件*/
-(void)clickButton:(UIButton*)button{NSLog(button.titleLabel.text);//1.获取当前控件的 文本值转为NSIntegerNSInteger number = [button.titleLabel.text integerValue];if(number == _answerCount+1){//2.如果个值比上一次的值大1,那么说明正确//2.1 当前控件改为 绿色[button setBackgroundColor:[UIColor greenColor]];//2.2 当前控件不可用[button setEnabled:NO];//2.3 判断这个值是否是最大值,如果是,那么弹出提示框if(_cols*_cols == number){//2.3.1 关闭游戏时钟[_gameTimer invalidate];//2.3.2 从label中取出使用的时间NSString * message = [NSString stringWithFormat:@"你胜利拉!!,用时%@",_usedTime.text];UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];;[alert show];}//2.4 设置值_answerCount = number;//2.5 // 委托代理执行方法,如果没有设置代理,这条指令不生效,但是也不会报错[_delegate gameViewDidDone:_usedTime.text];}else{//3.如果个值比上一次的值不大1,那么说明不正确,不处理}
}-(void)alertView:(UIAlertView*)alerView clickedButtonAtIndex:(NSInteger)clickIndex{NSLog(@"点击了%ld",clickIndex);[self returnToMain:nil];
}@end

十二、示例图示

iOS学习笔记-018.舒尔特表游戏相关推荐

  1. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  2. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  3. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  4. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  5. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  7. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  9. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

最新文章

  1. python是用c 写的吗_我能用python写一个c语言出来吗?
  2. 新疆大学OJ(ACM) 1047: string 字符串排序
  3. WebKit Loader模块介绍
  4. html模拟在线股票走势,用HTML5实现全套股票行情图
  5. matlab predict函数并行,Matalb 智能算法第29个案例运行报错问题
  6. 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包
  7. 蓝桥杯 PREV-54 历届试题 合根植物
  8. python def函数参数_Python def函数的定义、使用及参数传递实现代码
  9. 强连通分量[trajan]
  10. 【真人手势动画制作软件】万彩手影大师教程 | 预览、保存及发布视频
  11. 用html制作微信头像,姓氏头像怎么弄?微信制作个人姓氏头像的方法
  12. Google浏览器清理缓存快捷键是什么
  13. MySQL学习笔记(七)视图,触发器,事务,存储过程,函数,流程控制,索引
  14. Linux基本的键盘输入快捷键和一些常用命令
  15. ORA-04091: table xxxx is mutating, trigger/function may not see it
  16. 计算机技术协会主持词,协会表彰大会主持词
  17. opencv-之图像细化(直线细化)
  18. EigenGame:将主成份分析(PCA)作为一个博弈游戏
  19. OA系统定制化,企业办公管理需求的新趋势
  20. 《网络安全工程师笔记》 第十二章:域

热门文章

  1. 企查查的批量公司查找
  2. 飞思卡尔imx6q交叉编译工具有关问题
  3. MongoDB学习(三)
  4. 解决MainActivity.onCreate(Unknown Source)的混淆错误
  5. new new Foo().getName()面试题解析
  6. clickhouse配置项config.xml详解——服务器配置参数
  7. mysql修改字符集utf8_修改mysql数据库字符集为UTF8
  8. Amlogic 4K UI显示
  9. 52函数零点或方程根的个数讨论
  10. matlab DSB-AM与SSB-AM的调制与解调