private int valorMax( Partida partida, EstatPartida estat_partida, int alfa, int beta, EstatCasella estat_casella,
	                      int profunditat, int profunditat_maxima, EstatCasella fitxa_jugador )
	{
		Tauler tauler = partida.getTauler();
		if ( profunditat == profunditat_maxima || estat_partida == EstatPartida.GUANYA_JUGADOR_A ||
		     estat_partida == EstatPartida.GUANYA_JUGADOR_B || estat_partida == EstatPartida.EMPAT )
		{
			return funcioAvaluacio( tauler, estat_partida, profunditat, fitxa_jugador );
		}
		else
		{
			int mida = tauler.getMida();
			for ( int fila = 0; fila < mida; ++fila )
			{
				for ( int columna = 0; columna < mida; ++columna )
				{
					try
					{
						tauler.mouFitxa( estat_casella, fila, columna );
					}
					catch ( IllegalArgumentException excepcio )
					{
						continue;
					}
					EstatPartida estat_partida_aux = partida.comprovaEstatPartida( fila, columna );
					estat_casella = intercanviaEstatCasella( estat_casella );
					alfa = Math.max( alfa,
							this.valorMin( partida, estat_partida_aux, alfa, beta, estat_casella, ( profunditat + 1 ),
									profunditat_maxima, fitxa_jugador ) );
					tauler.treuFitxa( fila, columna );
					if ( alfa >= beta )
					{
						return beta;
					}
					estat_casella = intercanviaEstatCasella( estat_casella );
				}
			}
			return alfa;
		}
	}