<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Kalahiprogramm</id>
	<title>Kalahiprogramm - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Kalahiprogramm"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Kalahiprogramm&amp;action=history"/>
	<updated>2026-10-28T12:40:10Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Kalahiprogramm&amp;diff=8103&amp;oldid=prev</id>
		<title>Tammet – 1. detsember 2007, kell 08:55</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Kalahiprogramm&amp;diff=8103&amp;oldid=prev"/>
		<updated>2007-12-01T08:55:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
import java.awt.*;&lt;br /&gt;
import java.awt.event.*;&lt;br /&gt;
import javax.swing.*;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 *&lt;br /&gt;
 * The program stub for playing Kalah against a computer. &lt;br /&gt;
 * &lt;br /&gt;
 * Computer performs only trivial moves: always the first available move. &lt;br /&gt;
 * &lt;br /&gt;
 * This program is intended to be used as a basis for building a sensibly playing&lt;br /&gt;
 * computer opponent: see the end part of the file.&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright Tanel Tammet, 2007&lt;br /&gt;
 * This code is in public domain: do whatever you like with this code.&lt;br /&gt;
 * &lt;br /&gt;
 * Uses some UI visual design ideas (colors, button settings) for checkers by D.Eck&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/* Some assumptions/observations:&lt;br /&gt;
&lt;br /&gt;
 The position in a game is stored in an integer array from 0 to 13, with stores being 6 and 13:&lt;br /&gt;
 &lt;br /&gt;
          12 11 10 9 8 7&lt;br /&gt;
        13               6&lt;br /&gt;
          0  1   2 3 4 5&lt;br /&gt;
          &lt;br /&gt;
 Several options are selected by the human player and then stored in the variables:&lt;br /&gt;
&lt;br /&gt;
  int nrInHouse : the initial nr of seeds in houses &lt;br /&gt;
  lowerSmaller : whether the position array is visualised as above, or vice versa&lt;br /&gt;
  humanLower : human has the lower array of houses&lt;br /&gt;
  humanStarts : human starts the game&lt;br /&gt;
  nextHuman : the next move is done by human, not computer&lt;br /&gt;
 &lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
public class Kalah  {&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
  // UI variables&lt;br /&gt;
  &lt;br /&gt;
  JFrame window;&lt;br /&gt;
  JPanel mainPanel;&lt;br /&gt;
  JPanel messagePanel;&lt;br /&gt;
  Board board; &lt;br /&gt;
  JPanel buttonPanel;   &lt;br /&gt;
  JButton newGameButton;&lt;br /&gt;
  JButton resignButton;&lt;br /&gt;
  JLabel message;&lt;br /&gt;
  JLabel bmessage1;&lt;br /&gt;
  JLabel bmessage2;&lt;br /&gt;
  JLabel bmessage3;  &lt;br /&gt;
  JComboBox nrCombo;  &lt;br /&gt;
  JComboBox humanCombo;&lt;br /&gt;
  JComboBox rowCombo;  &lt;br /&gt;
  JCheckBox houseNrsBox;&lt;br /&gt;
  &lt;br /&gt;
  // convenient global variables&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  int nrInHouse = 0;&lt;br /&gt;
  boolean lowerSmaller=true;&lt;br /&gt;
  boolean humanLower=true;&lt;br /&gt;
  boolean humanStarts=true;&lt;br /&gt;
  &lt;br /&gt;
  // ongoing game variables&lt;br /&gt;
  &lt;br /&gt;
  boolean gameInProgress=true;  &lt;br /&gt;
  boolean nextHuman=true;&lt;br /&gt;
  int[] position;&lt;br /&gt;
  String compMoveText;&lt;br /&gt;
  String humanMoveText;&lt;br /&gt;
  String lastMoveText;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  public static void main(String[] args) {    &lt;br /&gt;
      &lt;br /&gt;
    Kalah kalah = new Kalah(); // create an instance of Kalah, just to keep everything non-static&lt;br /&gt;
    kalah.initGame(); // create position and fill it                      &lt;br /&gt;
    kalah.makeUserInterface(); // make user interface components and show out&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void initGame() {&lt;br /&gt;
    int i;&lt;br /&gt;
  &lt;br /&gt;
    position = new int[14]; // create the position to be filled&lt;br /&gt;
    for(i=0;i&amp;lt;position.length;i++) position[i]=0; // initially fill position with zeros    &lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
  public void makeUserInterface() {   &lt;br /&gt;
    /* Create the window, then components and add them to the window */&lt;br /&gt;
    &lt;br /&gt;
    Color bgColor = new Color(0,150,0);&lt;br /&gt;
    &lt;br /&gt;
    window = new JFrame(&amp;quot;Kalah&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    mainPanel = new JPanel();        &lt;br /&gt;
    mainPanel.setLayout(new BorderLayout());    &lt;br /&gt;
    mainPanel.setPreferredSize( new Dimension(500,300) );      &lt;br /&gt;
    mainPanel.setBackground(bgColor);  // Dark green background.  &lt;br /&gt;
&lt;br /&gt;
    board = new Board();&lt;br /&gt;
    &lt;br /&gt;
    buttonPanel = new JPanel();      &lt;br /&gt;
    buttonPanel.setLayout(new FlowLayout());    &lt;br /&gt;
    buttonPanel.setBackground(bgColor);&lt;br /&gt;
    &lt;br /&gt;
    messagePanel = new JPanel();      &lt;br /&gt;
    messagePanel.setLayout(new FlowLayout());&lt;br /&gt;
    messagePanel.setBackground(bgColor);&lt;br /&gt;
               &lt;br /&gt;
    resignButton = new JButton(&amp;quot;Resign&amp;quot;);&lt;br /&gt;
    resignButton.addActionListener(board);&lt;br /&gt;
    newGameButton = new JButton(&amp;quot;New&amp;quot;);&lt;br /&gt;
    newGameButton.addActionListener(board);&lt;br /&gt;
    &lt;br /&gt;
    String[] numberInHouse = { &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot; };&lt;br /&gt;
    nrCombo= new JComboBox(numberInHouse); &lt;br /&gt;
    String[] humanStart = { &amp;quot;You&amp;quot;, &amp;quot;Comp&amp;quot; };&lt;br /&gt;
    humanCombo= new JComboBox(humanStart);&lt;br /&gt;
    String[] rowStart = { &amp;quot;Lower&amp;quot;, &amp;quot;Upper&amp;quot; };&lt;br /&gt;
    rowCombo= new JComboBox(rowStart);&lt;br /&gt;
        &lt;br /&gt;
    bmessage1 = new JLabel(&amp;quot;start on&amp;quot;,JLabel.CENTER);&lt;br /&gt;
    bmessage1.setFont(new  Font(&amp;quot;Serif&amp;quot;, Font.BOLD, 12));&lt;br /&gt;
    bmessage1.setForeground(Color.black);     &lt;br /&gt;
&lt;br /&gt;
    bmessage2 = new JLabel(&amp;quot;row with seeds&amp;quot;,JLabel.CENTER);&lt;br /&gt;
    bmessage2.setFont(new  Font(&amp;quot;Serif&amp;quot;, Font.BOLD, 12));&lt;br /&gt;
    bmessage2.setForeground(Color.black);       &lt;br /&gt;
          &lt;br /&gt;
    buttonPanel.add(humanCombo);&lt;br /&gt;
    buttonPanel.add(bmessage1);&lt;br /&gt;
    buttonPanel.add(rowCombo);&lt;br /&gt;
    buttonPanel.add(bmessage2);&lt;br /&gt;
    buttonPanel.add(nrCombo);&lt;br /&gt;
    &lt;br /&gt;
    buttonPanel.add(newGameButton);&lt;br /&gt;
    buttonPanel.add(resignButton);                       &lt;br /&gt;
    &lt;br /&gt;
    houseNrsBox = new JCheckBox(&amp;quot;show nrs&amp;quot;);    &lt;br /&gt;
    houseNrsBox.setSelected(false); &lt;br /&gt;
    houseNrsBox.setBackground(bgColor);    &lt;br /&gt;
    houseNrsBox.addActionListener(board);&lt;br /&gt;
    messagePanel.add(houseNrsBox); &lt;br /&gt;
&lt;br /&gt;
    message = new JLabel(&amp;quot; &amp;quot;,JLabel.CENTER);&lt;br /&gt;
    message.setFont(new  Font(&amp;quot;Serif&amp;quot;, Font.BOLD, 14));&lt;br /&gt;
    message.setForeground(Color.green);         &lt;br /&gt;
    message.setBounds(10,160,300,30);        &lt;br /&gt;
    messagePanel.add(message); &lt;br /&gt;
    &lt;br /&gt;
    mainPanel.add(BorderLayout.CENTER,board);&lt;br /&gt;
    mainPanel.add(BorderLayout.NORTH,messagePanel);&lt;br /&gt;
    mainPanel.add(BorderLayout.SOUTH,buttonPanel);&lt;br /&gt;
   &lt;br /&gt;
    // initialise UI&lt;br /&gt;
    &lt;br /&gt;
    board.gameOver(&amp;quot;Press &amp;#039;New&amp;#039; to start the game!&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
    // set window dimensions and properties&lt;br /&gt;
    &lt;br /&gt;
    window.setContentPane(mainPanel);&lt;br /&gt;
    window.pack();&lt;br /&gt;
    Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;
    window.setLocation( (screensize.width - window.getWidth())/2,&lt;br /&gt;
          (screensize.height - window.getHeight())/2 );&lt;br /&gt;
    window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );&lt;br /&gt;
    window.setResizable(false);  &lt;br /&gt;
    window.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
  /**&lt;br /&gt;
    *&lt;br /&gt;
    * This (internal) panel displays a kalah board and handles mouse- and keypresses&lt;br /&gt;
    *&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  class Board extends Canvas implements ActionListener, MouseListener {&lt;br /&gt;
                        &lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Constructor. Basic initialisation.     &lt;br /&gt;
       */&lt;br /&gt;
    &lt;br /&gt;
      Board() {&lt;br /&gt;
         Color bgColor = new Color(0,150,0);&lt;br /&gt;
         setBackground(bgColor);&lt;br /&gt;
         addMouseListener(this);                &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * Respond to user&amp;#039;s click on one of the two buttons.&lt;br /&gt;
       */&lt;br /&gt;
      public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
         Object src = evt.getSource();&lt;br /&gt;
         if (src == newGameButton)&lt;br /&gt;
            doNewGame();&lt;br /&gt;
         else if (src == resignButton)&lt;br /&gt;
            doResign();&lt;br /&gt;
         else if (src == houseNrsBox)&lt;br /&gt;
            repaint();&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * Start a new game&lt;br /&gt;
       */&lt;br /&gt;
      void doNewGame() {&lt;br /&gt;
        if (gameInProgress == true) {&lt;br /&gt;
          // This should not be possible, but it doens&amp;#039;t hurt to check.&lt;br /&gt;
          message.setText(&amp;quot;Finish the current game first!&amp;quot;);&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
                 &lt;br /&gt;
        message.setText(&amp;quot;Make your move.&amp;quot;);&lt;br /&gt;
        gameInProgress = true;&lt;br /&gt;
        &lt;br /&gt;
        nrInHouse=3+nrCombo.getSelectedIndex();&lt;br /&gt;
        if (humanCombo.getSelectedIndex()==0) humanStarts=true;&lt;br /&gt;
        else humanStarts=false;&lt;br /&gt;
        if (rowCombo.getSelectedIndex()==0) { &lt;br /&gt;
          humanLower=humanStarts;&lt;br /&gt;
        } else { &lt;br /&gt;
          humanLower=!humanStarts;            &lt;br /&gt;
        }  &lt;br /&gt;
        &lt;br /&gt;
        newGameButton.setEnabled(false);&lt;br /&gt;
        nrCombo.setEnabled(false);  &lt;br /&gt;
        humanCombo.setEnabled(false);&lt;br /&gt;
        rowCombo.setEnabled(false);&lt;br /&gt;
        resignButton.setEnabled(true);&lt;br /&gt;
        &lt;br /&gt;
        lastMoveText=null;&lt;br /&gt;
        &lt;br /&gt;
        initPosition(nrInHouse); &lt;br /&gt;
        if (houseNrsBox.isSelected()) System.out.println(&amp;quot;------&amp;quot;);  &lt;br /&gt;
        if (houseNrsBox.isSelected()) printPosition();  &lt;br /&gt;
          &lt;br /&gt;
        if (humanStarts) {&lt;br /&gt;
          nextHuman=true; &lt;br /&gt;
        } else {&lt;br /&gt;
          nextHuman=false;&lt;br /&gt;
          doMachineMove();&lt;br /&gt;
        }          &lt;br /&gt;
        repaint();&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      /*&lt;br /&gt;
       * Initialise position array to correct nr &lt;br /&gt;
       *&lt;br /&gt;
      */&lt;br /&gt;
&lt;br /&gt;
      void initPosition(int n) {&lt;br /&gt;
        int i;&lt;br /&gt;
        &lt;br /&gt;
        position[6]=0;&lt;br /&gt;
        position[13]=0;&lt;br /&gt;
        for(i=0;i&amp;lt;6;i++) position[i]=n;&lt;br /&gt;
        for(i=7;i&amp;lt;13;i++) position[i]=n;              &lt;br /&gt;
      }        &lt;br /&gt;
       &lt;br /&gt;
       &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * Human player resigns.  Game ends.  Machine wins.&lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      void doResign() {&lt;br /&gt;
         if (gameInProgress == false) {&lt;br /&gt;
            message.setText(&amp;quot;There is no game in progress!&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
         }         &lt;br /&gt;
         gameOver(&amp;quot;You resign. Computer wins.&amp;quot;);        &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * The game ends. &lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      void gameOver(String str) {&lt;br /&gt;
        message.setText(str);&lt;br /&gt;
        newGameButton.setEnabled(true);&lt;br /&gt;
        nrCombo.setEnabled(true);  &lt;br /&gt;
        humanCombo.setEnabled(true);&lt;br /&gt;
        rowCombo.setEnabled(true);&lt;br /&gt;
        resignButton.setEnabled(false);&lt;br /&gt;
        gameInProgress = false;&lt;br /&gt;
        if (houseNrsBox.isSelected()) printPosition();&lt;br /&gt;
        if (houseNrsBox.isSelected()) System.out.println(str);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * This is called by mousePressed() when a player clicks on the&lt;br /&gt;
       * house. &lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      void doClickHouse(int n) {&lt;br /&gt;
                           &lt;br /&gt;
         //message.setText(&amp;quot;Click the house you want to move from.&amp;quot;);&lt;br /&gt;
         //System.out.println(n);&lt;br /&gt;
         if (position[n]&amp;gt;0) doHumanMove(n);&lt;br /&gt;
         else message.setText(&amp;quot;You cannot move from the empty house!&amp;quot;);  &lt;br /&gt;
         repaint();&lt;br /&gt;
         &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * This does all the position drawing&lt;br /&gt;
       * &lt;br /&gt;
       */&lt;br /&gt;
     &lt;br /&gt;
      public void paint(Graphics g) {&lt;br /&gt;
         &lt;br /&gt;
        int x,n;&lt;br /&gt;
        Color inside = new Color(255,255,255);&lt;br /&gt;
        Color bground = new Color(210,210,210);&lt;br /&gt;
        Color numColor = new Color(20,20,20);&lt;br /&gt;
        Font numFont = new Font(&amp;quot;SansSerif&amp;quot;, Font.BOLD, 20);&lt;br /&gt;
        Font numSmallFont = new Font(&amp;quot;SansSerif&amp;quot;, Font.BOLD, 16);&lt;br /&gt;
        Font numMicroFont = new Font(&amp;quot;SansSerif&amp;quot;, Font.PLAIN, 10);&lt;br /&gt;
        &lt;br /&gt;
        // create empty board&lt;br /&gt;
        &lt;br /&gt;
        g.setColor(bground);               &lt;br /&gt;
        g.fillRoundRect(30,50,440,100,10,10);&lt;br /&gt;
        &lt;br /&gt;
        g.setColor(inside); &lt;br /&gt;
        g.fillOval(47,75,50,50);&lt;br /&gt;
        g.fillOval(400,75,50,50);&lt;br /&gt;
        for(x=117,n=0; n&amp;lt;6; n++, x=x+46) {&lt;br /&gt;
          g.fillOval(x,59,35,35);&lt;br /&gt;
          g.fillOval(x,105,35,35);&lt;br /&gt;
        }  &lt;br /&gt;
        &lt;br /&gt;
        // fill board with numbers, show house nrs if required&lt;br /&gt;
        &lt;br /&gt;
        g.setColor(numColor);&lt;br /&gt;
        g.setFont(numFont);&lt;br /&gt;
        if (lowerSmaller) {&lt;br /&gt;
          g.drawString(nrToStr(position[13]),62,107);&lt;br /&gt;
          g.drawString(nrToStr(position[6]),415,107);                  &lt;br /&gt;
          for(x=129,n=0; n&amp;lt;6; n++, x=x+46) {&lt;br /&gt;
            g.setFont(numSmallFont);&lt;br /&gt;
            g.drawString(nrToStr(position[n]),x,129); &lt;br /&gt;
            g.setFont(numMicroFont);&lt;br /&gt;
            if (houseNrsBox.isSelected()) g.drawString(n+&amp;quot;&amp;quot;,x,150);&lt;br /&gt;
          }  &lt;br /&gt;
          for(x=129,n=12; n&amp;gt;6; n--, x=x+46) {&lt;br /&gt;
            g.setFont(numSmallFont);&lt;br /&gt;
            g.drawString(nrToStr(position[n]),x,83);&lt;br /&gt;
            g.setFont(numMicroFont);&lt;br /&gt;
            if (houseNrsBox.isSelected()) g.drawString(n+&amp;quot;&amp;quot;,x,60);            &lt;br /&gt;
          }            &lt;br /&gt;
        } else {&lt;br /&gt;
          g.drawString(nrToStr(position[6]),62,107);&lt;br /&gt;
          g.drawString(nrToStr(position[13]),415,107);        &lt;br /&gt;
          g.setFont(numSmallFont);&lt;br /&gt;
          for(x=129,n=7; n&amp;lt;13; n++, x=x+46) {&lt;br /&gt;
            g.setFont(numSmallFont);&lt;br /&gt;
            g.drawString(nrToStr(position[n]),x,129);&lt;br /&gt;
            g.setFont(numMicroFont);&lt;br /&gt;
            if (houseNrsBox.isSelected()) g.drawString(n+&amp;quot;&amp;quot;,x,150);            &lt;br /&gt;
          }  &lt;br /&gt;
          for(x=129,n=5; n&amp;gt;=0; n--, x=x+46) {&lt;br /&gt;
            g.setFont(numSmallFont);&lt;br /&gt;
            g.drawString(nrToStr(position[n]),x,83); &lt;br /&gt;
            g.setFont(numMicroFont);&lt;br /&gt;
            if (houseNrsBox.isSelected()) g.drawString(n+&amp;quot;&amp;quot;,x,60); &lt;br /&gt;
          }&lt;br /&gt;
        } &lt;br /&gt;
        &lt;br /&gt;
        //System.out.println(&amp;quot;gameInProgress: &amp;quot;+gameInProgress+&amp;quot; nextHuman:&amp;quot;+nextHuman+&amp;quot; lastMoveText:&amp;quot;+lastMoveText ); &lt;br /&gt;
        &lt;br /&gt;
        if (gameInProgress &amp;amp;&amp;amp; nextHuman &amp;amp;&amp;amp;  lastMoveText!=null) {           &lt;br /&gt;
          if (houseNrsBox.isSelected())&lt;br /&gt;
            message.setText(&amp;quot;Last move was &amp;quot;+lastMoveText);&lt;br /&gt;
          else&lt;br /&gt;
            message.setText(&amp;quot;Make your move&amp;quot;); &lt;br /&gt;
        } else if (gameInProgress &amp;amp;&amp;amp; !nextHuman) {             &lt;br /&gt;
          message.setText(&amp;quot;Computer thinking ...&amp;quot;);          &lt;br /&gt;
          message.revalidate();  &lt;br /&gt;
        }        &lt;br /&gt;
        &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * Small helper fun used by paint()&lt;br /&gt;
       * &lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      public String nrToStr(int n) {&lt;br /&gt;
        if (n&amp;lt;1) return &amp;quot;&amp;quot;;&lt;br /&gt;
        else return n+&amp;quot;&amp;quot;;          &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /*&lt;br /&gt;
       * Position printing on console&lt;br /&gt;
       *&lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      void printPosition() {&lt;br /&gt;
        int i;&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Position: &amp;quot;);&lt;br /&gt;
        for(i=13;i&amp;gt;6;i--) {&lt;br /&gt;
          System.out.print(nrToPrintStr(position[i])+&amp;quot; &amp;quot;);&lt;br /&gt;
        }          &lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.print(&amp;quot;   &amp;quot;);&lt;br /&gt;
        for(i=0;i&amp;lt;7;i++) {&lt;br /&gt;
          System.out.print(nrToPrintStr(position[i])+&amp;quot; &amp;quot;);&lt;br /&gt;
        }  &lt;br /&gt;
        System.out.println();&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Small helper fun used by printPosition() &lt;br /&gt;
       * &lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      public String nrToPrintStr(int n) {&lt;br /&gt;
        if (n&amp;lt;10) return &amp;quot; &amp;quot;+n;&lt;br /&gt;
        else return &amp;quot;&amp;quot;+n;          &lt;br /&gt;
      }       &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * Respond to a user click on the board.  If no game is in progress, show &lt;br /&gt;
       * an error message.  Otherwise, find the house that the user &lt;br /&gt;
       * clicked and call doClickHouse(n) to handle it.&lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /* position array visualisation:&lt;br /&gt;
      &lt;br /&gt;
        lowerSmaller:&lt;br /&gt;
          12 11 10 9 8 7&lt;br /&gt;
        13               6&lt;br /&gt;
          0  1   2 3 4 5&lt;br /&gt;
&lt;br /&gt;
        !lowerSmaller:&lt;br /&gt;
          5  4  3  2  1   0&lt;br /&gt;
        6                    13 &lt;br /&gt;
          7  8  9  10 11 12 &lt;br /&gt;
      &lt;br /&gt;
        */&lt;br /&gt;
        &lt;br /&gt;
      public void mousePressed(MouseEvent evt) {&lt;br /&gt;
        if (gameInProgress == false)&lt;br /&gt;
          message.setText(&amp;quot;Click on the &amp;#039;New&amp;#039; button to start a new game.&amp;quot;);&lt;br /&gt;
        else if (!nextHuman) {&lt;br /&gt;
          message.setText(&amp;quot;Computer&amp;#039;s turn!&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          int col = (evt.getX() - 113) / 46;            &lt;br /&gt;
          //System.out.println(evt.getX()+&amp;quot;|&amp;quot;+evt.getY()+&amp;quot;|&amp;quot;+col);&lt;br /&gt;
          if (humanLower &amp;amp;&amp;amp; col&amp;gt;=0 &amp;amp;&amp;amp; col&amp;lt;6 &amp;amp;&amp;amp; evt.getY()&amp;gt;100 &amp;amp;&amp;amp; evt.getY()&amp;lt;150) {&lt;br /&gt;
            if (lowerSmaller) { doClickHouse(col); }&lt;br /&gt;
            else { doClickHouse(col+7); }&lt;br /&gt;
          } else if (!humanLower &amp;amp;&amp;amp; col&amp;gt;=0 &amp;amp;&amp;amp; col&amp;lt;6 &amp;amp;&amp;amp; evt.getY()&amp;gt;50 &amp;amp;&amp;amp; evt.getY()&amp;lt;100) {&lt;br /&gt;
            if (lowerSmaller) { doClickHouse(12-col); }&lt;br /&gt;
            else { doClickHouse(5-col); }&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
       * No actions registered&lt;br /&gt;
       * &lt;br /&gt;
       */&lt;br /&gt;
      &lt;br /&gt;
      public void mouseReleased(MouseEvent evt) { }&lt;br /&gt;
      public void mouseClicked(MouseEvent evt) { }&lt;br /&gt;
      public void mouseEntered(MouseEvent evt) { }&lt;br /&gt;
      public void mouseExited(MouseEvent evt) { }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
/* ***************************************************&lt;br /&gt;
 *&lt;br /&gt;
 *      Making human and machine moves: improve here!!&lt;br /&gt;
 *     &lt;br /&gt;
 *      calcMove() below is the actual function to be improved    &lt;br /&gt;
 *&lt;br /&gt;
 *****************************************************/&lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
        * doHumanMove performs the move of the user (mouse click) &lt;br /&gt;
        * and then calls doMachineMove() which computes machine move&lt;br /&gt;
        *&lt;br /&gt;
        * NB! In case the next move should also be done by human,  &lt;br /&gt;
        * doMachineMove() is not called: instead the human should click again&lt;br /&gt;
        *&lt;br /&gt;
        */   &lt;br /&gt;
     &lt;br /&gt;
      void doHumanMove(int n) {&lt;br /&gt;
        boolean onemore;&lt;br /&gt;
        int res;&lt;br /&gt;
        &lt;br /&gt;
        if (!gameInProgress) return;&lt;br /&gt;
          &lt;br /&gt;
        humanMoveText=n+&amp;quot;(&amp;quot;+position[n]+&amp;quot;)&amp;quot;;&lt;br /&gt;
        lastMoveText=humanMoveText;&lt;br /&gt;
        &lt;br /&gt;
        onemore=doMove(n);        &lt;br /&gt;
        if (houseNrsBox.isSelected()) System.out.println(&amp;quot;Human: &amp;quot;+humanMoveText); &lt;br /&gt;
        if (houseNrsBox.isSelected()) printPosition();   &lt;br /&gt;
        if (!onemore) nextHuman=false;  &lt;br /&gt;
        else nextHuman=true;  &lt;br /&gt;
        if (checkEnd()) {&lt;br /&gt;
          res=humanResult();&lt;br /&gt;
          if (res==0) gameOver(&amp;quot;Game ended with a draw&amp;quot;);&lt;br /&gt;
          else if (res&amp;gt;0) gameOver(&amp;quot;You won the game with &amp;quot;+res+&amp;quot; points!&amp;quot;);  &lt;br /&gt;
          else {&lt;br /&gt;
            gameOver(&amp;quot;I won the game with &amp;quot;+(0-res)+&amp;quot; points!&amp;quot;);  &lt;br /&gt;
          }            &lt;br /&gt;
        }                &lt;br /&gt;
        repaint();&lt;br /&gt;
        if (!nextHuman) doMachineMove(); // here the machine calculates its move!        &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
        * doMachineMove() performs machine move. It first checks the position,&lt;br /&gt;
        * then calls the calcMove() which actually calculates the machine move, then performs the move, &lt;br /&gt;
        * does printout etc.&lt;br /&gt;
        *&lt;br /&gt;
        * NB! If the machine can (should) make several moves in a row, then all these moves&lt;br /&gt;
        * are performed separately inside a loop here. calcMove() will always just give one single move,&lt;br /&gt;
        * not a sequence of moves!&lt;br /&gt;
        *       &lt;br /&gt;
        */      &lt;br /&gt;
      &lt;br /&gt;
      void doMachineMove() {&lt;br /&gt;
        boolean onemore=true; &lt;br /&gt;
        int i;&lt;br /&gt;
        int res;&lt;br /&gt;
        int n=0;&lt;br /&gt;
        &lt;br /&gt;
        if (!gameInProgress) return;&lt;br /&gt;
             &lt;br /&gt;
        // check if game already ended: just in case&lt;br /&gt;
        &lt;br /&gt;
        if (checkEnd()) {&lt;br /&gt;
            res=humanResult();&lt;br /&gt;
            if (res==0) { gameOver(&amp;quot;Game ended with a draw&amp;quot;); onemore=false; }&lt;br /&gt;
            else if (res&amp;gt;0) { gameOver(&amp;quot;You won the game with &amp;quot;+res+&amp;quot; points!&amp;quot;); onemore=false; } &lt;br /&gt;
            else {&lt;br /&gt;
              gameOver(&amp;quot;I won the game with &amp;quot;+(0-res)+&amp;quot; points!&amp;quot;);  &lt;br /&gt;
              onemore=false;  &lt;br /&gt;
            }            &lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        // Show that computer is thinking&lt;br /&gt;
        &lt;br /&gt;
        if (houseNrsBox.isSelected()) System.out.println(&amp;quot;Computer thinking ...&amp;quot;);&lt;br /&gt;
        nextHuman=false;&lt;br /&gt;
        message.setText(&amp;quot;Computer thinking ...&amp;quot;);&lt;br /&gt;
        message.revalidate();&lt;br /&gt;
        repaint();                       &lt;br /&gt;
        &lt;br /&gt;
        // calculate one or more moves: currently just the first legal move is taken&lt;br /&gt;
                &lt;br /&gt;
        compMoveText=null;        &lt;br /&gt;
        while(onemore) {          &lt;br /&gt;
          &lt;br /&gt;
          // find a possible move (one must be available, otherwise game should have ended)&lt;br /&gt;
          n = calcMove();&lt;br /&gt;
              &lt;br /&gt;
          if (compMoveText==null) compMoveText=&amp;quot;&amp;quot;;&lt;br /&gt;
          else compMoveText=compMoveText+&amp;quot;-&amp;quot;;           &lt;br /&gt;
          compMoveText=compMoveText+n+&amp;quot;(&amp;quot;+position[n]+&amp;quot;)&amp;quot;;&lt;br /&gt;
          &lt;br /&gt;
          // actually do the move&lt;br /&gt;
          &lt;br /&gt;
          onemore=doMove(n);                   &lt;br /&gt;
          if (checkEnd()) {&lt;br /&gt;
            res=humanResult();&lt;br /&gt;
            if (res==0) { gameOver(&amp;quot;Game ended with a draw&amp;quot;); onemore=false; }&lt;br /&gt;
            else if (res&amp;gt;0) { gameOver(&amp;quot;You won the game with &amp;quot;+res+&amp;quot; points!&amp;quot;); onemore=false; } &lt;br /&gt;
            else {&lt;br /&gt;
              gameOver(&amp;quot;I won the game with &amp;quot;+(0-res)+&amp;quot; points!&amp;quot;);  &lt;br /&gt;
              onemore=false;  &lt;br /&gt;
            }            &lt;br /&gt;
          }    &lt;br /&gt;
        }  &lt;br /&gt;
        &lt;br /&gt;
        // print and show the move&lt;br /&gt;
        &lt;br /&gt;
        nextHuman=true;&lt;br /&gt;
        lastMoveText=compMoveText;                    &lt;br /&gt;
        if (houseNrsBox.isSelected()) System.out.println(&amp;quot;Comp : &amp;quot;+compMoveText);         &lt;br /&gt;
        if (houseNrsBox.isSelected()) printPosition();  &lt;br /&gt;
        repaint();         &lt;br /&gt;
        // after machine calcs move, this is simply painted, after that system waits&lt;br /&gt;
        // for human to make a move by clicking&lt;br /&gt;
      } &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /** =======================================&lt;br /&gt;
        * This is the function you have to improve: currently it&lt;br /&gt;
        * just takes the first legal move. &lt;br /&gt;
        *&lt;br /&gt;
        * NB! calcMove() should give a single move, not a sequence of moves: &lt;br /&gt;
        * if new machine moves should be performed immediately after calcMove();&lt;br /&gt;
        * then these are taken care of by doMachineMove(), which will repeatedly call&lt;br /&gt;
        * calcMove() and then perform the move found.&lt;br /&gt;
        * =========================================&lt;br /&gt;
        */    &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      int calcMove() {&lt;br /&gt;
        int i;&lt;br /&gt;
        int n=-1; // if no moves available, returns -1&lt;br /&gt;
        &lt;br /&gt;
        // do a fake thinking pause: DO NOT DO THIS FOR REAL COMPUTATION!&lt;br /&gt;
        &lt;br /&gt;
        try {         &lt;br /&gt;
          Thread.sleep(500);&lt;br /&gt;
        } catch (InterruptedException e) {&lt;br /&gt;
        }  &lt;br /&gt;
        &lt;br /&gt;
        // find a possible move for the machine, assuming game has not ended&lt;br /&gt;
          &lt;br /&gt;
        if (humanLower) {&lt;br /&gt;
          for(i=7;i&amp;lt;13;i++) {&lt;br /&gt;
            if (position[i]!=0) { n=i; break; } &lt;br /&gt;
          }  &lt;br /&gt;
        } else {&lt;br /&gt;
          for(i=0;i&amp;lt;6;i++) {&lt;br /&gt;
            if (position[i]!=0) { n=i; break; } &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        return n;        &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
        * This is a general move-performer for both sides (human and comp)               &lt;br /&gt;
        *&lt;br /&gt;
        */    &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      boolean doMove(int n) {       &lt;br /&gt;
        int i,s,j,d; &lt;br /&gt;
        int oppStore;&lt;br /&gt;
        &lt;br /&gt;
        //System.out.println(&amp;quot;called doMove &amp;quot;+n); &lt;br /&gt;
        s=position[n];&lt;br /&gt;
        if (s&amp;lt;1) {&lt;br /&gt;
          message.setText(&amp;quot;Cannot move from empty house!&amp;quot;);&lt;br /&gt;
          repaint();&lt;br /&gt;
          return false;&lt;br /&gt;
        }  &lt;br /&gt;
        if (n&amp;lt;6) oppStore=13; // lower row player has store 6 and oppStore 13&lt;br /&gt;
        else oppStore=6; // upper row player vice versa&lt;br /&gt;
        //System.out.println(&amp;quot;oppStore: &amp;quot;+oppStore);  &lt;br /&gt;
        // do the normal move: seed following houses, incl own store  &lt;br /&gt;
        position[n]=0;&lt;br /&gt;
        for(i=n+1; s&amp;gt;0; i++) {&lt;br /&gt;
          if (i&amp;gt;13) i=0;&lt;br /&gt;
          if (i!=oppStore) {               &lt;br /&gt;
            position[i]++;           &lt;br /&gt;
            s--;&lt;br /&gt;
          }  &lt;br /&gt;
        }&lt;br /&gt;
        i--; // now i is the house where the last seed was dropped&lt;br /&gt;
        //for(d=0;d&amp;lt;14;d++) System.out.print(d+&amp;quot;:&amp;quot;+position[d]+&amp;quot; &amp;quot;);&lt;br /&gt;
        if (i==6 || i==13) { // cannot land in oppStore anyway&lt;br /&gt;
          // landed in store: new move!&lt;br /&gt;
          //System.out.println(&amp;quot;new move!&amp;quot;); &lt;br /&gt;
          return true;          &lt;br /&gt;
        } else {&lt;br /&gt;
          // normal case: no more moves&lt;br /&gt;
          //System.out.println(&amp;quot;normal case, no more moves&amp;quot;);  &lt;br /&gt;
          // check for capture!!&lt;br /&gt;
          if (position[i]==1) {&lt;br /&gt;
            // last seed landed in an empty house&lt;br /&gt;
            if (oppStore==13 &amp;amp;&amp;amp; i&amp;lt;6) {&lt;br /&gt;
              // ... of the player, who has lower row, capture!&lt;br /&gt;
              //System.out.println(&amp;quot;capture by lower row&amp;quot;); &lt;br /&gt;
              position[i]=0; &lt;br /&gt;
              j=12-i; // opposite house               &lt;br /&gt;
              position[6]=position[6]+1+position[j];&lt;br /&gt;
              position[j]=0;&lt;br /&gt;
            }  else if (oppStore==6 &amp;amp;&amp;amp; i&amp;gt;6) {&lt;br /&gt;
              // ... of the player, who has upper row, capture!&lt;br /&gt;
              //System.out.println(&amp;quot;capture by upper row&amp;quot;); &lt;br /&gt;
              position[i]=0; &lt;br /&gt;
              j=12-i; // opposite house               &lt;br /&gt;
              position[13]=position[13]+1+position[j];&lt;br /&gt;
              position[j]=0;&lt;br /&gt;
            }              &lt;br /&gt;
          } &lt;br /&gt;
          // we did not land in a store, no more moves&lt;br /&gt;
          return false;          &lt;br /&gt;
        }           &lt;br /&gt;
      }  &lt;br /&gt;
              &lt;br /&gt;
      /**&lt;br /&gt;
        * This checks whether game has ended               &lt;br /&gt;
        *&lt;br /&gt;
        */    &lt;br /&gt;
&lt;br /&gt;
      boolean checkEnd() {        &lt;br /&gt;
        &lt;br /&gt;
        if (position[0]==0 &amp;amp;&amp;amp; position[1]==0 &amp;amp;&amp;amp; position[2]==0 &amp;amp;&amp;amp;&lt;br /&gt;
            position[3]==0 &amp;amp;&amp;amp; position[4]==0 &amp;amp;&amp;amp; position[5]==0) return true;&lt;br /&gt;
        if (position[7]==0 &amp;amp;&amp;amp; position[8]==0 &amp;amp;&amp;amp; position[9]==0 &amp;amp;&amp;amp;&lt;br /&gt;
            position[10]==0 &amp;amp;&amp;amp; position[11]==0 &amp;amp;&amp;amp; position[12]==0) return true;        &lt;br /&gt;
        return false;&lt;br /&gt;
      }        &lt;br /&gt;
      &lt;br /&gt;
      /**&lt;br /&gt;
        * This calcs a human score, assuming game has ended &lt;br /&gt;
        * (checks this and otherwise gives -1000)               &lt;br /&gt;
        *&lt;br /&gt;
       */         &lt;br /&gt;
      &lt;br /&gt;
      int humanResult() {&lt;br /&gt;
        int lr=0;&lt;br /&gt;
        int ur=0;&lt;br /&gt;
        int hum=0;&lt;br /&gt;
        int opp=0;&lt;br /&gt;
        &lt;br /&gt;
        if (!checkEnd()) return -1000;&lt;br /&gt;
        lr=position[0]+position[1]+position[2]+position[3]+&lt;br /&gt;
           position[4]+position[5]+position[6];&lt;br /&gt;
        ur=position[7]+position[8]+position[9]+position[10]+&lt;br /&gt;
           position[11]+position[12]+position[13];&lt;br /&gt;
        if (lr==ur) return 0;&lt;br /&gt;
        if (humanLower) return lr-ur;&lt;br /&gt;
        else return (ur-lr);                            &lt;br /&gt;
      }  &lt;br /&gt;
      &lt;br /&gt;
  }  // end class Board&lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
} // end class &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
</feed>