<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://www.lensovet.net/~sysadmin/w/index.php?action=history&amp;feed=atom&amp;title=Computer_Science%2F61b%2FProjects%2FNetwork%2Fplayer%2FGameboard.java</id>
	<title>Computer Science/61b/Projects/Network/player/Gameboard.java - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://www.lensovet.net/~sysadmin/w/index.php?action=history&amp;feed=atom&amp;title=Computer_Science%2F61b%2FProjects%2FNetwork%2Fplayer%2FGameboard.java"/>
	<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;action=history"/>
	<updated>2026-06-17T15:08:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=24409&amp;oldid=prev</id>
		<title>Lensovet: Lensovet moved page CS/61b/Projects/Network/player/Gameboard.java to Computer Science/61b/Projects/Network/player/Gameboard.java</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=24409&amp;oldid=prev"/>
		<updated>2023-02-20T03:51:36Z</updated>

		<summary type="html">&lt;p&gt;Lensovet moved page &lt;a href=&quot;/~sysadmin/w/CS/61b/Projects/Network/player/Gameboard.java&quot; class=&quot;mw-redirect&quot; title=&quot;CS/61b/Projects/Network/player/Gameboard.java&quot;&gt;CS/61b/Projects/Network/player/Gameboard.java&lt;/a&gt; to &lt;a href=&quot;/~sysadmin/w/Computer_Science/61b/Projects/Network/player/Gameboard.java&quot; title=&quot;Computer Science/61b/Projects/Network/player/Gameboard.java&quot;&gt;Computer Science/61b/Projects/Network/player/Gameboard.java&lt;/a&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 03:51, 20 February 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Lensovet</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=5988&amp;oldid=prev</id>
		<title>Wadmin: Protected &quot;CS/61b/Projects/Network/player/Gameboard.java&quot;: Excessive spamming ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=5988&amp;oldid=prev"/>
		<updated>2011-01-13T07:03:14Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/~sysadmin/w/CS/61b/Projects/Network/player/Gameboard.java&quot; class=&quot;mw-redirect&quot; title=&quot;CS/61b/Projects/Network/player/Gameboard.java&quot;&gt;CS/61b/Projects/Network/player/Gameboard.java&lt;/a&gt;&amp;quot;: Excessive spamming ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 07:03, 13 January 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Wadmin</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=5987&amp;oldid=prev</id>
		<title>Wadmin: rvv</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=5987&amp;oldid=prev"/>
		<updated>2011-01-13T07:02:43Z</updated>

		<summary type="html">&lt;p&gt;rvv&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=5987&amp;amp;oldid=4955&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Wadmin</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4955&amp;oldid=prev</id>
		<title>188.115.169.195: Casino Gambling</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4955&amp;oldid=prev"/>
		<updated>2011-01-02T19:42:22Z</updated>

		<summary type="html">&lt;p&gt;Casino Gambling&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=4955&amp;amp;oldid=4229&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>188.115.169.195</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4229&amp;oldid=prev</id>
		<title>Wadmin at 05:52, 27 December 2010</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4229&amp;oldid=prev"/>
		<updated>2010-12-27T05:52:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=4229&amp;amp;oldid=4204&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Wadmin</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4204&amp;oldid=prev</id>
		<title>188.115.165.133: buy tramadol online</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4204&amp;oldid=prev"/>
		<updated>2010-12-26T22:25:31Z</updated>

		<summary type="html">&lt;p&gt;buy tramadol online&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=4204&amp;amp;oldid=4095&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>188.115.165.133</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4095&amp;oldid=prev</id>
		<title>Wadmin: rvv</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4095&amp;oldid=prev"/>
		<updated>2010-12-24T10:19:05Z</updated>

		<summary type="html">&lt;p&gt;rvv&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=4095&amp;amp;oldid=4091&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Wadmin</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4091&amp;oldid=prev</id>
		<title>188.115.133.109: buy generic soma</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=4091&amp;oldid=prev"/>
		<updated>2010-12-15T00:43:35Z</updated>

		<summary type="html">&lt;p&gt;buy generic soma&lt;/p&gt;
