本文整理汇总了C#中GameState.Advance方法的典型用法代码示例。如果您正苦于以下问题:C# GameState.Advance方法的具体用法?C# GameState.Advance怎么用?C# GameState.Advance使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GameState
的用法示例。
在下文中一共展示了GameState.Advance方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: AlphaBetaSearch
private int AlphaBetaSearch(GameState s, int alpha, int beta, int deep, ref Position res_turn)
{
Position turn = new Position(0, 0);
if (deep >= maxDepth || s.GameOver)
{
return costFunction.EvaluateState(s);
}
if (deep % 2 == 0)
{
foreach( Position p in turnsGenerator.GenerateTurns(s))
{
GameState.ChangeSet ch = s.Advance(p, Utils.FlipSide(s.Player));
int score = AlphaBetaSearch(s, alpha, beta, deep + 1, ref turn) - deep * 20;
s.Undo(ch);
if (deep == 0)
{
var hscore = hf.EvaluateTurn(s, p);
Debug.WriteLine("Considering ({0},{1}) with ab_cost = {2}, h_cost = {3}", p.X, p.Y, score, hscore);
}
if (score > alpha)
{
res_turn = p;
alpha = score;
}
if (alpha >= beta) break;
}
return alpha;
}
else
{
foreach (Position p in turnsGenerator.GenerateTurns(s))
{
GameState.ChangeSet ch = s.Advance(p, Utils.FlipSide(s.Player));
int score = AlphaBetaSearch(s, alpha, beta, deep + 1, ref turn) - deep * 20;
s.Undo(ch);
if (score < beta)
{
beta = score;
res_turn = p;
}
if (alpha >= beta) break;
}
return beta;
}
}
示例2: test_2x2_final
static void test_2x2_final()
{
GameState gs = new GameState();
MinMax m = new MinMax(new SimpleCostFuntcion(Side.Zero), new HeuristicTrunsGenerator(new LineBasedTurnHeuristics()), 2);
gs.Advance(new Position(3, 3), Side.Cross);
gs.Advance(new Position(4, 3), Side.Zero);
gs.Advance(new Position(4, 4), Side.Cross);
gs.Advance(new Position(3, 4), Side.Zero);
gs.Advance(new Position(6, 6), Side.Cross);
gs.Advance(new Position(2, 5), Side.Zero);
gs.Advance(new Position(7, 7), Side.Cross);
Position p = m.FindTurn(gs);
Console.WriteLine("Turn found {0},{1}", p.X, p.Y);
}
示例3: State_DeriveStateAddsOneTurn
public void State_DeriveStateAddsOneTurn()
{
//Test case:
// | |.|.|.|
// |.|.|o|.|
// |.|x|.|.| --> initia pos(3,5)
// |.|.|.| |
// | | | | |
GameState gs = new GameState();
Position pos = new Position(3, 5);
gs.Advance(pos, Side.Cross);
Position turnPos = new Position(4, 4);
gs.Advance(turnPos, Side.Zero);
//Confirm.Equal(Side.Cross, gs.Player);
Confirm.Equal(14, gs.Count<Position>());
Confirm.Equal(Side.Cross, gs[pos].Side);
Confirm.Equal(Side.Zero, gs[turnPos].Side);
}
示例4: Play
public GameState Play()
{
GameState gs = new GameState();
var side = Side.Cross;
foreach(var t in turns)
{
gs.Advance(t, side);
side = Utils.FlipSide(side);
}
return gs;
}
示例5: HeuristicTurnsGenerator_GenerateFromTrivialState
public void HeuristicTurnsGenerator_GenerateFromTrivialState()
{
Position pos = new Position(3, 5);
GameState initialState = new GameState();
initialState.Advance(pos, Side.Cross);
HeuristicTrunsGenerator gen = new HeuristicTrunsGenerator(new LineBasedTurnHeuristics());
int i = 0;
foreach (Position p in gen.GenerateTurns(initialState))
{
++i;
}
Confirm.IsTrue(i > 0);
}
示例6: State_DeriveStateUpdatesAlongTheLine
public void State_DeriveStateUpdatesAlongTheLine()
{
//Test case:
// | | |o| |
// | |x|o| | --> initia pos(3,3)
// | | |x| |
// | | | |x|
Position pos0 = new Position(3, 3);
Position pos1 = new Position(4, 4);
Position pos2 = new Position(4, 2);
Position pos3 = new Position(3, 2);
Position pos4 = new Position(5, 1);
// Create states
GameState gs = new GameState();
gs.Advance(pos0, Side.Cross);
gs.Advance(pos1, Side.Zero);
gs.Advance(pos2, Side.Cross);
gs.Advance(pos3, Side.Zero);
gs.Advance(pos4, Side.Cross);
//(6,0)
{
PositionInfo info = gs[new Position(6, 0)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.DiagonalNW, PositionInfo.Direction.Negative];
Confirm.Equal(Side.Cross, up.side);
Confirm.Equal(3, (int)up.amount);
Confirm.Equal(true, up.open);
}
//(2,4)
{
PositionInfo info = gs[new Position(2, 4)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.DiagonalNW, PositionInfo.Direction.Positive];
Confirm.Equal(Side.Cross, up.side);
Confirm.Equal(3, (int)up.amount);
Confirm.Equal(true, up.open);
}
}
示例7: checkUndoRedo
void checkUndoRedo(GameState gs, Position p, Side side)
{
string before = gs.ToString();
GameState.ChangeSet change = gs.Advance(p, side);
string after = gs.ToString();
Console.WriteLine("BEFORE:");
Console.WriteLine(before);
Console.WriteLine("AFTER:");
Console.WriteLine(after);
Confirm.Different(before, after);
gs.Undo(change);
Console.WriteLine("UNDO:");
Console.WriteLine(gs);
Confirm.Equal(before, gs.ToString());
gs.Advance(p, side);
Confirm.Equal(after, gs.ToString());
}
示例8: State_InitialStateTest
public void State_InitialStateTest()
{
GameState gs = new GameState();
Position pos = new Position(3,5);
gs.Advance(pos, Side.Cross);
Confirm.Equal(9, gs.Count<Position>());
Confirm.Equal(Side.Cross, gs[pos].Side);
}
示例9: State_InitialStateHasCorrectPositionInfo
public void State_InitialStateHasCorrectPositionInfo()
{
GameState gs = new GameState();
//empty state
Position pos0 = new Position(4, 5);
gs.Advance(pos0, Side.Cross);
//
foreach (PositionInfo.Orientation o in PositionInfo.Orientations)
{
foreach (PositionInfo.Direction d in PositionInfo.Directions)
{
Position p = pos0 + PositionInfo.GetDirectionVector(o, d);
Confirm.IsNotNull(gs[p]);
Confirm.Equal(gs[p].Side, Side.Nobody);
PositionInfo info = gs[p];
//Check that line is dectected in the direction to pos0
//and that all others direction are empty
foreach (PositionInfo.Orientation o1 in PositionInfo.Orientations)
{
foreach (PositionInfo.Direction d1 in PositionInfo.Directions)
{
PositionInfo.LineInfo l = info[o1, d1];
if (o1 == o && d1 != d)
{
Confirm.Equal(Side.Cross, l.side);
Confirm.Equal(1, (int)l.amount);
Confirm.Equal(true, l.open);
}
else
{
Confirm.Equal(0, (int)l.amount);
}
}
}
}
}
}
示例10: State_DeriveState_OpenFlag
public void State_DeriveState_OpenFlag()
{
//Test case:
// | | |o|
// | |x| | --> initial pos(3,3)
// | | | |
GameState gs = new GameState();
Position pos0 = new Position(3, 3);
Position pos1 = new Position(4, 4);
gs.Advance(pos0, Side.Cross);
gs.Advance(pos1, Side.Zero);
//Sanity:
Confirm.Equal(Side.Cross, gs[pos0].Side);
Confirm.Equal(Side.Zero, gs[pos1].Side);
// (2, 2)
{
PositionInfo info = gs[new Position(2, 2)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo l = info[PositionInfo.Orientation.DigonalSW, PositionInfo.Direction.Positive];
Confirm.Equal(Side.Cross, l.side);
Confirm.Equal(1, (int)l.amount);
Confirm.Equal(false, l.open);
}
// (5, 5)
{
PositionInfo info = gs[new Position(5, 5)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo l = info[PositionInfo.Orientation.DigonalSW, PositionInfo.Direction.Negative];
Confirm.Equal(Side.Zero, l.side);
Confirm.Equal(1, (int)l.amount);
Confirm.Equal(false, l.open);
}
}
示例11: State_DeriveStateUpdatesPositionInformation
public void State_DeriveStateUpdatesPositionInformation()
{
//Test case:
// | | |o|
// | |x| | --> initia pos(3,3)
// | | |x|
GameState gs = new GameState();
Position pos0 = new Position(3, 3);
Position pos1 = new Position(4, 4);
Position pos2 = new Position(4, 2);
// Create states
gs.Advance(pos0, Side.Cross);
gs.Advance(pos1, Side.Zero);
gs.Advance(pos2, Side.Cross);
// (4, 3)
{
PositionInfo info = gs[new Position(4, 3)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.Vertical, PositionInfo.Direction.Positive];
Confirm.Equal(Side.Zero, up.side);
Confirm.Equal(1, (int)up.amount);
Confirm.Equal(true, up.open);
PositionInfo.LineInfo left = info[PositionInfo.Orientation.Horizontal, PositionInfo.Direction.Negative];
Confirm.Equal(Side.Cross, left.side);
Confirm.Equal(1, (int)left.amount);
Confirm.Equal(true, left.open);
PositionInfo.LineInfo down = info[PositionInfo.Orientation.Vertical, PositionInfo.Direction.Negative];
Confirm.Equal(Side.Cross, down.side);
Confirm.Equal(1, (int)down.amount);
Confirm.Equal(true, down.open);
}
// (2,2)
{
PositionInfo info = gs[new Position(2, 2)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.DigonalSW, PositionInfo.Direction.Positive];
Confirm.Equal(Side.Cross, up.side);
Confirm.Equal(1, (int)up.amount);
Confirm.Equal(false, up.open);
}
// (2,4)
{
PositionInfo info = gs[new Position(2, 4)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.DiagonalNW, PositionInfo.Direction.Positive];
Confirm.Equal(Side.Cross, up.side);
Confirm.Equal(2, (int)up.amount);
Confirm.Equal(true, up.open);
}
// (5,1)
{
PositionInfo info = gs[new Position(5, 1)];
Confirm.IsNotNull(info);
PositionInfo.LineInfo up = info[PositionInfo.Orientation.DiagonalNW, PositionInfo.Direction.Negative];
Confirm.Equal(Side.Cross, up.side);
Confirm.Equal(2, (int)up.amount);
Confirm.Equal(true, up.open);
}
}
示例12: MinMaxSearch
private int MinMaxSearch(GameState s, int deep, ref Position turn)
{
int cost = costFunction.EvaluateState(s);
if (deep == maxDepth || cost <= costFunction.LoseValue || cost >= costFunction.WinValue)
{
return cost;
}
if (deep % 2 == 0)
{
int max = int.MinValue;
Position sub_turn = new Position(0, 0);
foreach (Position p in turnsGenerator.GenerateTurns(s))
{
string hash = s.ToString();
GameState.ChangeSet ch = s.Advance(p, Utils.FlipSide(s.Player));
int score = MinMaxSearch(s, deep + 1, ref sub_turn);
s.Undo(ch);
Debug.Assert(s.ToString() == hash);
if (deep == 0)
{
Debug.WriteLine(intend(deep) + "max: ({0},{1}) avaluated as {2}\n", p.X, p.Y, score);
}
if (score > max)
{
max = score;
turn = p;
}
}
return max;
}
else
{
int min = int.MaxValue;
Position sub_turn = new Position(0, 0);
foreach (Position p in turnsGenerator.GenerateTurns(s))
{
string hash = s.ToString();
GameState.ChangeSet ch = s.Advance(p, Utils.FlipSide(s.Player));
int score = MinMaxSearch(s, deep + 1, ref sub_turn);
//if (deep == 1)
// Debug.WriteLine(intend(deep) + "min: ({0},{1}) avaluated as {2}", p.X, p.Y, score);
s.Undo(ch);
Debug.Assert(s.ToString() == hash);
if (score < min)
{
min = score;
turn = p;
}
}
return min;
}
}