用objective-c写2048算法

本文详细介绍了2048游戏的核心实现逻辑,包括如何处理玩家的不同方向操作(上、下、左、右),如何判断游戏状态以及如何进行数字方块的合并等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2048 具体规则就是 向哪个方向滑动  这个方向上的有数字的方块就会被换到没数字的地方,数字相同的方格就会被合并

等于现在主要要干的事就是合并 相同的数字并且碰到滑动方向有空格的占领空格的位置



现在用存放着数字的4*4的二维数组_dataArray来表示总体布  0代表空格   



//


/**

 判断不为空的位置上面是否有空位置 有的话则交换


 @return 返回是否有交换过

 */

- (BOOL)up_remove_blank{

    //i 表示第i纵列    j表示第j横行

    int i,j,k;

    //用来标记是否有空格被换下

    BOOL sign =NO;

    

    //循环遍历 外层固定i(也就是固定纵列)

    for(i=0;i<4;i++){

        

        //里面比较j(比较同一列的各行)

        for(j=1;j<4;j++){

            //用来存本行上面还有几行

            k=j;

            

            //从本行开始向上每一行依次便利

            while(k-1>=0&&[(_dataArray[k-1][i])intValue]==0){//判断上面的那个为空

                //判断当前位置是否为空 如果不为空 与上一行交换 为空则不懂

                if ([(_dataArray[k][i])intValue] !=0) {

                    [selfswapWithi1:i withJ1:(k-1)withI1:i withJ2:k];

                    //如果交换了标记交换了

                    sign = YES;

                }

                k--;

            }

        }

    }

    

    

    return sign;


}



/**

 判断向上是否有可合并的位置


 @return 是否合并过

 */

- (BOOL)up_combine{

    //i 表示第i纵列    j表示第j横行

    int i,j;

    BOOL sign =NO;

    //外层循环固定列

    for(i=0;i<4;i++){

        for(j=0;j<3;j++){

            //判断同一列的相邻行之间是否可以合并

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j+1][i]integerValue]) {

                _dataArray[j][i] =@(2*[_dataArray[j][i]integerValue]);

                //可合并的话加分

                _score += [_dataArray[j][i]integerValue];

                _dataArray[j+1][i] =@(0);

                sign = YES;

            }

        }

    }

    //执行一次向上的空格交换 因为合并后会有新的空格出现

    [selfup_remove_blank];

    return sign;

}



/**

 跟上面的除空格  合并的思想一样 只是这次是用来判断是否还有空格或者有可以合并的位置  不改变数组的值


 @return 返回在向上方向是否还可以有操作

 */

- (BOOL)judgeUp{

    int i,j,k;

    BOOL sign1 =NO;

    BOOL sign2 =NO;


    for(i=0;i<4;i++){

        for(j=1;j<4;j++){

            k=j;

            while(k-1>=0&&[(_dataArray[k-1][i])intValue]==0){//上面的那个为空

                if ([(_dataArray[k][i])intValue] !=0) {

                    sign1 = YES;

                }

                k--;

            }

        }

    }

    

    for(i=0;i<4;i++){

        for(j=0;j<3;j++){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j+1][i]integerValue]) {

                sign2 = YES;

            }

            

        }

    }


    return (sign1||sign2);


}

//

- (BOOL)down_remove_blank{

    int i,j,k;

    BOOL sign =NO;

    for(i=0;i<4;i++){

        for(j=2;j>=0;j--){

            k=j;

            while(k+1<=3&&[(_dataArray[k+1][i])intValue]==0){//上面的那个为空

                if ([(_dataArray[k][i])intValue] !=0) {

                    [selfswapWithi1:i withJ1:(k+1)withI1:i withJ2:k];

                    sign = YES;

                    

                }

                k++;

            }

        }

    }

    

    

    return sign;

    

}

- (BOOL)down_combine{

    int i,j;

    BOOL sign =NO;

    for(i=0;i<4;i++){

        for(j=3;j>0;j--){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j-1][i]integerValue]) {

                _dataArray[j][i] =@(2*[_dataArray[j][i]integerValue]);

                _score += [_dataArray[j][i]integerValue];


                _dataArray[j-1][i] =@(0);

                sign = YES;

            }

            

        }

    }

    

    [selfdown_remove_blank];

    

    

    return sign;

    

    

}


