Prerequisite: Minimax Algorithm in Game Theory
As seen in the above article, each leaf node had a value associated with it. We had stored this value in an array. But in the real world when we are creating a program to play Tic-Tac-Toe, Chess, Backgammon, etc. we need to implement a function that calculates the value of the board depending on the placement of pieces on the board. This function is often known as Evaluation Function. It is sometimes also called a Heuristic Function.
The evaluation function is unique for every type of game. In this post, the evaluation function for the game Tic-Tac-Toe is discussed. The basic idea behind the evaluation function is to give a high value for a board if the maximizer turn or a low value for the board if the minimizer turn.
For this scenario let us consider X as the maximizer and O as the minimizer.
Let us build our evaluation function :
- If X wins on the board we give it a positive value of +10.

- If O wins on the board we give it a negative value of -10.

- If no one has won or the game results in a draw then we give a value of +0.

We could have chosen any positive/negative. For the sake of simplicity, we chose 10 and shall use lowercase ‘x’ and lowercase ‘o’ to represent the players and an underscore ‘_’ to represent a blank space on the board.
If we represent our board as a 3×3 2D character matrix, like char board[3][3]; then we have to check each row, each column, and the diagonals to check if either of the players has gotten 3 in a row.
C++
#include<stdio.h>
#include<algorithm>
using namespace std;
int evaluate( char b[3][3])
{
for ( int row = 0; row<3; row++)
{
if (b[row][0]==b[row][1] && b[row][1]==b[row][2])
{
if (b[row][0]== 'x' )
return +10;
else if (b[row][0]== 'o' )
return -10;
}
}
for ( int col = 0; col<3; col++)
{
if (b[0][col]==b[1][col] && b[1][col]==b[2][col])
{
if (b[0][col]== 'x' )
return +10;
else if (b[0][col]== 'o' )
return -10;
}
}
if (b[0][0]==b[1][1] && b[1][1]==b[2][2])
{
if (b[0][0]== 'x' )
return +10;
else if (b[0][0]== 'o' )
return -10;
}
if (b[0][2]==b[1][1] && b[1][1]==b[2][0])
{
if (b[0][2]== 'x' )
return +10;
else if (b[0][2]== 'o' )
return -10;
}
return 0;
}
int main()
{
char board[3][3] =
{
{ 'x' , '_' , 'o' },
{ '_' , 'x' , 'o' },
{ '_' , '_' , 'x' }
};
int value = evaluate(board);
printf ( "The value of this board is %d\n" , value);
return 0;
}
|
Java
class GFG
{
static int evaluate( char b[][])
{
for ( int row = 0 ; row < 3 ; row++)
{
if (b[row][ 0 ] == b[row][ 1 ] && b[row][ 1 ] == b[row][ 2 ])
{
if (b[row][ 0 ] == 'x' )
return + 10 ;
else if (b[row][ 0 ] == 'o' )
return - 10 ;
}
}
for ( int col = 0 ; col < 3 ; col++)
{
if (b[ 0 ][col] == b[ 1 ][col] && b[ 1 ][col] == b[ 2 ][col])
{
if (b[ 0 ][col] == 'x' )
return + 10 ;
else if (b[ 0 ][col] == 'o' )
return - 10 ;
}
}
if (b[ 0 ][ 0 ] == b[ 1 ][ 1 ] && b[ 1 ][ 1 ] == b[ 2 ][ 2 ])
{
if (b[ 0 ][ 0 ] == 'x' )
return + 10 ;
else if (b[ 0 ][ 0 ] == 'o' )
return - 10 ;
}
if (b[ 0 ][ 2 ] == b[ 1 ][ 1 ] && b[ 1 ][ 1 ] == b[ 2 ][ 0 ])
{
if (b[ 0 ][ 2 ] == 'x' )
return + 10 ;
else if (b[ 0 ][ 2 ] == 'o' )
return - 10 ;
}
return 0 ;
}
public static void main(String[] args)
{
char board[][] =
{
{ 'x' , '_' , 'o' },
{ '_' , 'x' , 'o' },
{ '_' , '_' , 'x' }
};
int value = evaluate(board);
System.out.printf( "The value of this board is %d\n" , value);
}
}
|
Python3
def evaluate(b):
for row in range ( 0 , 3 ):
if b[row][ 0 ] = = b[row][ 1 ] and b[row][ 1 ] = = b[row][ 2 ]:
if b[row][ 0 ] = = 'x' :
return 10
else if b[row][ 0 ] = = 'o' :
return - 10
for col in range ( 0 , 3 ):
if b[ 0 ][col] = = b[ 1 ][col] and b[ 1 ][col] = = b[ 2 ][col]:
if b[ 0 ][col] = = 'x' :
return 10
else if b[ 0 ][col] = = 'o' :
return - 10
if b[ 0 ][ 0 ] = = b[ 1 ][ 1 ] and b[ 1 ][ 1 ] = = b[ 2 ][ 2 ]:
if b[ 0 ][ 0 ] = = 'x' :
return 10
else if b[ 0 ][ 0 ] = = 'o' :
return - 10
if b[ 0 ][ 2 ] = = b[ 1 ][ 1 ] and b[ 1 ][ 1 ] = = b[ 2 ][ 0 ]:
if b[ 0 ][ 2 ] = = 'x' :
return 10
else if b[ 0 ][ 2 ] = = 'o' :
return - 10
return 0
if __name__ = = "__main__" :
board = [[ 'x' , '_' , 'o' ],
[ '_' , 'x' , 'o' ],
[ '_' , '_' , 'x' ]]
value = evaluate(board)
print ( "The value of this board is" , value)
|
C#
using System;
class GFG
{
static int evaluate( char [,]b)
{
for ( int row = 0; row < 3; row++)
{
if (b[row, 0] == b[row, 1] && b[row, 1] == b[row, 2])
{
if (b[row, 0] == 'x' )
return +10;
else if (b[row, 0] == 'o' )
return -10;
}
}
for ( int col = 0; col < 3; col++)
{
if (b[0, col] == b[1, col] && b[1, col] == b[2, col])
{
if (b[0, col] == 'x' )
return +10;
else if (b[0, col] == 'o' )
return -10;
}
}
if (b[0, 0] == b[1, 1] && b[1, 1] == b[2, 2])
{
if (b[0, 0] == 'x' )
return +10;
else if (b[0, 0] == 'o' )
return -10;
}
if (b[0, 2] == b[1, 1] && b[1, 1] == b[2, 0])
{
if (b[0, 2] == 'x' )
return +10;
else if (b[0, 2] == 'o' )
return -10;
}
return 0;
}
public static void Main(String[] args)
{
char [,]board =
{
{ 'x' , '_' , 'o' },
{ '_' , 'x' , 'o' },
{ '_' , '_' , 'x' }
};
int value = evaluate(board);
Console.Write( "The value of this board is {0}\n" , value);
}
}
|
Javascript
<script>
function evaluate(b)
{
for (let row = 0; row < 3; row++)
{
if (b[row][0] == b[row][1] && b[row][1] == b[row][2])
{
if (b[row][0] == 'x' )
return +10;
else if (b[row][0] == 'o' )
return -10;
}
}
for (let col = 0; col < 3; col++)
{
if (b[0][col] == b[1][col] && b[1][col] == b[2][col])
{
if (b[0][col] == 'x' )
return +10;
else if (b[0][col] == 'o' )
return -10;
}
}
if (b[0][0] == b[1][1] && b[1][1] == b[2][2])
{
if (b[0][0] == 'x' )
return +10;
else if (b[0][0] == 'o' )
return -10;
}
if (b[0][2] == b[1][1] && b[1][1] == b[2][0])
{
if (b[0][2] == 'x' )
return +10;
else if (b[0][2] == 'o' )
return -10;
}
return 0;
}
let board=[[ 'x' , '_' , 'o' ],
[ '_' , 'x' , 'o' ],
[ '_' , '_' , 'x' ]];
let value = evaluate(board);
document.write( "The value of this board is " + value+ "<br>" );
</script>
|
OutputThe value of this board is 10
Time Complexity: O(max(row,col))
Auxiliary Space: O(1)
The idea of this article is to understand how to write a simple evaluation function for the game Tic-Tac-Toe. In the next article we shall see how to combine this evaluation function with the minimax function. Stay Tuned.
This article is written by Akshay L. Aradhya. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above