Thread: Minimax game theory with mancala

1. Senior Member
Join Date
Nov 2008
Posts
105
Rep Power
0

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.
*/

/**
*
*/
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.
*/

/**
*
*/
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.
*/

/**
*
*/
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.
*/

/**
*
*/
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.
*/

/**
*
*/
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. Senior Member
Join Date
Nov 2008
Posts
105
Rep Power
0

3. 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

Posting Permissions

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