使用 Delphi 开发移动应用 已翻译 100%

oschina 投递于 2012/12/11 08:28 (共 13 段, 翻译完成于 02-28)
阅读 10523
收藏 23
1
加载中

引言

现在移动设备发展现在变成了趋势. 我们可以考虑本地语言开发 (例如ObjectiveC for IOS或 Java for Android), 但通常对新开发者的学习代价. 另一个选择是第三方代理 (例如Titanium, PhoneGap) 并在偏好的语言中开发,目标位新移动平台. 

在此文章中,我想使用Object Pascal和Delphi为开发者演示类似的过程你可能记得. Borland Delphi 在本世纪初相当流行,并且还有一个很大社区.

寂寞沙洲
寂寞沙洲
翻译于 2012/12/26 12:11
1

虽然Borland不再开发Delphi了,接手的Embarcadero却用崭新的Delphi EX2把Delphi带到了新的高度. 语法及IDE依旧是原来的Delphi, 这就学习曲线会很低.

而XE2中最让人激动人心的 - 就是可以通过提供的FireMonkey框架开发IOS的应用 (未来也将支持Android).

在本文中我将通过FireMonkey框架用 object Pascal 开发一个IOS上的3x3格的井字棋游戏..

八宝粥
八宝粥
翻译于 2012/12/31 10:09
1

需求

这个 demo 的要求:

  • Embarcadero Delphi XE2的试用版 (差不多占用了所花费总时间的42%来填写表格,然后再获取工具)
  • Mac Lion 10.2+ 从AppStore免费获取XCode 
  • 一台越狱过的IPhone用来检验实际设备上的效果 (或者有一个开发者证书可用于签名)
  • 简单的程序 - 这是演示的是简化的3x3格的井字棋游戏.

八宝粥
八宝粥
翻译于 2012/12/31 10:23
1

印象中:开发环境和Delphi 7.0是一样的,因此任何熟悉Delphi的开发人都会对XE2觉得很舒服。XE2是Pascal的一个具有现代特点的专业术语,就像是:命名空间,等等。我不会感到很惊讶,如果他们已经实现也闭包和泛型类型。

RAD studio的开发许可价格很高-从2.5美元到3千美元不等。重要的附加功能:可以通过Delphi跨平台为win32,Mac和IOS编写代码。为了支持Mac系统,Embarcadero(英巴卡迪诺)公司已经从xUSSR软件公司购买了一套结局方案。基本上,使得开发人员在应用程序中可以交替使用VCL控制&组件树


苏谷子
苏谷子
翻译于 2013/01/11 17:43
1
为了开发一个 IOS 应用程序 - 你不得不 选择特别的 项目类型“ Firemonkey HD

IOS 应用程序“。接下来 我们 看到一个典型的 Delphi项目 被建立:一个 看起来很I Phone的项目

 


铂金小狼
铂金小狼
翻译于 2013/01/13 18:52
1

代码实现  

