//Functions to run games b/w players w/o the GUI
public class Game
{
	public static boolean runGame(player pl1, player pl2)
	{
		boolean playing = true;
		boolean pl1Won = false;
		boolean pl1Move = true;
		boolean[][][] pos1 = new boolean[5][5][5];
		boolean[][][] pos2 = new boolean[5][5][5];
		int[] move = new int[3];

		player curPlayer;
		boolean[][][] curBoard;
		boolean[][][] othBoard;

		pos1 = initBoard(pos1);
		pos2 = initBoard(pos2);

		int counter = 0;
		while (playing)
		{
			if (pl1Move)
			{
				curPlayer = pl1;
				curBoard = pos1;
				othBoard = pos2;
			}//if
			else
			{
				curPlayer = pl2;
				curBoard = pos2;
				othBoard = pos1;
			}//else

			move = curPlayer.getMove(curBoard, othBoard);
			
			curBoard[move[0]][move[1]][move[2]] = true;

			if (checkForVictory(curBoard, move))
			{
				playing = false;
				pl1Won = pl1Move;
			}//if

			pl1Move = !(pl1Move);
		}//while(playing)
		
		return pl1Won;
	}//runGame

	public static boolean[][][] initBoard(boolean[][][] board)
	{
		for(int i = 0; i < 5; i ++)
		{
			for(int j = 0; j < 5; j++)
			{
				for (int k = 0; k < 5; k++)
				{
					board[i][j][k] = false;
				}
			}
		}

		return board;
	}

	public static boolean checkForVictory(boolean[][][] curBoard, int[] move)
	{
		boolean isWin = false;

		isWin = isWin || checkXY(curBoard, move[0], move[1], move[2]);
		isWin = isWin || checkXZ(curBoard, move[0], move[1], move[2]);
		isWin = isWin || checkYZ(curBoard, move[0], move[1], move[2]);
		isWin = isWin || checkDiag(curBoard);

		return isWin;

	}//checkForVictory

//Check the XY Plane
	private static boolean checkXY(boolean[][][] board, int x, int y, int z)
	{
		boolean isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[x][i][z];
		}

		if (isWin)
			return isWin;

		isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[i][y][z];
		}
		if(isWin)
			return isWin;

		isWin = true;
		boolean isWinBkwd = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[i][i][z];
			isWinBkwd = isWinBkwd && board[i][4-i][z];
		}

		return isWin || isWinBkwd;
	}

	//Check the XZ Plane
	private static boolean checkXZ(boolean[][][] board, int x, int y, int z)
	{
		boolean isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[x][y][i];
		}

		if (isWin)
			return isWin;

		isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[i][y][z];
		}
		if(isWin)
			return isWin;

		isWin = true;
		boolean isWinBkwd = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[i][y][i];
			isWinBkwd = isWinBkwd && board[i][y][4-i];
		}

		return isWin || isWinBkwd;
	}

	//Check the YZ Plane
	private static boolean checkYZ(boolean[][][] board, int x, int y, int z)
	{
		boolean isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[x][y][i];
		}

		if (isWin)
			return isWin;

		isWin = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[x][i][z];
		}
		if(isWin)
			return isWin;

		isWin = true;
		boolean isWinBkwd = true;
		for (int i = 0; i < 5; i++)
		{
			isWin = isWin && board[x][i][i];
			isWinBkwd = isWinBkwd && board[x][i][4-i];
		}

		return isWin || isWinBkwd;
	}


	//Checks the great diagonals of the cube
	public static boolean checkDiag(boolean[][][] plBoard)
	{
		boolean isWin1 = true;
		boolean isWin2 = true;
		boolean isWin3 = true;
		boolean isWin4 = true;
		for(int i = 0; i < 5; i++)
		{
			isWin1 = isWin1 && plBoard[i][i][i];
			isWin2 = isWin2 && plBoard[4-i][i][i];
			isWin3 = isWin3 && plBoard[i][4-i][i];
			isWin4 = isWin4 && plBoard[4-i][4-i][i];
		}

		return isWin1 || isWin2 || isWin3 || isWin4;
	}
}//Game