GreedySnake 还记得小时候的游戏吗?

#import <UIKit/UIKit.h>


// 枚举

typedef enum : NSUInteger {

    SNAKEDIRECTIONUP = -100,

    SNAKEDIRECTIONDOWN = 100,

    SNAKEDIRECTIONLEFT = -1,

    SNAKEDIRECTIONRIGHT = 1

}SnakeDirection;


@interface MyViewController : UIViewController


// 为了确定蛇的首尾,所以给蛇放数组中

{

    NSMutableArray *_snake;

    SnakeDirection _direction;

//    NSUInteger _direction;

}

@end






#import "MyViewController.h"


#define BLOCKHEIGHT 20

#define BLOCKWIDTH 20


@interface MyViewController ()


@end


@implementation MyViewController


-(void)dealloc

{

    [_snake release];

    

    [super dealloc];

}


// 因为蛇只能被初始化一次,所以把蛇放在init

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        _snake = [[NSMutableArray arrayWithCapacity:16 * 16] retain]; // 哪出了问题?

        // 便利构造器,出了init方法就会被release

        

        // 设定方向

        _direction = SNAKEDIRECTIONRIGHT;

    }

    return self;

}


- (void)loadView

{

    [super loadView];

    // 创建地板

    CGRect board = CGRectMake(0, 0, BLOCKWIDTH, BLOCKHEIGHT);

    for (int i = 0; i < 16; i++) {

        board.origin.y = i * BLOCKHEIGHT + 40;

        for (int j = 0; j < 16; j++) {

            board.origin.x = j * BLOCKWIDTH + 20;

            UIButton *myButton = [UIButton buttonWithType:UIButtonTypeSystem];

            [myButton setFrame:board];

            [myButton setBackgroundColor:[UIColor blackColor]];

            [self.view addSubview:myButton];

            

            [myButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];

            [myButton.layer setBorderWidth:0.8];

            [myButton setTag:(i + 1) * 100 + j + 1];

            [myButton addTarget:self action:@selector(changeDirection:) forControlEvents:UIControlEventTouchUpInside];

        }

    }

    int tag = 805;

    // 设置蛇的数量为5 (注意tag的值,应该是-i, 要确定好蛇的头部和尾部)

    for (int i = 0; i < 15; i++) {

        UIButton *snakeBlock = [UIButton buttonWithType:UIButtonTypeCustom];

        // 拿到tag位置的地板

        UIButton *block = (UIButton *)[self.view viewWithTag:tag - i];

        [snakeBlock setFrame:block.frame];

        //设置蛇的tag

        [snakeBlock setTag:block.tag + 10000];

        [snakeBlock setBackgroundColor:[UIColor yellowColor]];

        [self.view addSubview:snakeBlock];

        // 把蛇放到数组当中

        [_snake addObject:snakeBlock];

    }

    NSLog(@"%@", _snake);

    

    [self randomFood];

}


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    

    [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(move:) userInfo:nil repeats:YES];

}


// 产生食物

- (void)randomFood

{

    unsigned int rRow = arc4random() % (16 - 1 + 1) + 1;

    unsigned int rCol = arc4random() % (16 - 1 + 1) + 1;

    NSInteger rTag = rRow * 100 + rCol;

    UIButton *rBlock = (UIButton *)[self.view viewWithTag:rTag];

    

    UIButton *food = [UIButton buttonWithType:UIButtonTypeCustom];

    [food setFrame:rBlock.frame];

    [food setTag:rBlock.tag + 10000];

    [food setBackgroundColor:[UIColor yellowColor]];

    [self.view addSubview:food];

}


- (void)move:(id)sender

{

    // 计算下一个位置

    // 找到蛇头

    UIButton *snakeHead = [_snake firstObject];

    // 找到下一个位置(蛇的运动方向)

    UIButton *nextblock = (UIButton *)[self.view viewWithTag:snakeHead.tag - 10000 + _direction];

    

    if (nextblock == nil) {

        //下一块为nil了, 创墙了

        return;

    }

    // 能否找到food(tag)

    UIButton *food = (UIButton *)[self.view viewWithTag:nextblock.tag + 10000];

    if (food) { // 不用数组遍历

        if ([_snake containsObject:food]) {

            // 自身碰撞

            NSLog(@"Game over");

            return;

        }else{

            // 吃食物

            [_snake insertObject:food atIndex:0];

            [self randomFood];

            return;

        }

    }

    // 移动蛇尾

    UIButton *snakeTail = [_snake lastObject];

    [snakeTail setFrame:nextblock.frame];

    [snakeTail setTag:nextblock.tag + 10000];

    //去除原来的蛇尾

    [_snake removeObject:snakeTail];

    // 把蛇尾插入头的位置

    [_snake insertObject:snakeTail atIndex:0];

}


