热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift数独游戏优化——C++与OC混编、plist自动生成

在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的。 但是在我的例子中我发现这样存在一定的局限性:1、我是利用Terminal的重定向功能来

在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的。

 

但是在我的例子中我发现这样存在一定的局限性:

1、我是利用Terminal的重定向功能来实现输出的,这样不能查看程序的实际运行状态信息。

2、C++编写的代码不能直接生成plist文件,而OC有直接的API可以生成plist文件。(当我前几天刚知道的时候我感觉之前用C++生成plist是有多勇敢)

 

二、如何进行C++与OC混编?

1、OC文件后缀改为“mm”

2、混编下涉及OC的语法要写在 “#import ”之后

 

三、注意点:

关于OC开发中的文件后缀名区别m,mm,cpp,h

1)文件区别:

.h :头文件。头文件包含类,类型,函数和常数的声明。
.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名

.cpp:只能编译C++

当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。

.m 和.mm 的区别是告诉gcc 在编译时要加的一些参数。当然.mm还可以命名成.m,但在编译时要手动加参数(麻烦)

2)常用场景:

如果你的OC代码里面有包含C++的引用或代码,将此类更改为.mm即可;

3)例子:

ERROR:./zxing/cpp/core/src/zxing/common/Counted.h:21:10: 'iostream' file not found

在引用zxing的时候#import用到了iostream,但是它是/iphoneOS6.1/user/include/c++下面的类,故需要把类名改为.mm即可

注意#import或#include的位置要在.mm文件里,如果在.h头文件里是没用的

 

 

四、具体到数独游戏的例子,最后的混编代码如下:

