A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://www.geeksforgeeks.org/dsa/minimax-algorithm-in-game-theory-set-5-zobrist-hashing/ below:

Minimax Algorithm in Game Theory | Set 5 (Zobrist Hashing)

// A Java program to illustrate Zobrist Hashing Algorithm

import java.util.*;

public class GFG {

  public static List<List<List<Integer>>> ZobristTable = new ArrayList<>();

  // mt19937 mt(01234567);
  public static void initialise() {
    for (int i = 0; i < 8; i++) {
      ZobristTable.add(new ArrayList<>());
      for (int j = 0; j < 8; j++) {
        ZobristTable.get(i).add(new ArrayList<>());
        for (int k = 0; k < 12; k++) {
          ZobristTable.get(i).get(j).add(0);
        }
      }
    }
  }
  // Generates a Random number from 0 to 2^64-1
  public static long randomLong() {
    long min = 0L;
    long max = (long) Math.pow(2, 64);
    Random rnd = new Random();
    return rnd.nextLong() * (max - min) + min;
  }

  // This function associates each piece with a number
  public static int indexOf(char piece) 
  {
    if (piece=='P')
      return 0;
    if (piece=='N')
      return 1;
    if (piece=='B')
      return 2;
    if (piece=='R')
      return 3;
    if (piece=='Q')
      return 4;
    if (piece=='K')
      return 5;
    if (piece=='p')
      return 6;
    if (piece=='n')
      return 7;
    if (piece=='b')
      return 8;
    if (piece=='r')
      return 9;
    if (piece=='q')
      return 10;
    if (piece=='k')
      return 11;
    else
      return -1;
  }

  // Initializes the table
  public static void initTable() {
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        for (int k = 0; k < 12; k++) {
          Random rnd = new Random();
          ZobristTable.get(i).get(j).set(k, (int) randomLong());
        }
      }
    }
  }

  // Computes the hash value of a given board
  public static int computeHash(List<List<Character>> board) {
    int h = 0;
    for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
        if (board.get(i).get(j) != '-') {
          int piece = indexOf(board.get(i).get(j));
          h ^= ZobristTable.get(i).get(j).get(piece);
        }
      }
    }
    return h;
  }

  public static void main(String[] args) {
    // Main Function
    // Uppercase letters are white pieces
    // Lowercase letters are black pieces
    List<List<Character>> board = new ArrayList<>();
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', 'K', '-', '-', '-', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', 'R', '-', '-', '-', '-', 'Q', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', 'K', '-', '-', '-', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', '-', '-', '-', '-', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', 'P', '-', '-', '-', '-', 'p', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', '-', '-', 'p', '-', '-')));
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', '-', '-', '-', '-', '-')));
    board.add(new ArrayList<>(Arrays.asList('p', '-', '-', '-', 'b', '-', '-', 'q')));
    board.add(new ArrayList<>(Arrays.asList('-', '-', '-', '-', 'n', '-', '-', 'k')));


    initialise();
    initTable();

    int hashValue = computeHash(board);
    System.out.println("The hash value is     : " + hashValue);

    // Move the white king to the left
    char piece = board.get(0).get(3);

    board.get(0).set(3, '-');

    hashValue ^= ZobristTable.get(0).get(3).get(indexOf(piece));

    board.get(0).set(2, piece);
    hashValue ^= ZobristTable.get(0).get(2).get(indexOf(piece));

    System.out.println("The new hash value is     : " + hashValue);

    // Undo the white king move
    piece = board.get(0).get(2);

    board.get(0).set(2, '-');

    hashValue ^= ZobristTable.get(0).get(2).get(indexOf(piece));

    board.get(0).set(3, piece);
    hashValue ^= ZobristTable.get(0).get(3).get(indexOf(piece));

    System.out.println("The new hash value is     : " + hashValue);
  }

}

// This code is contributed by Vaibhav
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

// C# program for the above approach
// A program to illustrate Zobrist Hashing Algorithm
// javascript code implementation