- (void)changeDirection:(UIButton *)sender

{

    UIButton *snakeHead = [_snake firstObject];

    

    if (_direction == SNAKEDIRECTIONUP || _direction == SNAKEDIRECTIONDOWN) {// 纵向(向左右走)

        if (sender.tag % 100 > snakeHead.tag % 100) {

            _direction = SNAKEDIRECTIONRIGHT;

        }else if (sender.tag % 100 < snakeHead.tag % 100){

            _direction = SNAKEDIRECTIONLEFT;

        }

    }else{ // 横向(向上下走)(所以比较行,所以比较百位就行)

        if (sender.tag / 100 > (snakeHead.tag - 10000) / 100) {

            _direction = SNAKEDIRECTIONDOWN;

        }else if (sender.tag / 100 < (snakeHead.tag - 10000) / 100){

            _direction = SNAKEDIRECTIONUP;

        }

    }

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Greedy local learning(GLL)是一种机器学习算法,它是一种迭代的方法,每次迭代都会在模型的当前状态下,通过局部优化来更新模型的参数。GLL通常用于解决大规模的优化问题,特别是那些非凸优化问题。在每次迭代中,GLL只考虑一个局部的子问题,然后通过贪心的方式来选择最优的解决方案。这种方法的好处在于它可以在大规模数据集上进行快速的训练,并且可以在每次迭代中减少计算量,从而加速模型的训练。但是,由于它只考虑了局部最优解,因此不能保证全局最优解,可能会陷入局部最优解。 ### 回答2: Greedy local learning(贪心局部学习)是一种机器学习算法。它的主要目标是通过逐步地从训练数据中选择和学习最有用的特征子集来进行特征选择。该算法通过贪心策略,在每一步中都选择当前能够提供最大信息增益的特征进行学习。在每一轮中,算法都会评估当前的特征子集并选择一个新的特征加入其中,以提高整体的模型预测性能。 Greedy local learning的主要思想是迭代地选择最佳特征子集,因此它是一个相对快速的特征选择方法。该算法不需要事先知道最佳的特征组合,而是通过局部搜索来逐渐提高模型的性能。贪心算法能够快速地收敛,并且在许多实际问题中获得了良好的实验结果。 然而,Greedy local learning也存在一些限制。由于其贪心策略,在每一步中只选择了局部最佳的特征,因此可能会得到次优的特征子集。此外,算法的迭代过程可能会由于局部最优解而陷入死循环。为了解决这些问题,可以采用一些启发式规则或者其他补充的方法来改进算法的性能。 总之,贪心局部学习是一种特征选择的方法,通过逐步地选择最佳的特征子集来提高学习算法的性能。它具有快速收敛和良好的实验结果等优点,但也存在一些限制需要注意。 ### 回答3: 贪婪局部学习(Greedy local learning)是一种数据挖掘方法,旨在通过在每个数据点周围建立局部模型,逐步推断全局模型。该方法的基本思想是,在整个数据集上以贪婪的方式进行建模,每次只考虑一个样本点及其附近的邻居。 贪婪局部学习的步骤包括以下几个方面: 1. 选择一个样本点作为起始点,可以是随机选择或者根据某种准则选取。 2. 根据选择的起始点,确定其邻居样本点,一般通过计算其距离的方式。 3. 使用邻居样本点来构建一个局部模型,可以是线性回归、决策树等。 4. 在局部模型的基础上,对全局模型进行更新。可以通过将本地模型的结果添加到全局模型中,或者更新全局模型的参数。 5. 选取下一个样本点,重复以上步骤,直到所有样本点都被考虑过。 贪婪局部学习的特点是简单、高效,能够处理大规模数据集。由于每次只考虑一个样本点及其邻居,计算复杂度相对较低,适合处理大数据的情况。同时,它还能够在全局范围内进行模型更新,使得最终得到的全局模型相对准确。 然而,贪婪局部学习也有一些限制。由于只考虑局部信息,可能会导致全局模型的偏差。此外,由于每个局部模型是独立构建的,没有考虑到它们之间的关联性,因此可能会导致模型不一致性。 综上所述,贪婪局部学习是一种通过在每个数据点周围建立局部模型,逐步推断全局模型的数据挖掘方法。它简单高效,适用于大数据集,但存在模型偏差和不一致性的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值