Results 1 to 3 of 3
  1. #1
    jigglywiggly is offline Senior Member
    Join Date
    Nov 2008
    Posts
    105
    Rep Power
    0

    Default Minimax game theory with mancala

    OOook, so Basically make mancala and create a computer ai... easy right? Not really D:

    Ok so Basically, I understand how the minimax game theory works, but I am just flabbergasted on how to get it to work with mancala, I am not even trying to worry about making the algorithim yet, just to populate the Nodes...


    Obviously I am not asking you to make this, but just how would I get started on making the ManCalaTreeNode and ManCalaTree? I mean I started with random stuff, except that was really just a binary tree...

    (The commented out stuff is the binary tree really)

    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author administrator
     */
    public class ManCalaTreeNode {
         ManCalaTreeNode parent;
        ManCalaTreeNode[] children;
        int depth;
        Board gameState;
    
    
    
        /* Object element;
         ManCalaTreeNode left, right;
    
        ManCalaTreeNode(Object obj) {
            element = obj;
            left = null;
            right = null;
        }
    
        public int numChildren() {
            int children=0;
            if(left !=null) {
                children=1+left.numChildren();
            }
    
            if(right!=null) {
                children=children+1+right.numChildren();
            }
                return children;
        }
    
         */
     
    }


    And then the Actualy ManCalaTree (same thing commented out stuff is just like a binary tree
    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author administrator
     */
    public class ManCalaTree {
    
        ManCalaTreeNode root;
       /* int count=0;
    
        public ManCalaTree() {
            count = 0;
            root=null;
        }
    
        public ManCalaTree(Object element) {
        count=1;
        root = new ManCalaTreeNode(element);
        }
    
    
    
        public ManCalaTree(Object element, ManCalaTree leftSubtree, ManCalaTree rightSubtree)
        {
        root= new ManCalaTreeNode(element);
        count = 1;
    
        if(leftSubtree!=null) {
            count = count + leftSubtree.size();
            root.left = leftSubtree.root;
    
        }
        else {
            root.left = null;
        }
    
        if(rightSubtree!=null)
        {
            count = count +rightSubtree.size();
            root.right=rightSubtree.root;
        }
        else {
            root.right=null;
        }
        }
    
    
    
    
    ManCalaTreeNode root;
    
    
        *
        */
    }


    Then for the actual game, well it works for two players, except for capturing, I don't want to add more complications for the AI yet.

    Board (you don't really need to see this if I'm honest):
    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author administrator
     */
    public class Board {
    
        Storage[] board = new Storage[14];
        Storage b = new Storage(4);
        int positionreal = 0;
        int positionreal2 = 0;
        int counter = 2;
        int counter2 = 0;
        boolean hmm = false;
        boolean hmm2 = false;
        int counter3 = 0;
        int temporary = 0;
        int temporary2= 0;
        boolean player1hasalot = false;
        boolean player2hasalot=false;
    
    
        public Board() {
            board[0] = new Storage(4);
            board[1] = new Storage(4);
            board[2] = new Storage(4);
            board[3] = new Storage(4);
            board[4] = new Storage(4);
            board[5] = new Storage(4);
            board[6] = new Storage(0);
            board[7] = new Storage(4);
            board[8] = new Storage(4);
            board[9] = new Storage(4);
            board[10] = new Storage(4);
            board[11] = new Storage(4);
            board[12] = new Storage(4);
            board[13] = new Storage(0);
    
    
        }
    
        public void movethem(String l) {
    
            positionreal = Integer.parseInt(l);
            
            if (counter % 2 == 0) {
    
    
    
                while (counter % 2 == 0) {
    
    
                /*    for(int forever=0; forever<board[positionreal].getAmount(); forever++) {
                        if(board[positionreal].getAmount()-forever==1) {
    
                        }
                    }
                */
                    if(positionreal+board[positionreal].getAmount() <6) {
                           if(board[positionreal+board[positionreal].getAmount()].getAmount()==0) {
    
                               if(positionreal+board[positionreal].getAmount()==0) {
                                   board[6].setAmount(board[12].getAmount());
                                   board[12].setAmount(0);
                               }
                                if(positionreal+board[positionreal].getAmount()==1) {
                                   board[6].setAmount(board[11].getAmount());
                                   board[11].setAmount(0);
                               }
                                if(positionreal+board[positionreal].getAmount()==2) {
                                   board[6].setAmount(board[10].getAmount());
                                   board[10].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()==3) {
                                   board[6].setAmount(board[9].getAmount());
                                   board[9].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()==4) {
                                   board[6].setAmount(board[9].getAmount());
                                   board[9].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()==5) {
                                   board[6].setAmount(board[8].getAmount());
                                   board[8].setAmount(0);
                               }
                            
    
                    }
    
    
    
                    }
    
    
                    if(positionreal+board[positionreal].getAmount() > 13 && positionreal+board[positionreal].getAmount() <20) {
                          if(board[positionreal+board[positionreal-13].getAmount()].getAmount()==0) {
    
                               if(positionreal+board[positionreal].getAmount()-13==0) {
                                   board[6].setAmount(board[12].getAmount());
                                   board[12].setAmount(0);
                               }
                                if(positionreal+board[positionreal].getAmount()-13==1) {
                                   board[6].setAmount(board[11].getAmount());
                                   board[11].setAmount(0);
                               }
                                if(positionreal+board[positionreal].getAmount()-13==2) {
                                   board[6].setAmount(board[10].getAmount());
                                   board[10].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()-13==3) {
                                   board[6].setAmount(board[9].getAmount());
                                   board[9].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()-13==4) {
                                   board[6].setAmount(board[9].getAmount());
                                   board[9].setAmount(0);
                               } if(positionreal+board[positionreal].getAmount()-13==5) {
                                   board[6].setAmount(board[8].getAmount());
                                   board[8].setAmount(0);
                               }
                    }
                 
    
    
                    if (positionreal > 5 || positionreal < 0) {
                        System.out.println("INVALID MOVE PLAYER 1");
                        System.exit(0);
                    }
    
    
                    if (positionreal + board[positionreal].getAmount() == 6 || positionreal + board[positionreal].getAmount() == 20) {
    
                        System.out.println("Player 1 go again");
    
    
                        GoAgainPlayer1(true);
                    
                    }
    
    
    
                    for (int totally = 1; totally <= board[positionreal].getAmount(); totally++) {
    
                        if (!(positionreal + board[positionreal].getAmount() == 6 || positionreal + board[positionreal].getAmount() == 20)) {
                            GoAgainPlayer1(false);
                            System.out.println("Why have i not gone here");
                         System.out.print("  "+ hmm);
    
                        }
                        if (positionreal + totally == 14) {
                            player1hasalot = true;
    
                        }
    
                        if (player1hasalot == true) {
                           
                            board[temporary].setAmount(board[temporary].getAmount() + 1);
                             temporary = temporary + 1;
    
    
                        }
    
                        if (player1hasalot == false) {
                            board[positionreal + totally].setAmount(board[positionreal + totally].getAmount() + 1);
                        }
    
    
                    }
    
    
    
    
    
                    temporary=0;
    
                    board[positionreal].setAmount(0);
    
    
    
                
                    drawBoard();
                    System.out.println("Ok I am gettign tired of this" + hmm);
                   if(hmm==false) {
                       counter++;
                   }
                    break;
                }
    
    
    
            }
            }else {
                System.out.println("Alright player 2 it's your lovely turn");
                  if (counter % 2 != 0) {
    
    
    
                while (counter % 2 != 0) {
    
    
    
    
    
                    if (positionreal <6 || positionreal >12 || positionreal==6) {
                        System.out.println("INVALID MOVE PLAYER 2");
                        System.exit(0);
                    }
    
    
                    if (positionreal + board[positionreal].getAmount() == 13 || positionreal + board[positionreal].getAmount() == 27) {
    
                        System.out.println("Player 2 go again");
    
    
                        GoAgainPlayer2(true);
                        System.out.println("IS IT WORKING!?!?" + hmm2);
    
                    }
    
    
    
                    for (int totally = 1; totally <= board[positionreal].getAmount(); totally++) {
    
                        if (!(positionreal + board[positionreal].getAmount() == 13 || positionreal + board[positionreal].getAmount() == 30)) {
                            System.out.println("I SHOULDNT HAVE GONE HERE");
                            GoAgainPlayer2(false);
                        
                        }
                        if (positionreal + totally == 14) {
                            player2hasalot = true;
    
                        }
    
                        if (player2hasalot == true) {
                            
                            board[temporary2].setAmount(board[temporary2].getAmount() + 1);
                            temporary2 = temporary2 + 1;
                        }
    
                        if (player2hasalot == false) {
                            board[positionreal + totally].setAmount(board[positionreal + totally].getAmount() + 1);
                        }
    
    
                    }
                    temporary2=0;
    
    
    
    
    
    
                    board[positionreal].setAmount(0);
    
    
    
                   
                    drawBoard();
                    System.out.println("Ok I am gettign tired of this" + hmm2);
                                        System.out.println("IS IT WORKING!?!?" + hmm2);
    
                   if(hmm2==false) {
                       counter++;
                   }
                    break;
                }
    
               
            }
    
        }
        }
        public void drawBoard() {
    
            System.out.println("");
            System.out.print(board[12].getAmount() + " ");
            System.out.print(board[11].getAmount() + " ");
            System.out.print(board[10].getAmount() + " ");
            System.out.print(board[9].getAmount() + " ");
            System.out.print(board[8].getAmount() + " ");
            System.out.print(board[7].getAmount() + " ");
            System.out.println("");
            System.out.print("|" + board[13].getAmount() + "|");
            System.out.print("      ");
            System.out.print("|" + board[6].getAmount() + "|");
            System.out.println("");
            System.out.print(board[0].getAmount() + " ");
            System.out.print(board[1].getAmount() + " ");
            System.out.print(board[2].getAmount() + " ");
            System.out.print(board[3].getAmount() + " ");
            System.out.print(board[4].getAmount() + " ");
            System.out.print(board[5].getAmount() + " ");
            System.out.println("");
    
    
    
    
    
    
    
    
    
    
    
    
        }
    
        public boolean isOver() {
           if(board[0].getAmount()==0 && board[1].getAmount()==0 && board[2].getAmount()==0 && board[3].getAmount()==0 && board[4].getAmount()==0 && board[5].getAmount()==0) {
                return true;
            }
           if(board[7].getAmount()==0 && board[8].getAmount()==0 && board[9].getAmount()==0 && board[10].getAmount()==0 && board[11].getAmount()==0 && board[12].getAmount()==0) { 
                   return true;
               }
           
            return false;
    
    
          
        }
        
    
        public boolean GoAgainPlayer1(boolean j) {
    
            if (j == true) {
                hmm = true;
                return j;
            } else if (j==false) {
                hmm=false;
            }
    
            return hmm;
        }
    
        public boolean GoAgainPlayer2(boolean j) {
    
            if (j == true) {
                hmm2 = true;
                return j;
            } else if (j==false) {
                hmm2=false;
            }
            return hmm2;
        }
    
        public boolean hmz2() {
            return hmm2;
        }
    
        public boolean hmz() {
            return hmm;
        }
    }
    Each hole in the game board, Storage
    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author administrator
     */
    public class Storage {
        int howmany = 4;
        public Storage(int number) {
            howmany=number;
        }
    
        public int getAmount() {
            return howmany;
        }
        public void setAmount(int amount) {
            howmany=amount;
        }
    
    
    }

    And The main:

    Java Code:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /**
     *
     * @author administrator
     */
    import java.util.Scanner;  // imports just the Scanner class from java.util
    
    public class CalaMain {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            int counter = 2;
            Board b = new Board();
            b.drawBoard();
    
            while (b.isOver() == false) {
                Scanner scan = new Scanner(System.in);
                if (counter % 2 == 0) {
    
                    System.out.println("Enter a position, player 1");
    
                    String scanned = scan.next();
    
    
    
                    b.movethem(scanned);
    
    
                    while (b.hmz()==true) {
                        System.out.println("Enter a position, again player 1");
                        System.out.println("HE SHOULD BE GOING AGAIN");
                        scanned = scan.next();
                        b.movethem(scanned);
                       // b.drawBoard();
                        
                    }
                    counter = counter + 1;
                    System.out.println(b.hmz());
                }
    
    
                if (counter % 2 != 0) {
    
                    System.out.println("Enter a position, player 2");
                    String scanned = scan.next();
                    b.movethem(scanned);
                    while(b.hmz2()==true) {
                        System.out.println("Enter a position, again player 2");
                        scanned = scan.next();
                        b.movethem(scanned);
                    }
                    counter = counter + 1;
                }
    
    
    
            }
    
        }
    }


    I really don't know how to get started out to just populate the trees and stuff. I mean I know how it works, and I see examples online about nim, but mancala is just like different :?

  2. #2
    jigglywiggly is offline Senior Member
    Join Date
    Nov 2008
    Posts
    105
    Rep Power
    0

    Default

    Anyone please?

  3. #3
    JosAH's Avatar
    JosAH is online now Moderator
    Join Date
    Sep 2008
    Location
    Voorschoten, the Netherlands
    Posts
    13,524
    Blog Entries
    7
    Rep Power
    20

    Default

    I don't see any particular problem with this game except for one thing: when a player ends up in his/her home position s/he is allowed to play again. To not disturb the levels in the tree you can define that the other player has to play an artificial move that doesn't do anything and is always a bad move.

    That way the opponents move are always at odd/even levels in the tree and the algorithm and evaluation of the leaf nodes work as always.

    kind regards,

    Jos

Similar Threads

  1. Replies: 2
    Last Post: 08-05-2010, 04:49 AM
  2. Minimax ai, oh lordy
    By jigglywiggly in forum New To Java
    Replies: 2
    Last Post: 12-11-2009, 08:24 PM
  3. Creating the evaluation function for Minimax
    By matzahboy in forum New To Java
    Replies: 7
    Last Post: 11-05-2009, 03:29 PM
  4. 2D strategy game or 2D war game
    By led1433 in forum Java 2D
    Replies: 5
    Last Post: 02-10-2009, 06:00 AM
  5. [SOLVED] Need help in theory of Java in netbeans
    By kirly in forum New To Java
    Replies: 3
    Last Post: 11-11-2008, 05:47 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •