Try the ProcessStartInfo class. MSDN ProcessStartInfo
Since this is for an AI course. I would maybe make a PacmanArgument class. PacmanArgument would have properties for each possible commandline argument and a custom ToString method to call. It would make to easier to programatically generate the arguments for something like a genetic algorithm assuming the output can be read as fitness.
Main Function:
double MAX_EPSILON = 1; //I assume there are constraints
//create packman agent with initial values
PacmanAgent agent = new PackmanAgent(0,0,0) //epsilon,alpha,gamma
//create Process info
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "pacman.py"
psi.WorkingDirectory = @"C:/FilePathToPacman"
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
string output;
Console.WriteLine("***** Increasing Eplison Test *****");
while( agent.Epsilon =< MAX_EPSILON )
{
psi.Arguments = agent.GetArgument();
// Start the process with the info we specified.
// Call WaitForExit and then the using-statement will close.
using (Process process = Process.Start(psi))
{
output = process.StandardOutput.ReadToEnd(); //pipe output to c# variable
process.WaitForExit(); //wait for pacman to end
}
//Do something with test output
Console.WriteLine("Epsilon: {0}, Alpha: {1}, Gamma: {2}",agent.Epsilon,agent.Alpha,agent.Gamma );
Console.WriteLine("\t" + output);
agent.IncrementEpsilon(0.05); //increment by desired value or default(set in IncrementEpsilon function)
}
Pacman Agent class:
public class PacmanAgent
{
private string ArgumentBase = "-q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a ";
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Epsilon { get; set; }
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Alpha { get; set; }
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Gamma { get; set; }
public PacmanAgent(int epsilon, int alpha , int gamma )
{
Epsilon = epsilon;
Alpha = alpha;
Gamma = gamma;
}
public string GetArgument()
{
string argument = string.Format("{0} epsilon={1}, alpha={2}, gamma={3}", ArgumentBase, Epsilon, Alpha, Gamma)
return argument
}
public void IncrementEpsilon(double i = 0.01)
{
Epsilon += i;
}
public void IncrementAlpha(double i = 0.01)
{
Alpha += i;
}
public void IncrementGamma(double i = 0.01)
{
Gamma += i;
}
}
*I wrote this outside on an IDE so please excuse any syntax errors
pacman.pydirectly. To set the working directory, look at the ProcessStartInfo class. There is an overload of Process.Start that accepts one.