&lt;a href=&quot;http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;amp;diff=4091&amp;amp;oldid=3947&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>188.115.133.109</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=3947&amp;oldid=prev</id>
		<title>Lensovet: moved CS 61b/Projects/Network/player/Gameboard.java to CS/61b/Projects/Network/player/Gameboard.java:&amp;#32;fix CS 61b hierarchy</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=3947&amp;oldid=prev"/>
		<updated>2010-11-14T05:59:46Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/~sysadmin/w/CS_61b/Projects/Network/player/Gameboard.java&quot; class=&quot;mw-redirect&quot; title=&quot;CS 61b/Projects/Network/player/Gameboard.java&quot;&gt;CS 61b/Projects/Network/player/Gameboard.java&lt;/a&gt; to &lt;a href=&quot;/~sysadmin/w/CS/61b/Projects/Network/player/Gameboard.java&quot; class=&quot;mw-redirect&quot; title=&quot;CS/61b/Projects/Network/player/Gameboard.java&quot;&gt;CS/61b/Projects/Network/player/Gameboard.java&lt;/a&gt;: fix CS 61b hierarchy&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 05:59, 14 November 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Lensovet</name></author>
		
	</entry>
	<entry>
		<id>http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=3270&amp;oldid=prev</id>
		<title>Lensovet at 07:31, 22 September 2007</title>
		<link rel="alternate" type="text/html" href="http://www.lensovet.net/~sysadmin/w/index.php?title=Computer_Science/61b/Projects/Network/player/Gameboard.java&amp;diff=3270&amp;oldid=prev"/>
		<updated>2007-09-22T07:31:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{code}}&lt;br /&gt;
 package player;&lt;br /&gt;
 &lt;br /&gt;
 /* Gameboard class&lt;br /&gt;
  * contains the gameboard ADT and methods for handling it&lt;br /&gt;
  * in addition, contains methods for generating and evaluating new moves&lt;br /&gt;
 **/&lt;br /&gt;
 &lt;br /&gt;
 public class Gameboard {&lt;br /&gt;
 	&lt;br /&gt;
 	// Allows for a hypothetical expansion of the board&lt;br /&gt;
 	public final static int DIMENSION = 8;&lt;br /&gt;
 	public final static int ADD = 1;&lt;br /&gt;
 	public final static int STEP = 2;&lt;br /&gt;
 	// used for signaling a white/black win; needs to be large and prime&lt;br /&gt;
 	public final static int WHITEWIN = 2047;&lt;br /&gt;
 	public final static int BLACKWIN = -2047;&lt;br /&gt;
 	&lt;br /&gt;
 	private Chip[][] board = new Chip[DIMENSION][DIMENSION];&lt;br /&gt;
 	private int x = DIMENSION;&lt;br /&gt;
 	private int y = DIMENSION;&lt;br /&gt;
 	private int pieces;&lt;br /&gt;
 	&lt;br /&gt;
 	// returns the Chip at a given x &amp;amp; y coord&lt;br /&gt;
 	/* we use a &amp;quot;try&amp;quot; so that if we try to access a location that is off the board,&lt;br /&gt;
 		i.e. we attempt to get non-existent coords, then just return null */&lt;br /&gt;
 	public Chip cellContents(int x, int y) {&lt;br /&gt;
 		try {&lt;br /&gt;
 		return board[x][y];&lt;br /&gt;
 		} catch (ArrayIndexOutOfBoundsException e) {&lt;br /&gt;
 			return null;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/** @return an array of Chip neighbors around a given position (x,y) **/&lt;br /&gt;
 	public Chip[] neighborarray(int x, int y) {&lt;br /&gt;
 		Chip[] array = new Chip[8];&lt;br /&gt;
 		array[0] = cellContents(x-1, y-1); // nw&lt;br /&gt;
 		array[1] = cellContents(x, y-1); // n&lt;br /&gt;
 		array[2] = cellContents(x+1, y-1); // ne&lt;br /&gt;
 		array[3] = cellContents(x+1, y); // e&lt;br /&gt;
 		array[4] = cellContents(x+1, y+1); // se&lt;br /&gt;
 		array[5] = cellContents(x, y+1); // s&lt;br /&gt;
 		array[6] = cellContents(x-1, y+1); // sw&lt;br /&gt;
 		array[7] = cellContents(x-1, y); // w&lt;br /&gt;
 		return array;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/** takes in rec = 1 on initial search&lt;br /&gt;
 		@return the number of the same-color neighbors around a given position (x, y) **/&lt;br /&gt;
 	public int neighbor(int color, int x, int y, int rec) {&lt;br /&gt;
 		if (rec &amp;lt; 0) {&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			Chip[] array = neighborarray(x, y);&lt;br /&gt;
 			int number = 0;&lt;br /&gt;
 			for (int i=0; i&amp;lt;array.length; i++) {&lt;br /&gt;
 				Chip target = array[i];&lt;br /&gt;
 				if (target != null &amp;amp;&amp;amp; target.getColor()==color) {&lt;br /&gt;
 					number = number + neighbor(color, target.getX(), target.getY(), rec-1);&lt;br /&gt;
 					number++;&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 			return number;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/* inserts a chip of the given color at (x, y) if this is acceptable&lt;br /&gt;
 		returns true if the insertion is legal, false otherwise */&lt;br /&gt;
 	public boolean insertChip(int color, int x, int y) {&lt;br /&gt;
 		if (validMove(color, new Move(x, y))) {&lt;br /&gt;
 			board[x][y] = new Chip(color, x, y);&lt;br /&gt;
 			pieces++;&lt;br /&gt;
 			return true;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return false;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/* moves Chip c to a new location at (x, y)&lt;br /&gt;
 		returns true if the move is legal, false otherwise */&lt;br /&gt;
 	public boolean moveChip(Chip c, int x, int y) {&lt;br /&gt;
 		if (validMove(c.getColor(), new Move(x, y))) {&lt;br /&gt;
 			board[c.getX()][c.getY()] = null;&lt;br /&gt;
 			board[x][y] = new Chip(c.getColor(), x, y);&lt;br /&gt;
 			return true;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return false;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/* performs the requested move for a player of the given color&lt;br /&gt;
 		returns true if the move is legal, false otherwise */&lt;br /&gt;
 	public boolean performMove(int color, Move m) {&lt;br /&gt;
 		if (m.moveKind == Move.ADD) {&lt;br /&gt;
 			return insertChip(color, m.x1, m.y1);&lt;br /&gt;
 		} else if (m.moveKind == Move.STEP) {&lt;br /&gt;
 			return moveChip(retrieveChip(m.x2, m.y2), m.x1, m.y1);&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return true;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// legacy method for returning a chip at (x, y)&lt;br /&gt;
 	public Chip retrieveChip(int x, int y) {&lt;br /&gt;
 		return cellContents(x, y);&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/**	Verifies that a given move is valid for a plyer of the given color.&lt;br /&gt;
 		* the following conditions must be met:&lt;br /&gt;
 		* No chip may be placed in any of the four corners&lt;br /&gt;
 		* No chip may be placed in a goal of the opposite color&lt;br /&gt;
 		* No chip may be placed in a square that is already occupied&lt;br /&gt;
 		* A player may not have more than two chips in a connected group, whether connected orthogonally or diagonally&lt;br /&gt;
 		takes a move and the player's color performing the move&lt;br /&gt;
 		@return true if move is valid&lt;br /&gt;
 	*/&lt;br /&gt;
 	public boolean validMove(int color, Move m) {&lt;br /&gt;
 		if (m.moveKind == Move.QUIT) {&lt;br /&gt;
 			return true;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			if ((m.x1==0 &amp;amp;&amp;amp; (m.y1==0 || m.y1==DIMENSION-1)) || (m.y1==DIMENSION-1 &amp;amp;&amp;amp; (m.x1==0 || m.x1==DIMENSION-1))) {&lt;br /&gt;
 				return false; // in the corners&lt;br /&gt;
 			} else if (board[m.x1][m.y1] != null) {&lt;br /&gt;
 				return false; // target cell isn't empty&lt;br /&gt;
 			} else if (((color == Chip.BLACK) &amp;amp;&amp;amp; (m.x1==0 || m.x1==DIMENSION-1)) || ((color == Chip.WHITE) &amp;amp;&amp;amp; (m.y1==0 || m.y1==DIMENSION-1))) {&lt;br /&gt;
 				return false; // target cell is in opponent's goal&lt;br /&gt;
 			} else if (!checkClusterSize(color, m.x1, m.y1)) {&lt;br /&gt;
 				return false; // resulting cluster too big&lt;br /&gt;
 			} else {&lt;br /&gt;
 				return true; // looks like this move is good&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// helper method for validMove()&lt;br /&gt;
 	// @return true if an insertion at the given position is possible w/respect to cluster size; false otherwise&lt;br /&gt;
 	public boolean checkClusterSize(int color, int x, int y) {&lt;br /&gt;
 		if (neighbor(color, x, y, 1) &amp;gt; 1) {&lt;br /&gt;
 			return false;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return true;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// generates a 2-d array of moves and resulting gameboards for a given color&lt;br /&gt;
 	// @return[0] is an array of Gameboards (Gameboard[x])&lt;br /&gt;
 	// @return[1] is an array of Moves corresponding to each board in return[0] (Move[x])&lt;br /&gt;
 	// thus the board after performing g.performMove(color, return[1][i]) is return[0][i]&lt;br /&gt;
 	public Object[][] generateMoves(int color) {&lt;br /&gt;
 	{{notmine|Chanh Vo|fragment=yes}} 	&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// @return an exact clone of &amp;quot;this&amp;quot; gameboard&lt;br /&gt;
 	public Gameboard clone() {&lt;br /&gt;
 	{{notmine|Chanh Vo|fragment=yes}} 	&lt;br /&gt;
 	}&lt;br /&gt;
 	 	&lt;br /&gt;
 	// return the current Move kind for this gameboard, depending on number of pieces&lt;br /&gt;
 	// @return either STEP or ADD&lt;br /&gt;
 	public int moveKind() {&lt;br /&gt;
 		if (pieces &amp;lt; 20) {&lt;br /&gt;
 			return ADD;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return STEP;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	/* chooses a move to a given depth for a given color using alpha-beta pruning (hopefully)&lt;br /&gt;
 	/ first two moves involve the random placement of a chip in each of the goals without any analysis&lt;br /&gt;
 	/ @param color - current player's color&lt;br /&gt;
 		depth - number of levels remaining to search (i.e. depth = 1 means no look-ahead)&lt;br /&gt;
 		alpha, beta - best-case and worst-case scores&lt;br /&gt;
 		side - true for white, false for black&lt;br /&gt;
 		factor - multiplier used to score a win many levels down lower than a win in the first level&lt;br /&gt;
 	/ @return an Alphamove with the best move and its corresponding score */&lt;br /&gt;
 	public Alphamove chooseMove(int color, int depth, int alpha, int beta, boolean side, int factor) {&lt;br /&gt;
 		Alphamove bestme = new Alphamove();&lt;br /&gt;
 		Alphamove bestopp;&lt;br /&gt;
 		if (side) {&lt;br /&gt;
 			bestme.score = alpha;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			bestme.score = beta;&lt;br /&gt;
 		}&lt;br /&gt;
 		if (pieces &amp;lt; 2) { // first move for each color&lt;br /&gt;
 						  // place a random piece in the top (black) or left (white) goal&lt;br /&gt;
 			int target = (((int) (Math.random() * 10.0)) % (DIMENSION - 2)) + 1;&lt;br /&gt;
 			if (color == Chip.BLACK) {&lt;br /&gt;
 				bestme.move = new Move(target, 0);&lt;br /&gt;
 			} else {&lt;br /&gt;
 				bestme.move = new Move(0, target);&lt;br /&gt;
 			}&lt;br /&gt;
 			return bestme;&lt;br /&gt;
 		} else if (pieces &amp;lt; 4) { // second move for each color&lt;br /&gt;
 								 // place a random piece in the bottom (black) or right (white) goal&lt;br /&gt;
 			int target = (((int) (Math.random() * 10.0)) % (DIMENSION - 2)) + 1;&lt;br /&gt;
 			if (color == Chip.BLACK) {&lt;br /&gt;
 				bestme.move = new Move(target, DIMENSION-1);&lt;br /&gt;
 			} else {&lt;br /&gt;
 				bestme.move = new Move(DIMENSION-1, target);&lt;br /&gt;
 			}&lt;br /&gt;
 			return bestme;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			// at least 4 pieces are on the board now, so this is the 3rd+ move&lt;br /&gt;
 			// go ahead and generate the possible moves from the current board&lt;br /&gt;
 			Object[][] arr = generateMoves(color);&lt;br /&gt;
 			if (depth == 1) {&lt;br /&gt;
 				// this is our last level, so end the recursion&lt;br /&gt;
 				for (int i=0; i&amp;lt;arr[0].length; i++) {&lt;br /&gt;
 					if (arr[0][i] != null) {&lt;br /&gt;
 						Move targetmove = (Move) arr[1][i];&lt;br /&gt;
 						int score = ((Gameboard) arr[0][i]).winner()*factor;&lt;br /&gt;
 						System.out.println(&amp;quot;Got score &amp;quot; + score + &amp;quot; for board &amp;quot; + ((Gameboard) arr[0][i]) + &amp;quot;, factor &amp;quot; + factor);&lt;br /&gt;
 						if ((((score/factor)==WHITEWIN) &amp;amp;&amp;amp; (color==Chip.WHITE)) || (((score/factor)==BLACKWIN) &amp;amp;&amp;amp; (color==Chip.BLACK))) {&lt;br /&gt;
 							// we've reached a winner, so stop here and return it&lt;br /&gt;
 							bestme.score = score;&lt;br /&gt;
 							bestme.move = targetmove;&lt;br /&gt;
 							return bestme;&lt;br /&gt;
 						} else if ((score &amp;gt; bestme.score &amp;amp;&amp;amp; side) || (score &amp;lt; bestme.score &amp;amp;&amp;amp; !side)) {&lt;br /&gt;
 							bestme.score = score;&lt;br /&gt;
 							bestme.move = targetmove;&lt;br /&gt;
 						}&lt;br /&gt;
 					} else { // we've run out of moves to evalute; stop&lt;br /&gt;
 						break;&lt;br /&gt;
 					}&lt;br /&gt;
 				}&lt;br /&gt;
 				return bestme;&lt;br /&gt;
 			} else {&lt;br /&gt;
 				for (int ii=0; ii&amp;lt;arr[0].length; ii++) {&lt;br /&gt;
 					if (arr[0][ii] != null) {&lt;br /&gt;
 						// eventually, this is where we will check to make sure we still have enough time&lt;br /&gt;
 						System.out.println(&amp;quot;side: &amp;quot; + side);&lt;br /&gt;
 						Move targetmove = (Move) arr[1][ii];&lt;br /&gt;
 						int score = ((Gameboard) arr[0][ii]).winner()*factor;&lt;br /&gt;
 						if (depth ==2) { System.out.println(&amp;quot;Got score &amp;quot; + score + &amp;quot; for board &amp;quot; + ((Gameboard) arr[0][ii]) + &amp;quot;, factor &amp;quot; + factor); }&lt;br /&gt;
 						if ((((score/factor)==WHITEWIN) &amp;amp;&amp;amp; (color==Chip.WHITE)) || (((score/factor)==BLACKWIN) &amp;amp;&amp;amp; (color==Chip.BLACK))) {&lt;br /&gt;
 							// we've reached a winner, so stop here and return it&lt;br /&gt;
 							bestme.score = score;&lt;br /&gt;
 							bestme.move = targetmove;&lt;br /&gt;
 							return bestme;&lt;br /&gt;
 						} else {&lt;br /&gt;
 							bestopp = ((Gameboard) arr[0][ii]).chooseMove(generateOpponent(color), depth-1, alpha, beta, !side, factor-1); //hopefully we never search for more than 9 levels...&lt;br /&gt;
 							System.out.println(&amp;quot;Opponent's best response is &amp;quot; + bestopp.score + &amp;quot;, current best score is &amp;quot; + bestme.score + &amp;quot; (side &amp;amp;&amp;amp; (bestopp.score &amp;gt; bestme.score)) returns &amp;quot; + (side &amp;amp;&amp;amp; (bestopp.score &amp;gt; bestme.score)) + &amp;quot; for side = &amp;quot; + side);&lt;br /&gt;
 							targetmove = (Move) arr[1][ii];&lt;br /&gt;
 							if (side &amp;amp;&amp;amp; (bestopp.score &amp;gt; bestme.score)) {&lt;br /&gt;
 								bestme.move = targetmove;&lt;br /&gt;
 								bestme.score = bestopp.score;&lt;br /&gt;
 								alpha = bestopp.score;&lt;br /&gt;
 								System.out.println(&amp;quot;Found better move for white, score is &amp;quot; + bestopp.score + &amp;quot; move is &amp;quot; + bestme.move);&lt;br /&gt;
 							} else if (!side &amp;amp;&amp;amp; (bestopp.score &amp;lt; bestme.score)) {&lt;br /&gt;
 								bestme.move = targetmove;&lt;br /&gt;
 								bestme.score = bestopp.score;&lt;br /&gt;
 								beta = bestopp.score;&lt;br /&gt;
 								// System.out.println(&amp;quot;Found better move for black, score is &amp;quot; + bestopp.score);&lt;br /&gt;
 							} if (alpha &amp;gt;= beta) {&lt;br /&gt;
 								return bestme;&lt;br /&gt;
 							}&lt;br /&gt;
 						}&lt;br /&gt;
 					} else { // we've run out of moves to evalute; stop&lt;br /&gt;
 						break;&lt;br /&gt;
 					}&lt;br /&gt;
 				}&lt;br /&gt;
 				return bestme;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// returns the best possible move that can be made by the given color to a search depth of &amp;quot;depth&amp;quot; using the &amp;quot;this&amp;quot; board&lt;br /&gt;
 	// @return the best current Move&lt;br /&gt;
 	public Move evalTree(int color, int depth) {&lt;br /&gt;
 		int alpha = (BLACKWIN*10)-1;&lt;br /&gt;
 		int beta = (WHITEWIN*10)+1;&lt;br /&gt;
 		boolean side;&lt;br /&gt;
 		if (color == Chip.BLACK) {&lt;br /&gt;
 			side = false;&lt;br /&gt;
 		} else { &lt;br /&gt;
 			side = true;&lt;br /&gt;
 		}&lt;br /&gt;
 		Alphamove winningmove = this.chooseMove(color, depth, alpha, beta, side, 10);&lt;br /&gt;
 		return winningmove.move;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// simple method to generate the opponent's color&lt;br /&gt;
 	// given a color, @return the color of the opponent&lt;br /&gt;
 	public static int generateOpponent(int color) {&lt;br /&gt;
 		if (color == Chip.WHITE) {&lt;br /&gt;
 			return Chip.BLACK;&lt;br /&gt;
 		} else {&lt;br /&gt;
 			return Chip.WHITE;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// evaluates the given network for a winning color&lt;br /&gt;
 	// returns a probability of winning if there is no win (positive for white advantage, negative for black advantage)&lt;br /&gt;
 	// returns WHITEWIN if WHITE wins, BLACKWIN if BLACK wins&lt;br /&gt;
 	// @return an int with this board's score&lt;br /&gt;
 	public int winner() {&lt;br /&gt;
 	{{notmine|Jordan Berk|fragment=yes}}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// helper function for winner - recursively finds networks and assigns 1 point per connection and 10000 for a win&lt;br /&gt;
 	// @return an int with the score of the network&lt;br /&gt;
 	int findNetwork(Gameboard g, int x, int y, int color, int num, String currentDirection, String lastDirection) {&lt;br /&gt;
 	{{notmine|Jordan Berk|fragment=yes}}&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	// debugging method to print a gameboard&lt;br /&gt;
 	// @return a string represeting the board&lt;br /&gt;
 	public String toString() {&lt;br /&gt;
 		String output = &amp;quot;\n|&amp;quot;;&lt;br /&gt;
 		for (y=0; y&amp;lt;DIMENSION; y++) {&lt;br /&gt;
 			for (x=0; x&amp;lt;DIMENSION; x++) {&lt;br /&gt;
 				if (board[x][y] == null) {&lt;br /&gt;
 					output = output + &amp;quot; .&amp;quot;;&lt;br /&gt;
 				} else {&lt;br /&gt;
 					output = output + &amp;quot; &amp;quot; + ((Chip) board[x][y]).getColor();&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 			output = output + &amp;quot;|\n|&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		return output;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Lensovet</name></author>
		
	</entry>
</feed>