免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1285 | 回复: 0
打印 上一主题 下一主题

[iOS] iOS版2048算法类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-24 10:15 |只看该作者 |倒序浏览
实现2048算法
参数model有一个二维数组data,及阶数matrix

分为.h .m文件
  1. // .h文件
  2. @class DataModel;

  3. @interface Algorithm : NSObject

  4. @property (nonatomic,assign) int addScore;         // 加分

  5. - (void)caculateTop:(DataModel *)model;            // 上滑规则
  6. - (void)caculateBottom:(DataModel *)model;         // 下滑规则
  7. - (void)caculateLeft:(DataModel *)model;           // 左滑规则
  8. - (void)caculateRight:(DataModel *)model;          // 右滑规则

  9. - (BOOL)randNewOne:(DataModel *)data;

  10. - (int)getAddScore;

  11. @end


  12. // .m文件
  13. @implementation Algorithm

  14. #pragma mark - 滑动规则
  15. - (void)caculateTop:(DataModel *)model {
  16.     [self up_remove_blank:model];
  17.     [self up:model];
  18. }

  19. - (void)caculateBottom:(DataModel *)model {
  20.     [self down_remove_blank:model];
  21.     [self down:model];
  22. }

  23. - (void)caculateLeft:(DataModel *)model {
  24.     [self left_remove_blank:model];
  25.     [self left:model];
  26. }

  27. - (void)caculateRight:(DataModel *)model {
  28.     [self right_remove_blank:model];
  29.     [self right:model];
  30. }

  31. - (int)getAddScore {
  32.     int temp = _addScore;
  33.     _addScore = 0;
  34.     return temp;
  35. }

  36. #pragma mark - 新一个
  37. - (BOOL)randNewOne:(DataModel *)model {
  38.     array data = [model getData];
  39.     int all = 0;
  40.     for (int i=0; i<model.matrix; i++) {
  41.         for (int j=0; j<model.matrix; j++) {
  42.             if (data[i][j] == 0) {
  43.                 all = all + 1;
  44.             }
  45.         }
  46.     }
  47.     if (all == 0) {
  48.         return NO;
  49.     }
  50.     int index = arc4random() % all;
  51.     all = 0;
  52.     for (int i=0; i<model.matrix; i++) {
  53.         for (int j=0; j<model.matrix; j++) {
  54.             if (data[i][j] == 0) {
  55.                 all = all + 1;
  56.                 if (all == index+1) {
  57.                     data[i][j] = 2;
  58.                     return YES;
  59.                 }
  60.             }
  61.         }
  62.     }
  63.     return NO;
  64. }

  65. #pragma mark - 滑动算法
  66. - (void)up_remove_blank:(DataModel *)model {
  67.     array data = [model getData];
  68.     int i,j,k;
  69.     for(j=0;j < model.matrix;j++){
  70.         for(i=1;i < model.matrix;i++){
  71.             k=i;
  72.             while(k-1>=0&&data[k-1][j]==0){//上面的那个为空
  73.                 //swap(data[k][j],data[k-1][j]);
  74.                 int temp = data[k][j];
  75.                 data[k][j] = data[k-1][j];
  76.                 data[k-1][j] = temp;
  77.                 k--;
  78.             }
  79.         }
  80.     }
  81. }

  82. - (void)down_remove_blank:(DataModel *)model {
  83.     array data = [model getData];
  84.     int i,j,k;
  85.     for(j=0; j < model.matrix; j++){
  86.         for(i = model.matrix-2; i >= 0; i--){
  87.             k=i;
  88.             while(k+1<=model.matrix-1&&data[k+1][j]==0){//上面的那个为空
  89.                 //swap(a[k][j],a[k][j]);
  90.                 int temp = data[k][j];
  91.                 data[k][j] = data[k+1][j];
  92.                 data[k+1][j] = temp;
  93.                 k++;
  94.             }
  95.         }
  96.     }
  97. }

  98. - (void)left_remove_blank:(DataModel *)model {
  99.     array data = [model getData];
  100.     int i,j,k;
  101.     for(i=0;i < model.matrix;i++){
  102.         for(j=1;j<model.matrix;j++){
  103.             k=j;
  104.             while(k-1>=0&&data[i][k-1]==0){//上面的那个为空
  105.                 //swap(a[i][k],a[i][k-1]);
  106.                 int temp = data[i][k];
  107.                 data[i][k] = data[i][k-1];
  108.                 data[i][k-1] = temp;
  109.                 k--;
  110.             }
  111.         }
  112.     }
  113. }
  114. - (void)right_remove_blank:(DataModel *)model {
  115.     array data = [model getData];
  116.     int i,j,k;
  117.     for(i=0;i<model.matrix;i++){
  118.         for(j=model.matrix-2;j>=0;j--){
  119.             k=j;
  120.             while(k+1<=model.matrix-1&&data[i][k+1]==0){//上面的那个为空
  121.                 //swap(a[i][k],a[i][k+1]);
  122.                 int temp = data[i][k];
  123.                 data[i][k] = data[i][k+1];
  124.                 data[i][k+1] = temp;
  125.                 k++;
  126.             }
  127.         }
  128.     }
  129. }
  130. - (void)left:(DataModel *)model {
  131.     array data = [model getData];
  132.     int i,j;
  133.     for(i=0;i<model.matrix;i++){
  134.         for(j=0;j<model.matrix-1;j++){
  135.             if(data[i][j]==data[i][j+1]){
  136.                 _addScore = _addScore + data[i][j];
  137.                 data[i][j]+=data[i][j+1];
  138.                 data[i][j+1]=0;
  139.                 [self left_remove_blank:model];
  140.             }
  141.         }
  142.     }
  143. }
  144. - (void)right:(DataModel *)model {
  145.     array data = [model getData];
  146.     int i,j;
  147.     for(i=0;i<model.matrix;i++){
  148.         for(j=model.matrix-1;j>=1;j--){
  149.             if(data[i][j]==data[i][j-1]){
  150.                 _addScore = _addScore + data[i][j];
  151.                 data[i][j]+=data[i][j-1];
  152.                 data[i][j-1]=0;
  153.                 [self right_remove_blank:model];
  154.             }
  155.         }
  156.     }
  157. }
  158. - (void)up:(DataModel *)model {
  159.     array data = [model getData];
  160.     int i,j;
  161.     for(j=0;j<model.matrix;j++){//每一列
  162.         for(i=0;i<model.matrix-1;i++){
  163.             if(data[i][j]==data[i+1][j]){
  164.                 _addScore = _addScore + data[i][j];
  165.                 data[i][j]=data[i][j]+data[i+1][j];
  166.                 data[i+1][j]=0;
  167.                 //移除空格
  168.                 [self up_remove_blank:model];
  169.             }
  170.         }
  171.     }
  172. }
  173. - (void)down:(DataModel *)model {
  174.     array data = [model getData];
  175.     int i,j;
  176.     for(j=0;j<model.matrix;j++){//每一列
  177.         for(i=model.matrix-1;i>=1;i--){
  178.             if(data[i][j]==data[i-1][j]){
  179.                 _addScore = _addScore + data[i][j];
  180.                 data[i][j]=data[i][j]+data[i-1][j];
  181.                 data[i-1][j]=0;
  182.                 //移除空格
  183.                 [self down_remove_blank:model];
  184.             }
  185.         }
  186.     }
  187. }


  188. @end
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP