Objective-C 实现2048算法类
参数model有一个二维数组data,及阶数matrix
//.h文件
@classDataModel;
@interfaceAlgorithm:NSObject
@property(nonatomic,assign)intaddScore;//加分
-(void)caculateTop:(DataModel*)model;//上滑规则
-(void)caculateBottom:(DataModel*)model;//下滑规则
-(void)caculateLeft:(DataModel*)model;//左滑规则
-(void)caculateRight:(DataModel*)model;//右滑规则
-(BOOL)randNewOne:(DataModel*)data;
-(int)getAddScore;
@end
//.m文件
@implementationAlgorithm
#pragmamark-滑动规则
-(void)caculateTop:(DataModel*)model{
[selfup_remove_blank:model];
[selfup:model];
}
-(void)caculateBottom:(DataModel*)model{
[selfdown_remove_blank:model];
[selfdown:model];
}
-(void)caculateLeft:(DataModel*)model{
[selfleft_remove_blank:model];
[selfleft:model];
}
-(void)caculateRight:(DataModel*)model{
[selfright_remove_blank:model];
[selfright:model];
}
-(int)getAddScore{
inttemp=_addScore;
_addScore=0;
returntemp;
}
#pragmamark-新一个
-(BOOL)randNewOne:(DataModel*)model{
arraydata=[modelgetData];
intall=0;
for(inti=0;i<model.matrix;i++){
for(intj=0;j<model.matrix;j++){
if(data[i][j]==0){
all=all+1;
}
}
}
if(all==0){
returnNO;
}
intindex=arc4random()%all;
all=0;
for(inti=0;i<model.matrix;i++){
for(intj=0;j<model.matrix;j++){
if(data[i][j]==0){
all=all+1;
if(all==index+1){
data[i][j]=2;
returnYES;
}
}
}
}
returnNO;
}
#pragmamark-滑动算法
-(void)up_remove_blank:(DataModel*)model{
arraydata=[modelgetData];
inti,j,k;
for(j=0;j<model.matrix;j++){
for(i=1;i<model.matrix;i++){
k=i;
while(k-1>=0&&data[k-1][j]==0){//上面的那个为空
//swap(data[k][j],data[k-1][j]);
inttemp=data[k][j];
data[k][j]=data[k-1][j];
data[k-1][j]=temp;
k--;
}
}
}
}
-(void)down_remove_blank:(DataModel*)model{
arraydata=[modelgetData];
inti,j,k;
for(j=0;j<model.matrix;j++){
for(i=model.matrix-2;i>=0;i--){
k=i;
while(k+1<=model.matrix-1&&data[k+1][j]==0){//上面的那个为空
//swap(a[k][j],a[k][j]);
inttemp=data[k][j];
data[k][j]=data[k+1][j];
data[k+1][j]=temp;
k++;
}
}
}
}
-(void)left_remove_blank:(DataModel*)model{
arraydata=[modelgetData];
inti,j,k;
for(i=0;i<model.matrix;i++){
for(j=1;j<model.matrix;j++){
k=j;
while(k-1>=0&&data[i][k-1]==0){//上面的那个为空
//swap(a[i][k],a[i][k-1]);
inttemp=data[i][k];
data[i][k]=data[i][k-1];
data[i][k-1]=temp;
k--;
}
}
}
}
-(void)right_remove_blank:(DataModel*)model{
arraydata=[modelgetData];
inti,j,k;
for(i=0;i<model.matrix;i++){
for(j=model.matrix-2;j>=0;j--){
k=j;
while(k+1<=model.matrix-1&&data[i][k+1]==0){//上面的那个为空
//swap(a[i][k],a[i][k+1]);
inttemp=data[i][k];
data[i][k]=data[i][k+1];
data[i][k+1]=temp;
k++;
}
}
}
}
-(void)left:(DataModel*)model{
arraydata=[modelgetData];
inti,j;
for(i=0;i<model.matrix;i++){
for(j=0;j<model.matrix-1;j++){
if(data[i][j]==data[i][j+1]){
_addScore=_addScore+data[i][j];
data[i][j]+=data[i][j+1];
data[i][j+1]=0;
[selfleft_remove_blank:model];
}
}
}
}
-(void)right:(DataModel*)model{
arraydata=[modelgetData];
inti,j;
for(i=0;i<model.matrix;i++){
for(j=model.matrix-1;j>=1;j--){
if(data[i][j]==data[i][j-1]){
_addScore=_addScore+data[i][j];
data[i][j]+=data[i][j-1];
data[i][j-1]=0;
[selfright_remove_blank:model];
}
}
}
}
-(void)up:(DataModel*)model{
arraydata=[modelgetData];
inti,j;
for(j=0;j<model.matrix;j++){//每一列
for(i=0;i<model.matrix-1;i++){
if(data[i][j]==data[i+1][j]){
_addScore=_addScore+data[i][j];
data[i][j]=data[i][j]+data[i+1][j];
data[i+1][j]=0;
//移除空格
[selfup_remove_blank:model];
}
}
}
}
-(void)down:(DataModel*)model{
arraydata=[modelgetData];
inti,j;
for(j=0;j<model.matrix;j++){//每一列
for(i=model.matrix-1;i>=1;i--){
if(data[i][j]==data[i-1][j]){
_addScore=_addScore+data[i][j];
data[i][j]=data[i][j]+data[i-1][j];
data[i-1][j]=0;
//移除空格
[selfdown_remove_blank:model];
}
}
}
}
@end