class HelloWorld {

    public static List<List<List<int>>> ZobristTable = new List<List<List<int>>>();

    // mt19937 mt(01234567);
    public static void initialise(){
            
        for(int i = 0; i < 8; i++){
            ZobristTable.Add(new List<List<int>>());
            for(int j = 0; j < 8; j++){
                ZobristTable[i].Add(new List<int>());
                for(int k = 0; k < 12; k++){
                    ZobristTable[i][j].Add(0);
                }
            }            
        }

    }
    // Generates a Random number from 0 to 2^64-1
    public static int randomInt() {
        int min = 0;
        int max = (int)Math.Pow(2, 64);
        Random rnd = new Random();
        return rnd.Next() * (max - min) + min;
    }

    // This function associates each piece with
    // a number
    public static int indexOf(char piece)
    {
        if (piece=='P')
            return 0;
        if (piece=='N')
            return 1;
        if (piece=='B')
            return 2;
        if (piece=='R')
            return 3;
        if (piece=='Q')
            return 4;
        if (piece=='K')
            return 5;
        if (piece=='p')
            return 6;
        if (piece=='n')
            return 7;
        if (piece=='b')
            return 8;
        if (piece=='r')
            return 9;
        if (piece=='q')
            return 10;
        if (piece=='k')
            return 11;
        else
            return -1;
    }

    // Initializes the table
    public static void initTable()
    {
        for (int i = 0; i<8; i++){
            for(int j = 0; j < 8; j++){
                for(int k = 0; k < 12; k++){
                    Random rnd = new Random();
                    ZobristTable[i][j][k] = rnd.Next();
                }
            }
        }

    }

    // Computes the hash value of a given board
    public static int computeHash(List<List<char>> board)
    {
        int h = 0;
        for (int i = 0; i<8; i++)
        {
            for (int j = 0; j<8; j++)
            {
                if (board[i][j]!='-')
                {
                    int piece = indexOf(board[i][j]);
                    h ^= ZobristTable[i][j][piece];
                }
            }
        }
        return h;
    }
 
    static void Main() {
        // Main Function
        // Uppercase letters are white pieces
        // Lowercase letters are black pieces
        List<List<char>> board = new List<List<char>>();
        board.Add(new List<char>(){'-', '-', '-', 'K', '-', '-', '-', '-'});
        board.Add(new List<char>(){'-', 'R', '-', '-', '-', '-', 'Q', '-'});
        board.Add(new List<char>(){'-', '-', '-', 'K', '-', '-', '-', '-'});
        board.Add(new List<char>(){'-', '-', '-', '-', '-', '-', '-', '-'});
        board.Add(new List<char>(){'-', 'P', '-', '-', '-', '-', 'p', '-'});
        board.Add(new List<char>(){'-', '-', '-', '-', '-', 'p', '-', '-', });
        board.Add(new List<char>(){'-', '-', '-', '-', '-', '-', '-', '-'});
        board.Add(new List<char>(){'p', '-', '-', '-', 'b', '-', '-', 'q'});
        board.Add(new List<char>(){'-', '-', '-', '-', 'n', '-', '-', 'k'});

        initialise();
        initTable();
        
        
        int hashValue = computeHash(board);
        Console.WriteLine("The hash value is     : " + hashValue);

        //Move the white king to the left
        char piece = board[0][3];

        board[0][3] = '-';

        hashValue ^= ZobristTable[0][3][indexOf(piece)];

        board[0][2] = piece;
        hashValue ^= ZobristTable[0][2][indexOf(piece)];


        Console.WriteLine("The new hash value is : " + hashValue);

        // Undo the white king move
        piece = board[0][2];

        board[0][2] = '-';
        hashValue ^= ZobristTable[0][2][indexOf(piece)];

        board[0][3] = piece;
        hashValue ^= ZobristTable[0][3][indexOf(piece)];

        Console.WriteLine("The old hash value is : " + hashValue);
    }
}

// The code is contributed by Nidhi goel. 

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4