关于2048这款小游戏,网络上的算法笔笔皆是,我在Xcode平台上用更偏近于C的语法简单的实现了一下,仅供参考。
首先创建一个game类 。
#import "game.h"
@implementation game
@synthesize n=_n,count=_count,filePath;
-(id)initWithfirst:(int)num //初始化
{
self = [super init];
n = num >= 2 && num <= 10 ? num : 4;
a = (int **)malloc(sizeof(int*) * n);
for(int i=0;i<n;i++) {
a[i] = (int *)malloc(sizeof(int) * n);
memset(a[i], 0, sizeof(int) * n);
}
count = n * n - 2;
[self randset];
[self randset];
return self;
}
-(void)randset //产生随机数
{
if (0 == count)
return;
const double Max = 0.5;
int randnum = rand()%(n*n);
while (a[randnum/n][randnum%n])
randnum = rand()%(n*n);
a[randnum/n][randnum%n] = (rand() * 1.0/RAND_MAX<Max) ? 2 : 4;
count--;
}
-(void)dealloc//释放
{
for(int i = 0;i < n;i++)
free(a[i]);
free(a);
[super dealloc];
}
-(BOOL)move:(int)m
{
int count0 = 0;
flag = NO;
if(1 == m) {//up
for(int j = 0;j < n;j++) {
int i;
int old = -1;
int w = 0;
for(i = 0;i < n;i++)
if(a[i][j]) {
if(w != i) flag = YES;
a[w++][j] = a[i][j];
}
while(w < n)
a[w++][j] = 0;
for(i = 0;i < n;i++)
if(a[i][j]!=old) {
old=a[i][j];
} else {
a[i-1][j] *= 2;
if(a[i-1][j])flag = YES;
a[i][j] = 0;
old = -1;
}
w = 0;
for(i = 0;i < n;i++)
if(a[i][j])
a[w++][j] = a[i][j];
count0 += n - w;
while(w < n)
a[w++][j] = 0;
}
}
if(2 == m) {//down
for(int j = 0;j < n;j++)
{
int i;
int old = -1;
int w = n - 1;
for(i = n - 1;i >= 0;i--)
if(a[i][j]) {
if(w != i) flag = YES;
a[w--][j] = a[i][j];
}
while(w >= 0)
a[w--][j] = 0;
for(i = n - 1;i >= 0;i--)
if(a[i][j] != old) {
old = a[i][j];
} else {
a[i+1][j] *= 2;
if(a[i+1][j]) flag = YES;
a[i][j] = 0;
old = -1;
}
w = n-1;
for(i = n - 1;i >= 0;i--)
if(a[i][j])
a[w--][j] = a[i][j];
count0 += w+1;
while(w >= 0)
a[w--][j] = 0;
}
}
if(3 == m)//left
{
for(int i = 0;i < n;i++)
{
int j;
int old = -1;
int w = 0;
for(j = 0;j < n;j++)
if