循环逻辑。让我逻辑滞空的小题目

昨晚遇到了一个让我逻辑滞空的小题目:

让storyBoard中有一个button按钮,按钮图片可以随便设定,要求点击一下按钮,按钮就要向右下角45°方向移动。要就碰到四周时,button就要向个方向的90°方向移动。以此循环,碰到四周就要求转换方向。

当时逻辑情况怎么也弄不清楚,总觉的少了好多情况。静下心来,我们来研究一下。

定义边界属性(其实也可以定义局部变量)

//button移动右边界范围x
@property (nonatomic, assign) NSInteger rightRangeX;
//button移动左边界范围x
@property (nonatomic, assign) NSInteger leftRangeX;
//button移动下边界范围y
@property (nonatomic, assign) NSInteger bottomRangeY;
//button移动上边界范围y
@property (nonatomic, assign) NSInteger heightRangeY;

 设定两个BOOL值:用来判断是否向左,或向上(也可以向下,或向右)

//判断button是否向左
@property (nonatomic,assign) BOOL isleft;
//判断button是否向上
@property (nonatomic,assign) BOOL isup;

 在viewDidLoad中,让BOOL值为NO,因为题目要求是右下角嘛,要跟着题目走..

- (void)viewDidLoad {
    [super viewDidLoad];
    self.isleft = NO;
    self.isup = NO;
    // Do any additional setup after loading the view, typically from a nib.
}

 拖一个button方法:moveBtnClick: 

- (IBAction)moveBtnClick:(UIButton *)sender 
{
  ...  
}

 方法中获取了屏幕的大小、设置了每次移动的距离(我假象为speed)、button在各个边的临界范围

    //获取屏幕大小
    CGRect mainRect = [[UIScreen mainScreen] bounds];
    
    //设置移动距离值
    NSInteger speed = 10;
    
    //求出button在个边的临界范围
    CGRect tempFrame = self.btnClick.frame;

    self.rightRangeX = mainRect.size.width - 60;
    self.bottomRangeY = mainRect.size.height - 60;
    self.leftRangeX = 0;
    self.heightRangeY = 0;


(由于我在storyBoard中直接就设定了60 * 60 的大小,所以在求范围的时候就用了 “魔鬼数字 60”)

 主逻辑:起初,我在纸上写了不下10中情况,我考虑了起初button的各个位置的情况,在if语句中嵌套了无数个if语句,结果最后把自己锁死了进去。其实无非就上下左右,先考虑左右,在左右中考虑上下。仅此而已。

    if (self.isleft) {
        tempFrame.origin.x -= speed;
        if (tempFrame.origin.x < self.leftRangeX)
        {
            self.isleft = NO;
            tempFrame.origin.y += speed;
        }
        if (self.isup)
        {
            tempFrame.origin.y -= speed;
            if (tempFrame.origin.y < self.heightRangeY)
            {
                self.isup = NO;
            }
        }
        else
        {
            tempFrame.origin.y += speed;
            if (tempFrame.origin.y > self.bottomRangeY)
            {
                self.isup = YES;
            }
        }
    }
    else
    {
        tempFrame.origin.x += speed;
        if (tempFrame.origin.x > self.rightRangeX)
        {
            tempFrame.origin.y -= speed;
            self.isleft = YES;
        }
        if (self.isup)
        {
            tempFrame.origin.y -= speed;
            if (tempFrame.origin.y < self.heightRangeY)
            {
                self.isup = NO;
            }
        }
        else
        {
            tempFrame.origin.y +=speed;
            if (tempFrame.origin.y > self.bottomRangeY)
            {
                self.isup  = YES;
            }
        }
    }
  • 一道简单的逻辑分析问题,我却把自己锁死进去,给自己一个一个警告吧,遇到逻辑文字,静下心来,从全局入手,不要走一步分析一步,总也会有意想不到的问题发生,等走到了最后,发现自己已经走不出自己的逻辑了,挠头吧、删了重写吧、心里面乱了,就怎么都不会有任何新的进展了。
  • 静下心来,从总体入手,搭建出来打的框架,往框架里面添加所需要的逻辑。到头来,读一下自己写的代码,真简单。
  • 这是一道简单的逻辑问题,以后会遇到各种各样的复杂逻辑。静下心,搭出框架,走的每一步自己都知道在做什么,这样才能写出一套完美的逻辑。

上全代码: 

  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 
  5 @property (weak, nonatomic) IBOutlet UIButton *btnClick;
  6 //button移动右边界范围x
  7 @property (nonatomic, assign) NSInteger rightRangeX;
  8 
  9 //button移动左边界范围x
 10 @property (nonatomic, assign) NSInteger leftRangeX;
 11 
 12 //button移动下边界范围y
 13 @property (nonatomic, assign) NSInteger bottomRangeY;
 14 
 15 //button移动上边界范围y
 16 @property (nonatomic, assign) NSInteger heightRangeY;
 17 
 18 //判断button是否向左
 19 @property (nonatomic,assign) BOOL isleft;
 20 //判断button是否向上
 21 @property (nonatomic,assign) BOOL isup;
 22 
 23 @end
 24 
 25 @implementation ViewController
 26 
 27 - (void)viewDidLoad {
 28     [super viewDidLoad];
 29     self.isleft = NO;
 30     self.isup = NO;
 31     // Do any additional setup after loading the view, typically from a nib.
 32 }
 33 
 34 
 35 - (void)didReceiveMemoryWarning {
 36     [super didReceiveMemoryWarning];
 37     // Dispose of any resources that can be recreated.
 38 }
 39 - (IBAction)moveBtnClick:(UIButton *)sender
 40 {
 41     //获取屏幕大小
 42     CGRect mainRect = [[UIScreen mainScreen] bounds];
 43     
 44     //设置移动距离值
 45     NSInteger speed = 10;
 46     
 47     //求出button在个边的临界范围
 48     CGRect tempFrame = self.btnClick.frame;
 49 
 50     self.rightRangeX = mainRect.size.width - 60;
 51     self.bottomRangeY = mainRect.size.height - 60;
 52     self.leftRangeX = 0;
 53     self.heightRangeY = 0;
 54     
 55     if (self.isleft) {
 56         tempFrame.origin.x -= speed;
 57         if (tempFrame.origin.x < self.leftRangeX)
 58         {
 59             self.isleft = NO;
 60             tempFrame.origin.y += speed;
 61         }
 62         if (self.isup)
 63         {
 64             tempFrame.origin.y -= speed;
 65             if (tempFrame.origin.y < self.heightRangeY)
 66             {
 67                 self.isup = NO;
 68             }
 69         }
 70         else
 71         {
 72             tempFrame.origin.y += speed;
 73             if (tempFrame.origin.y > self.bottomRangeY)
 74             {
 75                 self.isup = YES;
 76             }
 77         }
 78     }
 79     else
 80     {
 81         tempFrame.origin.x += speed;
 82         if (tempFrame.origin.x > self.rightRangeX)
 83         {
 84             tempFrame.origin.y -= speed;
 85             self.isleft = YES;
 86         }
 87         if (self.isup)
 88         {
 89             tempFrame.origin.y -= speed;
 90             if (tempFrame.origin.y < self.heightRangeY)
 91             {
 92                 self.isup = NO;
 93             }
 94         }
 95         else
 96         {
 97             tempFrame.origin.y +=speed;
 98             if (tempFrame.origin.y > self.bottomRangeY)
 99             {
100                 self.isup  = YES;
101             }
102         }
103     }
104     sender.frame = tempFrame;
105 }
106 
107 
108 @end

仅此。

原文地址:https://www.cnblogs.com/Dog-Ping/p/6053158.html