蝬脩批捆賊蝯嗡蝯雿輻刻Powered By |
AI-code 中使用 FreePascal 的方法虛擬機械人足球比賽所採用的比賽系統 AI-Code 中, 目前只支援其本身的圖形程式介面及C++兩種編程方法。 對於部份沒有學 C 的學生可能會造成一定的困難。而本人經分析該系統後, 發覺要把它擴展使用其他語言, 實在亦不是難實, 以下是我將它擴展使用 FreePascal 的例子, 大家可以參考參考。 FreePascal 擴展簡單來說, 做法是用 FreePascal 來建立一個 object 檔, 而主要的程式都在這 object 檔內, 這個情況下, 我們還是需要一個 C++ 的檔案, 該檔案唯一的作用只是呼叫 Pascal 的程式, 實際上只是個殼。以下是系統的改裝及 FreePascal 程式的編寫方法。 編譯系統的加工為了使整個編譯過程可以較自動化, 我連 FreePascal 的編譯部份都加進原來的系統內,
這項工作只需要修改一個 bat 檔就可以, 這個檔是 以下是經修改後的 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 編寫程式編寫程式都份都要編寫兩個程式, 一個是空殼的 C++ 程式, 這個程式可以用機械人快車的系統來產生, 其內容如下。它唯一的作用就是用呼叫你用 Pascal 寫的程式, 其中 RobotMain 就是你在 Pascal 內所編寫的主函數, 當然你可以使用其他任何名字都可以。 extern "C" void RobotMain(); int main(void) { RobotMain(); } 第二個程式就是 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. 編寫這個程式時要注意以下
編寫 Pascal 程式時你需要自行使用其他文字編輯器 (如: vim), 但編寫完之後你就可以用系統的機械人快車直接進行編譯工作。 |