是时候开始编写游戏代码了。这类游戏典型的解决方案都会使用 MiniMax 决策(http://en.wikipedia.org/wiki/Minimax)。 我将摘要复制了过来:

Minimax (有时候也叫 minmax)是一个在最坏情况下尽量减少损失的决策规则,常用于决策理论,游戏理论,统计学及哲学中。从另一方面来说,也可以想象成尽量增加小量的收获(maximin)。

daxiaoming
daxiaoming
翻译于 2013/02/25 23:34
2

极大极小定理状态

对于两个人,总收益固定,策略有限的游戏,对每个玩家都存在一个变量V和一个混合策略,使得:

  1. 相对玩家二的策略,玩家一的最佳收益是V,且
  2. 相对于玩家一的策略,玩家二的最佳收益是 -V。

也可以说,无论玩家二的策略如何,玩家一的策略都可以保证他的回报为V。类似地,玩家二可以保证回报为 -V。极大极小定理的名称来源于,每个玩家都希望极大地使用对方获得极小的回报——既然总收益固定,他同时也极大地减少自己的损失(得到最大的收益)。

下面我们将用 Delphi 来在3*3的棋盘上实现Go游戏中的这个算法(代码托管在 github  上面,你可以点击本文结尾中的链接下载)。

daxiaoming
daxiaoming
翻译于 2013/02/27 23:22
1
游戏的实现类很简单
    TGameXOImpl = class
      private
        MovePatterns: array[0..4] of TXOPoint;
         //matched to external X/O/' '  layout button texts
        GamePane: array[0..2,0..2] of char;
        Moves: array[0..2,0..2] of byte;
 
        SignComputer: char;
        SignPlayer: char;
      protected
        procedure ResetGamePane();
        function AnalyzeTurn (Computer: Boolean; Step: Integer): Integer;
      public
        constructor Create();
        function ComputerTurn():TXOPoint;
        function CheckGameIsCompleted(Mark: Char):integer;
        procedure StartGame(PlayerSign: char);
        function PlayTurn(Turn:TXOPoint):integer;
 
        property ComputerSign : char read SignComputer ;
        property PlayerSign : char read SignPlayer;
 
    end;

开局

我们需要先定义一些有可能赢(至少不会输)的开局步骤。
MovePatterns[0] := TXOPoint.Create(0,0); 
MovePatterns[1] := TXOPoint.Create(0,2); 
MovePatterns[2] := TXOPoint.Create(1,1); 
MovePatterns[3] := TXOPoint.Create(2,2);

极大极小策略

以下的函数对下一回合比赛的情况进行分析,并为每个可能空的格子打分:游戏继续,0代表平局,游戏结束,1代表下一步可能会赢。这个函数的结果会被AI用来推算下一回合。
{ TGameXOImpl }
 
(**
*   @Mark char X|O check win criteria for passed mark
*
*   return  -1 game in progress,  0 - nobody won, 1 - passed mark has won
*)
function TGameXOImpl.AnalyzeTurn(Computer: Boolean; Step: Integer): Integer;
var i, j, checkturn, weight, max: Integer;
begin
  max := -1;
  for i := 0 to 2 do
    for j := 0 to 2 do
    begin
      weight := -2;
      if GamePane[i,j] = ' ' then
      begin
        if Computer then begin
          GamePane[i,j] := self.SignComputer;
        end else begin
         GamePane[i,j] := self.SignPlayer;
        end;
 
        if Computer then checkturn := CheckGameIsCompleted(self.SignComputer)
                    else checkturn := CheckGameIsCompleted (self.SignPlayer);
        if (checkturn < 0) then begin
          weight := - AnalyzeTurn(not Computer, Step + 1);
        end else begin
          weight := checkturn;
        end;
        if (weight > Max) then begin
          max := weight;
        end;
        GamePane[i,j] := ' ';
 
        if ((max = 1) and (step > 0)) then
        begin
          Result := Max;
          break;
        end;
      end;
      if (Step = 0) then Moves[i,j] := weight;
    end;
  Result := Max;
end;

daxiaoming
daxiaoming
翻译于 2013/02/27 23:36
1

测试游戏

我们来测试一下吧(推荐直接编译运行,或者使用编译好的程序来运行):

  

你可以直接编译本程序,也可以参考这里的图像: ( 4_2game.jpg 到 4_7game.jpg)

导出到 Mac 系统

现在我们可以测试游戏了,但是仅限于 windows 平台。为了将项目移植到 Mac平台上的XCode,我们需要使用配套的  dpr2xcode 工具。需要先进行配置,然后导出,如下图所示:

  

  

  

导出完成之后,你可以看到一个新建的 'XCode' 目录,你可以在 Mac 上使用 XCode 直接打开这个项目。

  

  

不幸的是,这个工具并不是很稳定,容易出错:

 

我花了 20 多分钟,利用 SysInternals Filemon 工具来试图找出问题所在。

daxiaoming
daxiaoming
翻译于 2013/02/28 22:23
1

我在 Mac 上试图编译时遇到问题:XCode 中的 TPoint 实现并没有接收两个参数(x,y)的构造函数。我只好自己写了个实现 TXOPoint。Delphi XE2 花了我 3000 美元,难道不应该提醒一下移植过程中可能出现的问题吗?!还好,实现了 TXOPoint 之后,我很顺利地在模拟器中运行了这个游戏。

  

  

  

为了部署你的程序到真实的IOS机器上,你需要一个开发者证书(每年100美元以上)。

daxiaoming
daxiaoming
翻译于 2013/02/28 22:30
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(21)

赵云30
赵云30
不错。比我的Delphi7强多了。
奔跑的颳牛
奔跑的颳牛
关注中,一直还没有开启Delphi的实际工作!!!!!!
hanlinsoft
hanlinsoft
非常期待。
BinSys
BinSys
ios支持方面编译不是难点,难点是例如对xib文件以及模拟及调试的良好支持,如果没有这个咀咒还是离不开mac,离不开xcode,那还不如直接用xcode,像monotouch最新版那样把开发工作从mac挪到windows上是个好办法,但他们还没解决编译及调试问题,还得依赖mac,所以没什么实际意义。
OpenIoT
OpenIoT
crossmix
crossmix
用dephi语言开发移动应用程序
七液
七液

引用来自“小耶果”的评论

该方法已经废弃.期待3月份Delphi XE移动开发版的发布吧(IOS),9月份(Android).

Win8估计是肯定支持的,iOS就看Delphi编译器小组的能耐了.不过现在用了LLVM估计应该不是问题.然后就是FireMonkey能不能在Android和iOS上好好跑了.千万别说把FreePascal集成到Delphi里面就成XE移动版了...千万不要呀.
七液
七液

引用来自“王晓明明”的评论

引用来自“桔子”的评论

delphi是我心目中最完美的编程语言之一

我一直以为delphi是集成开发环境。。。

kylin死后delphi就成语言了.虽然是基于pascal的object pascal.因为没其他公司用pascal所以delphi就象征着object pascal的发展.object pascal本身也就是Borland发明的所以怎么搞都可以,Anders又去微软搞了C#.没有委员会在后台搞毛就可以更自由的发挥...delphi现在还有泛型了.虽然相当的坑爹.
七液
七液
可惜XE2不能Android原生开发-输出给freepascal,本来说XE3可以的现在也没戏,不过倒是把LLVM架上去了,支持ARM看来指日可待。
Delphi的编译速度是C\C++拍马也赶不上的。
期待XE4早日诞生。话说李维最近也不出来吹水了。
我唯一不满意的就是tasm 5.3升级到5.4花了10年!!!!!!!!
5.4到现在又三年没升级了!!!而且不支持64bit!!!!
最扯淡的就是delphi不能输出obj了!直接ELF64了!!!!
害的我只能自己写link来解决库的问题.

不过总的来说Delphi比在Borland手里好多了
Firemonkey也是不错的东西.直接支持跨平台界面库了.
讨厌的QT,GTK都可以死开了.OpenGL才是王道(还有那个移动芯片不支持OpenGL??)期待王者早日回归
javasql
javasql
开发原生ios程序又多了一种选择了,这个要支持呀!
返回顶部
顶部