Axiom

Axiom is a universal game engine developed by Greg Schmidt, that was originally based on the Zillions of Games engine. It is a system and language designed for game creation. Unlike ZoG, Axiom supports the ability for game developers to specify the AI and therefore it can be applied to non chess-like games such as territorial and connection games.

http://www.mindsports.nl/index.php/axiom
https://groups.yahoo.com/neo/groups/axiom-system/info
https://www.boardgamegeek.com/files/boardgame/all?username=gschmidt

The basic Axiom system is a DLL plug-in for Zillions, but there is also a game player that can be used instead of Zillions, and is free.

The extension language is a dialect of Forth and the Forth source code is provided. The DLL is programmed in C++ and the game player in C#, for Windows only (Windows Forms), but the source code has not been released.

Here is the source code for Tic-Tac-Toe, Forth version.

(
 *****************************************
 * Simple Game Example - Tic-Tac-Toe     *
 *                                       *
 * Uses the built-in Axiom search engine *
 *****************************************
)

$gameLog OFF

{board
	3 3	{grid}
board}

{players
	{player}	X
	{player}	O
players}


{turn-order
	{turn}		X
	{turn}		O
turn-order}

( Drops )

: DropMan
	empty? verify drop add-move
;


{moves ManDrops
	{move} DropMan
moves}


{pieces
	{piece}		man		{drops}  ManDrops
pieces}

(
**********
* Events *
**********
)

( 
  OnIsGameOver is always called from the perspective of the
  player who is about to make the next move.  axiom ensures
  that the current $movesList is correct for that player.
)

( Does the opponent occupy these 3 positions? )
: 3-in-a-row? ( pos1 pos2 pos3 -- ? )
	enemy-at? SWAP
	enemy-at? AND SWAP
	enemy-at? AND
;

( Win check - Did the player who just moved win? )
: opponent-win? ( -- ? )
	0 1 2 3-in-a-row?
	3 4 5 3-in-a-row? OR
	6 7 8 3-in-a-row? OR

	0 3 6 3-in-a-row? OR
	1 4 7 3-in-a-row? OR
	2 5 8 3-in-a-row? OR

	0 4 8 3-in-a-row? OR
	2 4 6 3-in-a-row? OR
;

( Determine if the game is over or not. )
: OnIsGameOver ( -- gameResult )
	#UnknownScore

	opponent-win?
	IF
		DROP #LossScore
	ELSE
		stalemate?
		IF
			DROP #DrawScore
		ENDIF
	ENDIF
;

This entry was posted in Language. Bookmark the permalink.

Leave a Reply

Your email address will not be published.