main.mm

   1:  //
   2:  //  main.m
   3:  //  sudokuGenerater
   4:  //
   5:  //  Created by 张泽阳 on 4/9/15.
   6:  //  Copyright (c) 2015 张泽阳. All rights reserved.
   7:  //
   8:   
   9:   
  10:  #include 
  11:  #include 
  12:  #include "stdio.h"
  13:  #include "stdlib.h"
  14:  #include "time.h"
  15:  //#include "fstream.h"
  16:  #include 
  17:  #include 
  18:  #include <string>
  19:   
  20:  using namespace std;
  21:  ostringstream oss;
  22:  ostringstream coutt;
  23:  string currentS;
  24:  class CSudoku
  25:  {
  26:      int map[9][9],lastmap[9][9];
  27:      int smod;
  28:      int solves;
  29:      int check(int,int,int*);
  30:      void dfs();
  31:  public:
  32:      enum{ANY=0,ALL=1};
  33:      CSudoku(int n=40);// 随机生成数独,n越大越难
  34:      CSudoku(int *data);// 人工指定数独
  35:   
  36:      string display();// 显示数独
  37:      void Sdisplay();// 显示数独
  38:      int resolve(int mod=ALL);// 解数独
  39:  };
  40:  long sand=0;
  41:   
  42:   
  43:  CSudoku::CSudoku(int n)
  44:  {
  45:      int i,j;
  46:      sand++;
  47:      srand(time(&sand));
  48:      do
  49:      {
  50:          for(i=0;i<9;++i)
  51:          {
  52:              for(j=0;j<9;++j)
  53:                  map[i][j]=0;
  54:              j=rand()%9;
  55:              map[i][j]=i+1;
  56:          }
  57:      }
  58:      while(!resolve(ANY));
  59:      
  60:      // 挖窟窿
  61:      for(int k=0;k

  
  62:      {
  63:          i=rand()%81;
  64:          j=i%9;
  65:          i=i/9;
  66:          if(map[i][j]>0)
  67:          {
  68:              map[i][j]=0;
  69:              ++k;
  70:          }
  71:          
  72:      }
  73:      //printf("(randomized sudoku created with %d blanks.)\n",blanks);
  74:  }
  75:  CSudoku::CSudoku(int *data)
  76:  {
  77:      int *pm=(int*)map;
  78:      for(int i=0;i<81;++i)
  79:          pm[i]=data[i];
  80:  }
  81:  void addS();
  82:  string CSudoku::display()
  83:  {
  84:      ostringstream osst;
  85:      osst.str("");
  86:  //    osst<<"";
  87:      for(int i=0;i<9;++i)
  88:      {
  89:          for(int j=0;j<9;++j)
  90:          {
  91:              //            if(map[i][j]>0)
  92:              //                printf("<%d >  ",map[i][j]);
  93:              //            else
  94:              //                printf("[   ]  ");
  95:              
  96:              osst<

  
  97:          }
  98:          //        printf("\n");
  99:      }
 100:  //    osst<<"\n";
 101:  //    oss<
 102:      return osst.str();
 103:  }
 104:  int same = 1;
 105:  void sameLog();
 106:  void CSudoku::Sdisplay()
 107:  {
 108:      ostringstream osst;
 109:      osst.str("");
 110:  //    osst<<"";
 111:      same  = 1;
 112:      for(int i=0;i<9;++i)
 113:      {
 114:          for(int j=0;j<9;++j)
 115:          {
 116:              if (map[i][j]!=lastmap[i][j]) {
 117:                  same = 0;
 118:              }
 119:          }
 120:      }
 121:      if (same) {
 122:          sameLog();
 123:  //        same = 0;
 124:          return;
 125:      }
 126:      for(int i=0;i<9;++i)
 127:      {
 128:          for(int j=0;j<9;++j)
 129:          {
 130:              lastmap[i][j] = map[i][j];
 131:              osst<

  
 132:          }
 133:      }
 134:  //    osst<<"\n";
 135:  //    oss<
 136:      currentS = osst.str();
 137:      addS();
 138:  }
 139:  int CSudoku::resolve(int mod)
 140:  {
 141:      smod=mod;
 142:      if(mod==ALL)
 143:      {
 144:          solves=0;
 145:          dfs();
 146:          return solves;
 147:      }
 148:      else if(mod==ANY)
 149:      {
 150:          try
 151:          {
 152:              dfs();
 153:              return 0;
 154:          }
 155:          catch(int)
 156:          {
 157:              return 1;
 158:          }
 159:      }
 160:      return 0;
 161:  }
 162:  int CSudoku::check(int y,int x,int *mark)
 163:  {
 164:      int i,j,is,js,count=0;
 165:      for(i=1;i<=9;++i)
 166:          mark[i]=0;
 167:      for(i=0;i<9;++i)
 168:          mark[map[y][i]]=1;
 169:      for(i=0;i<9;++i)
 170:          mark[map[i][x]]=1;
 171:      is=y/3*3;
 172:      js=x/3*3;
 173:      for(i=0;i<3;++i)
 174:      {
 175:          for(j=0;j<3;++j)
 176:              mark[map[is+i][js+j]]=1;
 177:      }
 178:      for(i=1;i<=9;++i)
 179:          if(mark[i]==0)
 180:              count++;
 181:      return count;
 182:  }
 183:  int toomanys = 0; int blanks = 40;
 184:  void CSudoku::dfs()
 185:  {
 186:      int i,j,im=-1,jm=0,min=10;
 187:      int mark[10];
 188:      for(i=0;i<9;++i)
 189:      {
 190:          for(j=0;j<9;++j)
 191:          {
 192:              if(map[i][j])
 193:                  continue;
 194:              int c=check(i,j,mark);
 195:              if(c==0)
 196:                  return;
 197:              if(c

  
 198:              {
 199:                  im=i;
 200:                  jm=j;
 201:                  min=c;
 202:              }
 203:          }
 204:      }
 205:      if(im==-1)
 206:      {
 207:          if(smod==ALL)
 208:          {
 209:              ++solves;
 210:              //            printf("No. %d:\n",++solves);
 211:              if (solves>(2)) {
 212:                  toomanys = 1;
 213:                  return;
 214:              }
 215:              Sdisplay();
 216:              return;
 217:          }
 218:          else if(smod==ANY)
 219:          {
 220:              throw(1);
 221:          }
 222:   
 223:          }
 224:      check(im,jm,mark);
 225:      for(i=1;i<=9;++i)
 226:      {
 227:          if(mark[i]==0)
 228:          {
 229:              map[im][jm]=i;
 230:              dfs();
 231:          }
 232:      }
 233:      map[im][jm]=0;
 234:  }
 235:   
 236:   
 237:  #import 
 238:  //#import "ref.mm"
 239:  NSMutableArray* eachSArray ;
 240:  /**
 241:   *  混编下涉及OC的语法要写在 “#import ”之后
 242:   *
 243:   */
 244:  void addS(){
 245:      [eachSArray addObject:[NSString stringWithFormat:@"%s",currentS.c_str()]];
 246:  }
 247:  void sameLog(){
 248:      NSLog(@"same!!!!!!");
 249:  }
 250:  int main(int argc, const char * argv[]) {
 251:      @autoreleasepool {
 252:          //得到完整的文件名
 253:          NSString *filename=[@"/Users/zhangzeyang/Desktop/" stringByAppendingString:@"R.plist"];
 254:          NSMutableDictionary *data = [[NSMutableDictionary alloc]init];
 255:          int num = 0;
 256:          while (blanks<71) {
 257:              NSLog(@"\n------------blanks = %d------------\n",blanks);
 258:  //            coutt<<"D"<"<"<
 259:              NSMutableArray* eachDArray = [[NSMutableArray alloc]init];
 260:              int inNum = 0;
 261:  //            for (int ii = 0; ii + blanks <120; ++ii) {
 262:               for (int ii = 0; ii <34 - blanks / 10; ++ii) {
 263:                  NSLog(@"blanks = %d num = %d  ii = %d",blanks,num,ii);
 264:   
 265:                  same = 1;toomanys = 0;
 266:  //                oss<<""<p"<
 267:                  NSMutableDictionary* eachPassDic = [[NSMutableDictionary alloc]init];
 268:                  CSudoku s(blanks);
 269:                  string ppp = s.display();
 270:                  [eachPassDic setValue:[NSString stringWithFormat:@"%s",ppp.c_str()] forKey:@"p"];
 271:                  eachSArray = [[NSMutableArray alloc]init];
 272:                  
 273:  //                oss<<"s"<"<
 274:                  s.resolve();
 275:  //                oss<<""<"<
 276:                  if (same){
 277:                      oss.str("");
 278:                      continue;
 279:                  }else{
 280:  //                    coutt<
 281:                      oss.str("");
 282:                      [eachPassDic setValue:eachSArray forKey:@"s"];
 283:                      [eachDArray addObject:eachPassDic];
 284:                      ++num;++inNum;
 285:                  }
 286:                  if (inNum>30) {
 287:                      break;
 288:                  }
 289:              }
 290:  //            coutt<<""<
 291:              if (inNum ) {
 292:  //                cout<
 293:                  [data setValue:eachDArray forKey:[NSString stringWithFormat:@"D%d",blanks]];
 294:              }
 295:              coutt.str("");
 296:              oss.str("");
 297:              blanks+=1;
 298:              
 299:          }
 300:          
 301:  //        cout<<"\n\n";
 302:          //输入写入
 303:          [data writeToFile:filename atomically:NO];
 304:      }
 305:      return 0;
 306:  }

 

六、涉及到的其他知识

1)string转char*

char* s = str.c_str();

即可

 

参考链接:

http://blog.csdn.net/totogo2010/article/details/7634185

http://blog.csdn.net/penuel/article/details/9796721

http://www.cnblogs.com/zhixing/archive/2013/06/04/3116814.html

http://m.blog.csdn.net/blog/woshiwls/17272621


推荐阅读
  • Gradle基础概念与实践指南
    本文详细介绍了Gradle的基本概念、Groovy语言基础、Gradle的生命周期、项目管理以及任务配置等内容,旨在帮助开发者更好地理解和使用Gradle构建工具。 ... [详细]
  • Alluxio 1.5.0 版本发布:增强功能与优化
    Alluxio 1.5.0 开源版本引入了多项新特性和改进,旨在提升数据访问速度和系统互操作性。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文将详细介绍如何封装一个多功能的PickerView组件,包括文本选择、日期选择和地理位置选择等功能,旨在提供一个更加灵活和易于使用的PickerView解决方案。 ... [详细]
  • 解决VSCode中文乱码问题的综合方案
    在使用VSCode进行开发时,尤其是涉及Python编程,可能会遇到中文乱码的问题。本文总结了多种有效的解决方案,帮助开发者快速解决这一常见问题。 ... [详细]
  • 开发笔记:Bash:从一个引用字符串块中的每个带引号的字符串中创建一个变量 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
author-avatar
勇_俊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有