Swift数独游戏优化——C++与OC混编、plist自动生成
2015-04-09 18:49
337 查看
一、为什么要C++与OC混编?
在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的。但是在我的例子中我发现这样存在一定的局限性:
1、我是利用Terminal的重定向功能来实现输出的,这样不能查看程序的实际运行状态信息。
2、C++编写的代码不能直接生成plist文件,而OC有直接的API可以生成plist文件。(当我前几天刚知道的时候我感觉之前用C++生成plist是有多勇敢)
二、如何进行C++与OC混编?
1、OC文件后缀改为“mm”2、混编下涉及OC的语法要写在 “#import <Foundation/Foundation.h>”之后
三、注意点:
关于OC开发中的文件后缀名区别m,mm,cpp,h1)文件区别:
.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<QRCodeReader.h>用到了iostream,但是它是/iphoneOS6.1/user/include/c++下面的类,故需要把类名改为.mm即可
注意#import或#include的位置要在.mm文件里,如果在.h头文件里是没用的
四、具体到数独游戏的例子,最后的混编代码如下:
main.mm//
[code]// main.m
// sudokuGenerater
//
// Created by 张泽阳 on 4/9/15.
// Copyright (c) 2015 张泽阳. All rights reserved.
//
#include <fstream>
#include <unistd.h>
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
//#include "fstream.h"
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
ostringstream oss;
ostringstream coutt;
string currentS;
class CSudoku
{
int map[9][9],lastmap[9][9];
int smod;
int solves;
int check(int,int,int*);
void dfs();
public:
enum{ANY=0,ALL=1};
CSudoku(int n=40);// 随机生成数独,n越大越难
CSudoku(int*data);// 人工指定数独
string display();// 显示数独
void Sdisplay();// 显示数独
int resolve(int mod=ALL);// 解数独
};
long sand=0;
CSudoku::CSudoku(int n)
{
int i,j;
sand++;
srand(time(&sand));
do
{
for(i=0;i<9;++i)
{
for(j=0;j<9;++j)
map[i][j]=0;
j=rand()%9;
map[i][j]=i+1;
}
}
while(!resolve(ANY));
// 挖窟窿
for(int k=0;k<n;)
{
i=rand()%81;
j=i%9;
i=i/9;
if(map[i][j]>0)
{
map[i][j]=0;
++k;
}
}
//printf("(randomized sudoku created with %d blanks.)\n",blanks);
}
CSudoku::CSudoku(int*data)
{
int*pm=(int*)map;
for(int i=0;i<81;++i)
pm[i]=data[i];
}
void addS();
string CSudoku::display()
{
ostringstream osst;
osst.str("");
//osst<<"<string>";
for(int i=0;i<9;++i)
{
for(int j=0;j<9;++j)
{
//if(map[i][j]>0)
//printf("< %d > ",map[i][j]);
//else
//printf("[ ] ");
osst<<map[i][j];
}
//printf("\n");
}
//osst<<"</string>\n";
//oss<<osst.str();
return osst.str();
}
int same = 1;
void sameLog();
void CSudoku::Sdisplay()
{
ostringstream osst;
osst.str("");
//osst<<"<string>";
same = 1;
for(int i=0;i<9;++i)
{
for(int j=0;j<9;++j)
{
if (map[i][j]!=lastmap[i][j]) {
same = 0;
}
}
}
if (same) {
sameLog();
//same = 0;
return;
}
for(int i=0;i<9;++i)
{
for(int j=0;j<9;++j)
{
lastmap[i][j] = map[i][j];
osst<<map[i][j];
}
}
//osst<<"</string>\n";
//oss<<osst.str();
currentS = osst.str();
addS();
}
int CSudoku::resolve(int mod)
{
smod=mod;
if(mod==ALL)
{
solves=0;
dfs();
return solves;
}
else if(mod==ANY)
{
try
{
dfs();
return 0;
}
catch(int)
{
return 1;
}
}
return 0;
}
int CSudoku::check(int y,int x,int*mark)
{
int i,j,is,js,count=0;
for(i=1;i<=9;++i)
mark[i]=0;
for(i=0;i<9;++i)
mark[map[y][i]]=1;
for(i=0;i<9;++i)
mark[map[i][x]]=1;
is=y/3*3;
js=x/3*3;
for(i=0;i<3;++i)
{
for(j=0;j<3;++j)
mark[map[is+i][js+j]]=1;
}
for(i=1;i<=9;++i)
if(mark[i]==0)
count++;
return count;
}
int toomanys = 0; int blanks = 40;
void CSudoku::dfs()
{
int i,j,im=-1,jm=0,min=10;
int mark[10];
for(i=0;i<9;++i)
{
for(j=0;j<9;++j)
{
if(map[i][j])
continue;
int c=check(i,j,mark);
if(c==0)
return;
if(c<min)
{
im=i;
jm=j;
min=c;
}
}
}
if(im==-1)
{
if(smod==ALL)
{
++solves;
//printf("No. %d:\n",++solves);
if (solves>(2)) {
toomanys = 1;
return;
}
Sdisplay();
return;
}
else if(smod==ANY)
{
throw(1);
}
}
check(im,jm,mark);
for(i=1;i<=9;++i)
{
if(mark[i]==0)
{
map[im][jm]=i;
dfs();
}
}
map[im][jm]=0;
}
#import <Foundation/Foundation.h>
//#import "ref.mm"
NSMutableArray* eachSArray ;
/**
* 混编下涉及OC的语法要写在 “#import <Foundation/Foundation.h>”之后
*
*/
void addS(){
[eachSArray addObject:[NSString stringWithFormat:@"%s",currentS.c_str()]];
}
void sameLog(){
NSLog(@"same!!!!!!");
}
int main(int argc, const char* argv[]) {
@autoreleasepool {
//得到完整的文件名
NSString*filename=[@"/Users/zhangzeyang/Desktop/" stringByAppendingString:@"R.plist"];
NSMutableDictionary*data = [[NSMutableDictionary alloc]init];
int num = 0;
while (blanks<71) {
NSLog(@"\n------------blanks = %d------------\n",blanks);
//coutt<<"<key>D"<<blanks<<"</key>"<<endl<<"<array>"<<endl;
NSMutableArray* eachDArray = [[NSMutableArray alloc]init];
int inNum = 0;
//for (int ii = 0; ii + blanks <120; ++ii) {
for (int ii = 0; ii < 34 - blanks / 10; ++ii) {
NSLog(@"blanks = %d num = %d ii = %d",blanks,num,ii);
same = 1;toomanys = 0;
//oss<<"<dict>"<<endl<<"<key>p</key>"<<endl;
NSMutableDictionary* eachPassDic = [[NSMutableDictionary alloc]init];
CSudoku s(blanks);
string ppp = s.display();
[eachPassDic setValue:[NSString stringWithFormat:@"%s",ppp.c_str()] forKey:@"p"];
eachSArray = [[NSMutableArray alloc]init];
//oss<<"<key>s</key>"<<endl<<"<array>"<<endl;
s.resolve();
//oss<<"</array>"<<endl<<"</dict>"<<endl;
if (same){
oss.str("");
continue;
}else{
//coutt<<oss.str();
oss.str("");
[eachPassDic setValue:eachSArray forKey:@"s"];
[eachDArray addObject:eachPassDic];
++num;++inNum;
}
if (inNum>30) {
break;
}
}
//coutt<<"</array>"<<endl;
if (inNum ) {
//cout<<coutt.str();
[data setValue:eachDArray forKey:[NSString stringWithFormat:@"D%d",blanks]];
}
coutt.str("");
oss.str("");
blanks+=1;
}
//cout<<"</dict>\n</plist>\n";
//输入写入
[data writeToFile:filename atomically:NO];
}
return 0;
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
六、涉及到的其他知识
1)string转char*char* s = str.c_str();
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
即可
参考链接:
/article/1390546.html
/article/2059058.html
/article/7101185.html
http://m.blog.csdn.net/blog/woshiwls/17272621
相关文章推荐
- 【Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 将C++代码全部写到头文件:)python脚本帮助自动生成相应的实现文件初始框架
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 使用java反射优化Spring自动生成的DAO实现类!
- iOS-Cocos2d游戏开发】使用Zwoptex生成plist文件
- UML工具推荐 Poseidon版本 可以免费下载,自动生成代码 C++ Java C# VB.NET等 (来自德国汉堡的国际性建模软件开发商Gentleware AG的)
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的”.pvr.ccz”,”.plist”共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 用Perl来帮助生成C++版“自动属性”
- C++根据头文件自动生成实现文件框架(支持模版)
- Python在C/C++代码自动生成中的使用
- 用doxygen为C/C++程序自动生成文档(一)