- (BOOL)judgeDown{

    int i,j,k;

    BOOL sign1 =NO;

    BOOL sign2 =NO;

    

    for(i=0;i<4;i++){

        for(j=2;j>=0;j--){

            k=j;

            while(k+1<=3&&[(_dataArray[k+1][i])intValue]==0){//上面的那个为空

                if ([(_dataArray[k][i])intValue] !=0) {

                    sign1 = YES;

                }

                k++;

            }

        }

    }

    

    for(i=0;i<4;i++){

        for(j=3;j>0;j--){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j-1][i]integerValue]) {

                sign2 = YES;

            }

            

        }

    }

    return (sign1||sign2);

    

}



//

- (BOOL)left_remove_blank{

    int i,j,k;

    BOOL sign =NO;

    for(j=0;j<4;j++){

        for(i=1;i<4;i++){

            k=i;

            while(k-1>=0&&[(_dataArray[j][k-1])intValue]==0){//上面的那个为空

                if ([(_dataArray[j][k])intValue] !=0) {

                    [selfswapWithi1:(k-1)withJ1:j withI1:kwithJ2:j];

                    sign = YES;

                    

                }

                k--;

            }

        }

    }

    

    

    return sign;

}

- (BOOL)left_combine{

    int i,j;

    BOOL sign =NO;

    for(j=0;j<4;j++){

        for(i=0;i<3;i++){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j][i+1]integerValue]) {

                _dataArray[j][i] =@(2*[_dataArray[j][i]integerValue]);

                _score += [_dataArray[j][i]integerValue];


                _dataArray[j][i+1] =@(0);

                sign = YES;

            }

            

        }

    }

    

    [selfleft_remove_blank];

    

    

    return sign;

    

    

}


- (BOOL)judgeLeft{

    int i,j,k;

    BOOL sign1 =NO;

    BOOL sign2 =NO;

    

    for(j=0;j<4;j++){

        for(i=1;i<4;i++){

            k=i;

            while(k-1>=0&&[(_dataArray[j][k-1])intValue]==0){//上面的那个为空

                if ([(_dataArray[j][k])intValue] !=0) {

                    sign1 = YES;

                }

                k--;

            }

        }

    }


    

    for(j=0;j<4;j++){

        for(i=0;i<3;i++){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j][i+1]integerValue]) {

                sign2 = YES;

            }

            

        }

    }

    return (sign1||sign2);

    

}

//

- (BOOL)right_remove_blank{

    int i,j,k;

    BOOL sign =NO;

    for(j=0;j<4;j++){

        for(i=2;i>=0;i--){

            k=i;

            while(k+1<=3&&[(_dataArray[j][k+1])intValue]==0){//上面的那个为空

                if ([(_dataArray[j][k])intValue] !=0) {

                    [selfswapWithi1:k+1withJ1:j withI1:kwithJ2:j];

                    sign = YES;

                    

                }

                k++;

            }

        }

    }

    

    

    return sign;

    

}

- (BOOL)right_combine{

    int i,j;

    BOOL sign =NO;

    for(j=0;j<4;j++){

        for(i=3;i>0;i--){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j][i-1]integerValue]) {

                _dataArray[j][i] =@(2*[_dataArray[j][i]integerValue]);

                _score += [_dataArray[j][i]integerValue];


                _dataArray[j][i-1] =@(0);

                sign = YES;

            }

            

        }

    }

    

    [selfright_remove_blank];

    

    

    return sign;

    

    

}


- (BOOL)judgeRight{

    int i,j,k;

    BOOL sign1 =NO;

    BOOL sign2 =NO;

    

    for(j=0;j<4;j++){

        for(i=2;i>=0;i--){

            k=i;

            while(k+1<=3&&[(_dataArray[j][k+1])intValue]==0){//上面的那个为空

                if ([(_dataArray[j][k])intValue] !=0) {

                    sign1 = YES;

                    

                }

                k++;

            }

        }

    }

    

    for(j=0;j<4;j++){

        for(i=3;i>0;i--){

            if ([_dataArray[j][i]integerValue] != 0 && [_dataArray[j][i]integerValue] == [_dataArray[j][i-1]integerValue]) {

                sign2 = YES;

            }

            

        }

    }

    return (sign1||sign2);

    

}






//交换数组中两个元素位置

- (void)swapWithi1:(int)i1 withJ1:(int)j1 withI1:(int)i2 withJ2:(int)j2{

    NSNumber *number1 =_dataArray[j1][i1];

    _dataArray[j1][i1] =_dataArray[j2][i2];

    _dataArray[j2][i2] = number1;

}


git demo地址 https://github.com/gunmm/Gunmm2048.git


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值