65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Delphi 进行移动开发

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012年12月10日

CC (ASA 3U)

6分钟阅读

viewsIcon

33182

downloadIcon

126

Delphi 开发人员使用 Firemonkey 框架进行移动开发的概念验证方法。

引言

为移动设备开发现在已成为一种趋势。我们可以考虑使用原生语言进行开发(例如 iOS 使用 Objective-C,Android 使用 Java),但对于新开发者来说,学习曲线通常很高。另一种选择是使用第三方代理(如 Titanium、PhoneGap),并使用您选择的首选语言进行开发,同时针对新的移动平台。

在本文中,我想向熟悉面向对象 Pascal 和 Delphi 的开发者展示一种类似的方法。您可能还记得,Borland Delphi 在本世纪初非常受欢迎,并且仍然拥有庞大的社区。

虽然 Inprise(Borland)公司已不再开发其产品,但另一家公司 Embarcadero 通过其新的 Delphi XE2 产品,成功地将 Delphi 推向了一个新的水平。这是一种源自原始 Delphi 的语言和 IDE,因此学习曲线要低得多。

XE2 中最完美的功能是能够通过其 FireMonkey 框架开发 iOS(未来还将开发 Android)应用程序。

在本文中,我将通过一个概念验证过程,演示如何在 3x3 的棋盘上开发一个简化的围棋游戏。

为 iOS 开发,使用面向对象 Pascal 和 FireMonkey。

背景

尝试演示需要什么?

  • Embarcadero Delphi XE2 的试用版(我花费了总时间的至少 42% 来填写所有表单并获取工具)
  • Mac Lion 10.2+,并附带 AppStore 中的免费 Xcode
  • 借用的越狱 iPhone,用于在真实设备上测试解决方案(或开发者证书用于签名)
  • 简单的编程任务 - 在这种情况下,是在 3x3 方格上开发一个简化的围棋游戏。

印象

开发环境与 Delphi 7.0 几乎相同,因此任何熟悉 Delphi 的开发者都会觉得 XE2 非常舒适。XE2 是面向对象 Pascal 的一个方言,具有命名空间等现代功能。如果他们还在其中实现了闭包和泛型,我不会感到非常惊讶。

开发者许可证成本很高 - RAD Studio 的起价为 2.5-3k 美元。重要的附加功能:能够用 Delphi 编写跨平台的 Windows 32、Mac 和 iOS 应用程序。为了支持 Mac,Embarcadero 从一个前苏联软件公司购买了解决方案。基本上,他们实现了一种替代 VCL 控件和组件树的方法,开发者可以在应用程序开发过程中使用它们。

要开发 iOS 平台应用程序,您必须选择特殊的项目类型“Firemonkey HD

IOS Application”。我们看到一个典型的 Delphi 项目已被创建:一个看起来像 iPhone 界面的窗体。

 

使用代码 

开始编码游戏。此类游戏的典型方法是使用 MiniMax 策略 http://en.wikipedia.org/wiki/Minimax 我将在此处复制该定义的摘要。

Minimax(有时也称为 minmax)是决策论、博弈论、统计学和哲学中使用的决策规则,用于最小化最坏情况(最大损失)场景下的可能损失。或者,也可以认为它是在最大化最小收益(maximin)。

Minimax 定理指出:

对于每个有两个参与者、零和、具有有限策略的博弈,存在一个值 V 和每个参与者的混合策略,使得:

  1. 在给定参与者 2 的策略的情况下,参与者 1 可能获得的最大回报是 V,并且
  2. 在给定参与者 1 的策略的情况下,参与者 2 可能获得的最大回报是 -V。

等价地,参与者 1 的策略保证了他无论参与者 2 的策略如何,都能获得 V 的回报,同样,参与者 2 也能保证自己获得 -V 的回报。Minimax 名称的由来是因为每个参与者都试图最小化另一个参与者可能获得的最大回报——由于该博弈是零和博弈,他也最小化了自己的最大损失(即最大化自己的最小回报)。

让我们在 Delphi 中为 3x3 棋盘上的围棋游戏实现这个算法(代码在 GitHub 上,也可以从本页下载)。

游戏实现类

类足够简单
    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);

Minimax 策略

下面的函数分析下一回合的游戏情况,并为每个可能的空单元格提供一个等级。

1. 游戏将继续,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;

游戏进行中

让我们测试一下游戏进行中的情况:(此时,我建议不要编译它,或者使用已编译的二进制文件进行尝试)。

  

您可以选择不编译解决方案,或者在此链接 下查看一些图像(图像 4_1 .. 4_6)

导出到 Mac

因此,我们能够在 Windows 上看到我们的游戏运行,但这是在 Windows 上。为了将项目移植到 Mac 的 Xcode,IDE 提供了一个名为 **dpr2xcode** 的特殊实用程序,需要进行如下配置:

  

  

  

执行后,将在项目中找到一个名为“Xcode”的新文件夹。它包含 Xcode 项目文件,您可以在 Mac 下打开它。

  

  

不幸的是,转换实用程序似乎编码不佳。

 

我花了 20 多分钟使用 SysInternals Filemon 来检测问题所在。

为 iOS 编译并部署到设备

第一次尝试和第一个问题:我在 Mac 下编译项目时失败了,因为 Mac 的 Xcode 中 TPoint 的实现不包含带有两个参数 x,y 的构造函数。真可惜!我不得不实现自己的 TXOPoint。这款售价 3k 美元的产品难道不能在我移植时警告我这些问题吗?好消息是:实现 TXOPoint 后,我在模拟器中运行项目没有问题。

  

  

  

要将应用程序部署到真实设备,您需要一个开发者证书(成本 > 100 美元/年)。

如果您手头有越狱的 iPhone,您可以使用标准的

7Zip 压缩器以 ipa 形式创建安装。您只需从另一个可用的程序中获取 ipa,并在 Payload 目录中更改项目文件夹。(不要忘记在 Xcode 项目选项中设置最低要求的 iOS 版本 - 如果您的手机不是 IOS5,这将为您节省时间)。

经过几个简单的步骤,我们在 iPhone 上安装了应用程序。

  

  

关注点

优点

我能够在无需学习另一种编程语言 Objective C 的情况下,就在手机上获得了一个可工作的 iOS 应用程序,这一点很好。考虑到除了 Angry Birds 之外还有许多其他应用程序,我相信 Firemonkey 解决方案的市场是存在的。

缺点

我认为技术尚不稳定。您可以下载 XE Patch 3 的试用版,而网站上却说 Patch4

已经发布。根据发行说明,Patch4 涉及 iOS 开发问题。我希望试用版能够更新以测试 Patch4 的改进。

此实验室的源代码可在 GitHub 上找到:https://github.com/Voronenko/GO-IOS-DELPHI

© . All rights reserved.