• Print
  • English

蝬脩批捆

  • 蝯蝜嗆
  • 餈瘣餃
  • 蝐唾
  • Z芰梯隞嗆其
  • 祆舐窗鞈
  • 蝬脩望
  • 蝎曇舐雯蝡其
  • 摮豢瑼獢
  • English Version

賊蝯

  • Macau ICT Awards
  • 瞉喲餉血飛隢憯
  • 憟扯魚蝺游萄
  • CEO隢憯

嗡蝯

  • 頠隞嗥蝛嗆
  • 鞈閮蝟餌絞撖抵批嗅(瞉喲)
  • 瞉喲菜啁銝剖
  • 脫券撟游
  • W函頧蝘颱葉敹
  • 瞉喲亙
  • 擐皜舫餉血飛
  • 鈭舐雯撠璆凋犖∪

雿輻刻

  • 餃

Powered By

AI-code 中使用 FreePascal 的方法

虛擬機械人足球比賽所採用的比賽系統 AI-Code 中, 目前只支援其本身的圖形程式介面及C++兩種編程方法。 對於部份沒有學 C 的學生可能會造成一定的困難。而本人經分析該系統後, 發覺要把它擴展使用其他語言, 實在亦不是難實, 以下是我將它擴展使用 FreePascal 的例子, 大家可以參考參考。

FreePascal 擴展

簡單來說, 做法是用 FreePascal 來建立一個 object 檔, 而主要的程式都在這 object 檔內, 這個情況下, 我們還是需要一個 C++ 的檔案, 該檔案唯一的作用只是呼叫 Pascal 的程式, 實際上只是個殼。以下是系統的改裝及 FreePascal 程式的編寫方法。

編譯系統的加工

為了使整個編譯過程可以較自動化, 我連 FreePascal 的編譯部份都加進原來的系統內, 這項工作只需要修改一個 bat 檔就可以, 這個檔是 AI-RCJ 4.0\Enternal Tools\pasoft\rcj\virtual\compile.bat

以下是經修改後的compile.bat檔。我同時亦將部份原為簡體的中文訊息改為繁體。 修改後的這個版本無論你是否使用 FreePascal 都可以使用它。

echo 正在編譯  %1\%2.c

set GCC=%cd%\..\..\gcc
set path=%path%;%GCC%\bin

rem 以下請換上你電腦內 ppc386 (或 fpc) 的執行路徑
set FPC=C:\pp\bin\win32\ppc386

set ROBOEXP_ROOT=%cd%\..\..\..\..
set SOURCE_PATH=%1
cd .\..
set AIRCJ=runtime
set SOURCE_FILE=%1\%2.c

rem ----------------------------------
rem 檢查是否有 pascal 的檔案住在
if not exist %1\%2.pas goto compliegcc
set SOURCE_FILE=%SOURCE_FILE% %2.o
copy /y %1\%2.pas .
FPC %2.pas
set errorl=%errorlevel%
del %2.pas

if not %errorl%==0 goto error
rem ----------------------------------

:compilegcc
g++ -shared -o %1\%2.dll -I"%ROBOEXP_ROOT%\Robots\RCJ\Include" -I%1 -I"%AIRCJ%\c\include" -I"%AIRCJ%\c\src\roboexp\virtual" %SOURCE_FILE% %AIRCJ%\c\src\roboexp\virtual\*.c "%AIRCJ%\c\lib\airobot_c.a"

if not %errorlevel%==0 goto error
echo 編譯成功
goto end

:error
echo 編譯過{出{錯誤  請檢查{式

:end
[Get Code]

編寫程式

編寫程式都份都要編寫兩個程式, 一個是空殼的 C++ 程式, 這個程式可以用機械人快車的系統來產生, 其內容如下。它唯一的作用就是用呼叫你用 Pascal 寫的程式, 其中 RobotMain 就是你在 Pascal 內所編寫的主函數, 當然你可以使用其他任何名字都可以。

extern  "C" void RobotMain();

int main(void)
{
  RobotMain();
}
[Get Code]

第二個程式就是 FreePascal 程式。這, 我以系統原有提供的 shooter 作為例子, 將它寫成 Pascal, 供大家參考。

unit shooter;

interface

procedure RobotMain; cdecl;

implementation

function GetAttack: longint; cdecl; external;
function GetCourtWidth: double; cdecl; external;
function GetCourtHeight: double; cdecl; external;
procedure SetKickBallTo(x, y: double); cdecl; external;

procedure Robot; cdecl;
var
  goalx, goaly, width, height: double;
  attack: longint;
begin
  attack := GetAttack;
  width := GetCourtWidth;
  height := GetCourtHeight;
  goaly := height/2;
  if (attack > 0) then
    goalx := width
  else
    goalx := 0;

  while (true) do begin
    SetKickBallTo(goalx, goaly);
  end;
end;

begin
end.
[Get Code]

編寫這個程式時要注意以下

  1. 這個程式應放在與你 C++ 機械人程式相同的那個目錄內, 並且檔案的主名要相同
  2. 所有外部程式及將會被 C++ 呼叫的子程式都要加上 cdecl。意思是使該子程式按照 C 的呼叫慣例執行
  3. 在interface 部份最主要是提供給 C++ 的呼叫子程式
  4. 程式中你不能使用任何 Pascal 的內建 function 和 procedure (如: read, write 等), 不過, 數學函數如 sin, cos 等可以照用!
  5. 在 implementation 的一堆 external 定義, 是機械人快車所提供的 C++ 函數, 這部份使 Pascal 可以使用 C 的函數,當然, 如果需要的話, 你亦可使用使它標準的 C++ 函數

編寫 Pascal 程式時你需要自行使用其他文字編輯器 (如: vim), 但編寫完之後你就可以用系統的機械人快車直接進行編譯工作。

  • Print
  • English
Page last modified on March 26, 2008, at 05:47 AM