这个 demo 的要求:
为了开发一个 IOS 应用程序 - 你不得不 选择特别的 项目类型“ Firemonkey HD
IOS 应用程序“。接下来 我们 看到一个典型的 Delphi项目 被建立:一个 看起来很I Phone的项目
是时候开始编写游戏代码了。这类游戏典型的解决方案都会使用 MiniMax 决策(http://en.wikipedia.org/wiki/Minimax)。 我将摘要复制了过来:
Minimax (有时候也叫 minmax)是一个在最坏情况下尽量减少损失的决策规则,常用于决策理论,游戏理论,统计学及哲学中。从另一方面来说,也可以想象成尽量增加小量的收获(maximin)。
对于两个人,总收益固定,策略有限的游戏,对每个玩家都存在一个变量V和一个混合策略,使得:
也可以说,无论玩家二的策略如何,玩家一的策略都可以保证他的回报为V。类似地,玩家二可以保证回报为 -V。极大极小定理的名称来源于,每个玩家都希望极大地使用对方获得极小的回报——既然总收益固定,他同时也极大地减少自己的损失(得到最大的收益)。
下面我们将用 Delphi 来在3*3的棋盘上实现Go游戏中的这个算法(代码托管在 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);
{ 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_2game.jpg 到4_7game.jpg)
现在我们可以测试游戏了,但是仅限于 windows 平台。为了将项目移植到 Mac平台上的XCode,我们需要使用配套的 dpr2xcode工具。需要先进行配置,然后导出,如下图所示:
导出完成之后,你可以看到一个新建的 'XCode' 目录,你可以在 Mac 上使用 XCode 直接打开这个项目。
不幸的是,这个工具并不是很稳定,容易出错:
我花了 20 多分钟,利用 SysInternals Filemon 工具来试图找出问题所在。
我在 Mac 上试图编译时遇到问题:XCode 中的 TPoint 实现并没有接收两个参数(x,y)的构造函数。我只好自己写了个实现 TXOPoint。Delphi XE2 花了我 3000 美元,难道不应该提醒一下移植过程中可能出现的问题吗?!还好,实现了 TXOPoint 之后,我很顺利地在模拟器中运行了这个游戏。
为了部署你的程序到真实的IOS机器上,你需要一个开发者证书(每年100美元以上)。
如果你的 iPhone 越狱了,那么你可以用 7zip 来创建可以安装的 ipa 包。你只需要使用另一个可以正常安装的 ipa 包,将你的项目内容替换到 Payload 目录就可以了。(当然,你需要在 XCode 项目选项里面设置运行所需的最低IOS版本)。
完成之后,我们就可以在 iPhone 上面看到我们的程序:
原文链接:http://www.codeproject.com/Articles/505996/Going-mobile-development-with-Delphi
译文链接:http://www.oschina.net/translate/going-mobile-development-with-delphi