/// <summary> /// 设置异步执行落子操作的参数 /// </summary> /// <param name="position"></param> /// <param name="movePiece_Confirmed"></param> /// <param name="movePiece_Completed"></param> public void SetPieceMoveArgs(ReversiPiecePosition position, WhenMovePiece_Confirmed movePiece_Confirmed, WhenMovePiece_Completed movePiece_Completed) { MovePiece_Position = position; MovePiece_Confirmed = movePiece_Confirmed; MovePiece_Completed = movePiece_Completed; MovePieceHandled = false; }
/// <summary> /// 检查落子的绝对合法性 /// </summary> /// <param position="x">落子的坐标</param> private void CheckpieceValid(ReversiPiecePosition position) { if ((position.X < 0 || position.X >= BoardSize) || (position.Y < 0 || position.Y >= BoardSize)) { throw new Exception("棋子已超出棋盘外! (" + position.X + ", " + position.Y + ")"); } }
/// <summary> /// 初始化一个黑白棋棋盘, 大小为 8*8. 中间 4 个初始棋子为白黑白黑. /// </summary> private ReversiGame() { CurrentBoard = new ReversiPiece[BoardSize, BoardSize]; for (int i = 0; i < BoardSize; i++) { for (int j = 0; j < BoardSize; j++) { CurrentBoard[i, j] = ReversiPiece.Empty; } } CurrentBoard[BoardSize / 2 - 1, BoardSize / 2 - 1] = ReversiPiece.White; CurrentBoard[BoardSize / 2, BoardSize / 2 - 1] = ReversiPiece.Black; CurrentBoard[BoardSize / 2 - 1, BoardSize / 2] = ReversiPiece.Black; CurrentBoard[BoardSize / 2, BoardSize / 2] = ReversiPiece.White; // TODO: 删除用于调试的初始棋局 /*CurrentBoard[0, 0] = ReversiPiece.Black; * CurrentBoard[0, 1] = ReversiPiece.Black; * CurrentBoard[1, 0] = ReversiPiece.White; * CurrentBoard[1, 1] = ReversiPiece.White;*/ CurrentGame = this; CurrentPiece = ReversiPiece.Black; LastPiece = ReversiPiece.White; LastPosition = new ReversiPiecePosition(4, 4); TotalSteps = 0; reversiBuffer = new ReversiBuffer(); IsBusy = false; isRegretEnabled = false; MaxRegretSteps = 0; gameStateStack = new RecersiGameStateStack(); UpdateState(); ResetBuffer(); }
/// <summary> /// A区域可下棋子当中,找出一个适合的棋子,结果保存在result中 /// </summary> /// <param name="result"></param> /// <returns>0表示可下棋子当中无A位的,1表示可下棋子中有A位但会被占角,2表示下后会被翻转,3表示可下</returns> private byte AArea(ReversiPiecePosition result) { if (positionsA.Count == 0) { return(0); } bool changedA = false; for (int i = 0; i < positionsA.Count; i++) { byte tmp = ConsiderA(positionsA[i]); if (tmp == 0) { continue; } else if (tmp == 1) { result.X = positionsA[i].X; result.Y = positionsA[i].Y; changedA = true; continue; } result.X = positionsA[i].X; result.Y = positionsA[i].Y; return(3); } if (changedA) { return(2); } return(1); }
/// <summary> /// C区域可下棋子当中,找出一个适合的棋子,结果保存在result中 /// </summary> /// <param name="result"></param> /// <returns>0表示可下棋子当中无C位的,1表示可下棋子中有C位但会被立即占角或者将被占角,2表示可下并且result为最优</returns> private byte CArea(ReversiPiecePosition result) { if (positionsC.Count == 0) { return(0); } CPrority(); int Max = -1; int MaxIndex = -1; for (int i = 0; i < positionsCPriority.Count; i++) { if (positionsCPriority[i] > Max) { Max = positionsCPriority[i]; MaxIndex = i; } } if (Max > 1) { result.X = positionsC[MaxIndex].X; result.Y = positionsC[MaxIndex].Y; return(2); } else { result.X = positionsC[MaxIndex].X; result.Y = positionsC[MaxIndex].Y; return(1); } }
/// <summary> /// 判断棋子是否在倒数第二圈,如果在并且判断其是否在角 /// </summary> /// <param name="position">棋子的位置</param> /// <returns>0代表不在,1表示在角,2表示在边</returns> private byte IsInSecondRect(ReversiPiecePosition position) { if ((position.X == 2 || position.X == 5) && position.Y > 1 && position.Y < 6) { int tmp = position.X + position.Y; if (tmp == 4 || tmp == 7 || tmp == 10) { return(1); } else { return(2); } } else if ((position.Y == 2 || position.Y == 5) && position.X > 1 && position.X < 6) { int tmp = position.X + position.Y; if (tmp == 4 || tmp == 7 || tmp == 10) { return(1); } else { return(2); } } return(0); }
private List <ReversiPiecePosition> positionsNext; //下一步棋子 public override ReversiPiecePosition GetNextpiece() { //获得可下棋子 this.enabledPositionList = reversiGame.GetEnabledPositions(); if (enabledPositionList == null) { throw new Exception("计算AI下一步棋子时,棋盘上无AI可下棋子"); } //声明一个即将作为返回结果的棋子 ReversiPiecePosition result; //划分区域 DivideArea(); //安全区域 if ((result = SafeArea()) != null) { return(result); } //B区域 if ((result = BArea()) != null) { return(result); } //Region--安全区域和B区域均无子可下 result = new ReversiPiecePosition(); ReversiPiecePosition resultA = new ReversiPiecePosition(); byte tmpA = AArea(result); //A区域 if (tmpA == 3) { return(result); } else if (tmpA == 2) { resultA.X = result.X; //如果下A位出现被翻转,记下此A位的位置 resultA.Y = result.Y; } //C区域 if ((CArea(result)) == 2) { return(result); } //A区域 if (tmpA == 2) { return(resultA); } //EndRegion--安全区域和B区域均无子可下 return(null); }
/// <summary> /// 判断C位是否可下 /// </summary> /// <param name="position">c位的棋子</param> /// <returns>0表示会被占角,1表示将会被占角,2不会被占角,3表示不会被占角且会占到其同边上的非附近的角</returns> private byte ConsiderC(ReversiPiecePosition position) { if (IsInEdgeOrCorner(position) != 2) { throw new Exception("使用ConsiderC方法是,参数为非C位"); } TryMoveOne(position); List <ReversiPiecePosition> tmp1 = reversiGame.GetEnabledPositions(); ReversiPiecePosition tmpA = ANearC(position); ReversiPiecePosition tmpCorner1 = CornerNearC(position); ReversiPiecePosition tmpCorner2 = RemoteSameEdgeCornerOfC(position); for (int i = 0; i < tmp1.Count; i++) { //判断是否立即与其同边的丢角 if ((tmp1[i].X == tmpCorner1.X && tmp1[i].Y == tmpCorner1.Y) || (tmp1[i].X == tmpCorner2.X && tmp1[i].Y == tmpCorner2.Y)) { RegretOne(); return(0); } //判断是否将要丢失其附近的角 else if (tmpA.X == tmp1[i].X && tmpA.Y == tmp1[i].Y) { TryMoveOne(tmpA); List <ReversiPiecePosition> tmp2 = reversiGame.GetEnabledPositions(); for (int j = 0; j < tmp2.Count; j++) { if (tmp2[i].X == tmpCorner2.X && tmp2[i].Y == tmpCorner2.Y) { RegretOne(); RegretOne(); return(1); } } RegretOne(); } } if (reversiGame.CurrentBoard[tmpCorner1.X, tmpCorner1.Y] != ReversiPiece.Empty) { TryMoveOne(tmp1[new Random().Next(tmp1.Count)]); List <ReversiPiecePosition> tmp2 = reversiGame.GetEnabledPositions(); for (int i = 0; i < tmp2.Count; i++) { //判断是否可以占其同边上非附近的角 if (tmp2[i].X == tmpCorner2.X && tmp2[i].Y == tmpCorner2.Y) { RegretOne(); RegretOne(); return(3); } } RegretOne(); } RegretOne(); return(2); }
/// <summary> /// 判断两个位置是否相等 /// </summary> /// <param name="position">另一个位置</param> /// <returns>如果相等, 则返回 true.</returns> public bool Equals(ReversiPiecePosition position) { if (x == position.X && y == position.Y) { return(true); } else { return(false); } }
private ReversiPiecePosition MostRemoteChangedpiece(ReversiPiecePosition location, int directionX, int directionY) { while (location.X + directionX < ReversiGame.BoardSize && location.X + directionX > -1 && location.Y + directionY < ReversiGame.BoardSize && location.Y + directionY > -1 && reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] != ReversiPiece.Empty && reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] != this.AIColor) { if (directionX > 0) { directionX = directionX + 1; } else if (directionX < 0) { directionX = directionX - 1; } if (directionY > 0) { directionY = directionY + 1; } else if (directionY < 0) { directionY = directionY - 1; } } if (location.X + directionX == ReversiGame.BoardSize || location.X + directionX == -1 || location.Y + directionY == ReversiGame.BoardSize || location.Y + directionY == -1) { return(new ReversiPiecePosition(location.X, location.Y)); } else if (reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] == ReversiPiece.Empty) { return(new ReversiPiecePosition(location.X, location.Y)); } else { if (directionX > 0) { directionX = directionX - 1; } else if (directionX < 0) { directionX = directionX + 1; } if (directionY > 0) { directionY = directionY - 1; } else if (directionY < 0) { directionY = directionY + 1; } return(new ReversiPiecePosition(location.X + directionX, location.Y + directionY)); } }
public List <ReversiPiecePosition> GetReversePositions(ReversiPiecePosition setPosition) { foreach (ReversiBufferPosition rbp in AllBufferPositions) { if (rbp.Position.Equals(setPosition)) { return(rbp.AllReversePositions); } } return(null); }
/// <summary> /// 判断是否为角 /// </summary> /// <param name="position">棋子的位置</param> /// <returns>布尔值</returns> private bool IsCorner(ReversiPiecePosition position) { if ((position.X == 0 && position.Y == 0) || (position.X == 7 && position.Y == 7) || (position.X == 0 && position.Y == 7) || (position.X == 7 && position.Y == 0)) { return(true); } else { return(false); } }
/// <summary> /// 初始化一个有特定棋局的黑白棋棋盘, 其棋局由参数确定. /// </summary> /// <param name="initialReversiBoard">是一个二维数组, 指定黑白棋棋局.</param> private ReversiGame(ReversiPiece[,] initialReversiBoard) { CurrentBoard = initialReversiBoard; CurrentGame = this; CurrentPiece = ReversiPiece.Black; LastPiece = ReversiPiece.White; LastPosition = new ReversiPiecePosition(4, 4); reversiBuffer = new ReversiBuffer(); IsBusy = false; UpdateState(); ResetBuffer(); }
/// <summary> /// 开始执行落子操作 /// </summary> public void PieceMoves() { if (MovePieceHandled || !IspieceEnabled(MovePiece_Position)) { MovePiece_Confirmed(false, CurrentPiece, null, null); MovePiece_Completed(false, false, CurrentPiece); return; } // 保存缓冲区当中的当前落子信息 ReversiPiece thisPiece = CurrentPiece; ReversiPiecePosition thisMovePosition = MovePiece_Position; List <ReversiPiecePosition> thisReversePosition = reversiBuffer.GetReversePositions(thisMovePosition); if (IsBusy || thisReversePosition == null) { MovePiece_Confirmed(false, CurrentPiece, null, null); MovePiece_Completed(false, false, CurrentPiece); return; } IsBusy = true; // 开始落子, 更新棋盘. PushState(); CurrentBoard[thisMovePosition.X, thisMovePosition.Y] = CurrentPiece; foreach (ReversiPiecePosition rpp in thisReversePosition) { CurrentBoard[rpp.X, rpp.Y] = CurrentPiece; } UpdateState(); LastPiece = thisPiece; LastPosition = thisMovePosition; MovePiece_Confirmed(true, thisPiece, thisMovePosition, thisReversePosition); // 重建缓冲区 CurrentPiece = GetReversepiece(CurrentPiece); ResetBuffer(); if (GetEnabledPositions().Count <= 0) { CurrentPiece = GetReversepiece(CurrentPiece); ResetBuffer(); if (GetEnabledPositions().Count <= 0) { IsGameOver = true; } } // 落子完成, 对外宣布并重置落子参数 IsBusy = false; MovePiece_Completed(true, IsGameOver, CurrentPiece); MovePiece_Position = null; MovePiece_Confirmed = null; MovePiece_Completed = null; MovePieceHandled = true; }
public ReversiGameState(ReversiPiece[,] board, ReversiPiece piece, ReversiPiece lastPiece, ReversiPiecePosition lastPosition) { CurrentBoard = new ReversiPiece[ReversiGame.BoardSize, ReversiGame.BoardSize]; for (int i = 0; i < ReversiGame.BoardSize; i++) { for (int j = 0; j < ReversiGame.BoardSize; j++) { CurrentBoard[i, j] = board[i, j]; } } CurrentPiece = piece; LastPiece = lastPiece; LastPosition = new ReversiPiecePosition(lastPosition.X, lastPosition.Y); }
private int NumberOfChangedPieces(ReversiPiecePosition location) { int number = 0; number += MostRemoteChangedpiece(location, 1, 0).X - location.X; number += MostRemoteChangedpiece(location, 1, -1).X - location.X; number += location.Y - MostRemoteChangedpiece(location, 0, -1).Y; number += location.Y - MostRemoteChangedpiece(location, -1, -1).Y; number += location.X - MostRemoteChangedpiece(location, -1, 0).X; number += MostRemoteChangedpiece(location, -1, 1).Y - location.Y; number += MostRemoteChangedpiece(location, 0, 1).Y - location.Y; number += MostRemoteChangedpiece(location, 1, 1).Y - location.Y; return(number); }
/// <summary> /// 判断是否可以在指定的点落子 /// </summary> /// <param name="location">落子的坐标</param> /// <returns>如果可以在此处落子, 则返回 true.</returns> public bool IspieceEnabled(ReversiPiecePosition position) { try { foreach (ReversiBufferPosition rbp in reversiBuffer.AllBufferPositions) { if (position.Equals(rbp.Position)) { return(true); } } } catch { } return(false); }
/// <summary> /// 判断下子后是否丢角 /// </summary> /// <param name="position">棋子的位置</param> /// <returns>布尔值</returns> private bool CornerLost(ReversiPiecePosition position) { reversiGame.SetPieceMoveArgs(position, MovePieceConfirmed, MovePieceCompleted); reversiGame.PieceMoves(); List <ReversiPiecePosition> tmp = reversiGame.GetEnabledPositions(); foreach (ReversiPiecePosition p in tmp) { if (IsCorner(p)) { reversiGame.RegretPieceMove(); return(true); } } reversiGame.RegretPieceMove(); return(false); }
/// <summary> /// 判断下A位棋子是否合适 /// </summary> /// <param name="position">A位棋子</param> /// <returns>0表示立马丢角,1表示会被同边上C位翻转,2表示不被占角也不会被翻转</returns> private byte ConsiderA(ReversiPiecePosition position) { if (IsInEdgeOrCorner(position) != 3) { throw new Exception("调用ConsiderA方法时,使用非A位的参数"); } TryMoveOne(position); List <ReversiPiecePosition> tmp1 = reversiGame.GetEnabledPositions(); ReversiPiecePosition tmpC1 = CNearA(position); //其同边上附近的C位 ReversiPiecePosition tmpCorner1 = CornerNearC(tmpC1); ReversiPiecePosition tmpCorner2 = RemoteSameEdgeCornerOfC(tmpC1); for (int i = 0; i < tmp1.Count; i++) { //判断是否丢失同边上的角 if ((tmp1[i].X == tmpCorner1.X && tmp1[i].Y == tmpCorner1.Y) || (tmp1[i].X == tmpCorner2.X && tmp1[i].Y == tmpCorner2.Y)) { RegretOne(); return(0); } } //判断是否会被其同边上的C位翻转 ReversiPiecePosition tmpC2 = SameEdgeCOfC(tmpC1); //其同边上的另一个C位 List <ReversiPiecePosition> tmp2 = reversiGame.GetEnabledPositions(); for (int i = 0; i < tmp2.Count; i++) { if ((tmp2[i].X == tmpC1.X && tmp2[i].Y == tmpC1.Y) || (tmp2[i].X == tmpC2.X && tmp2[i].Y == tmpC2.Y)) { TryMoveOne(tmp2[i]); if (reversiGame.CurrentBoard[position.X, position.Y] != this.AIColor) { RegretOne(); RegretOne(); return(1); } RegretOne(); } } RegretOne(); return(2); }
/// <summary> /// 判断是否在边角上 /// </summary> /// <param name="position"></param> /// <returns>0代表不在,1代表角,2代表c,3代表a,4代表b</returns> private byte IsInEdgeOrCorner(ReversiPiecePosition position) { if ((position.X == 0 || position.X == 7) && position.Y > -1 && position.Y < 8) { int tmp = position.X + position.Y; if (tmp == 0 || tmp == 14 || tmp == 7) { return(1); } else if (tmp == 1 || tmp == 6 || tmp == 8 || tmp == 13) { return(2); } else if (tmp == 2 || tmp == 5 || tmp == 9 || tmp == 12) { return(3); } else { return(4); } } else if ((position.Y == 0 || position.Y == 7) && position.X > -1 && position.X < 8) { int tmp = position.X + position.Y; if (tmp == 0 || tmp == 14 || tmp == 7) { return(1); } else if (tmp == 1 || tmp == 6 || tmp == 8 || tmp == 13) { return(2); } else if (tmp == 2 || tmp == 5 || tmp == 9 || tmp == 12) { return(3); } else { return(4); } } return(0); }
/// <summary> /// 找出c位附近的A位 /// </summary> /// <param name="positon">c位的位置</param> /// <returns></returns> private ReversiPiecePosition CNearA(ReversiPiecePosition positon) { ReversiPiecePosition result = new ReversiPiecePosition(); if (positon.X == 2 && positon.Y == 0) { return(new ReversiPiecePosition(1, 0)); } else if (positon.X == 0 && positon.Y == 2) { return(new ReversiPiecePosition(0, 1)); } else if (positon.X == 5 && positon.Y == 0) { return(new ReversiPiecePosition(6, 0)); } else if (positon.X == 0 && positon.Y == 5) { return(new ReversiPiecePosition(0, 6)); } else if (positon.X == 2 && positon.Y == 7) { return(new ReversiPiecePosition(1, 7)); } else if (positon.X == 7 && positon.Y == 2) { return(new ReversiPiecePosition(7, 1)); } else if (positon.X == 7 && positon.Y == 5) { return(new ReversiPiecePosition(7, 6)); } else if (positon.X == 5 && positon.Y == 7) { return(new ReversiPiecePosition(6, 7)); } else { return(null); } }
private ReversiPiecePosition ANearC(ReversiPiecePosition p) { if (p.X == 1 && p.Y == 0) { return(new ReversiPiecePosition(2, 0)); } else if (p.X == 6 && p.Y == 0) { return(new ReversiPiecePosition(5, 0)); } else if (p.X == 0 && p.Y == 1) { return(new ReversiPiecePosition(0, 2)); } else if (p.X == 0 && p.Y == 6) { return(new ReversiPiecePosition(0, 5)); } else if (p.X == 1 && p.Y == 7) { return(new ReversiPiecePosition(2, 7)); } else if (p.X == 6 && p.Y == 7) { return(new ReversiPiecePosition(5, 7)); } else if (p.X == 7 && p.Y == 1) { return(new ReversiPiecePosition(7, 2)); } else if (p.X == 7 && p.Y == 6) { return(new ReversiPiecePosition(7, 5)); } else { return(null); } }
/// <summary> /// 找出C位位置的同边C位位置 /// </summary> /// <param name="p">C位位置 </param> /// <returns>同边C位位置</returns> private ReversiPiecePosition SameEdgeCOfC(ReversiPiecePosition p) { if (p.X == 1 && p.Y == 0) { return(new ReversiPiecePosition(6, 0)); } else if (p.X == 6 && p.Y == 0) { return(new ReversiPiecePosition(1, 0)); } else if (p.X == 0 && p.Y == 1) { return(new ReversiPiecePosition(0, 6)); } else if (p.X == 0 && p.Y == 6) { return(new ReversiPiecePosition(0, 1)); } else if (p.X == 1 && p.Y == 7) { return(new ReversiPiecePosition(6, 7)); } else if (p.X == 6 && p.Y == 7) { return(new ReversiPiecePosition(1, 7)); } else if (p.X == 7 && p.Y == 1) { return(new ReversiPiecePosition(7, 6)); } else if (p.X == 7 && p.Y == 6) { return(new ReversiPiecePosition(7, 1)); } else { return(null); } }
/// <summary> /// 找出C位棋子同边上非附近的角位棋子 /// </summary> /// <param name="p">C位棋子的位置</param> /// <returns>传入非C位则返回空</returns> private ReversiPiecePosition RemoteSameEdgeCornerOfC(ReversiPiecePosition p) { if (p.X == 1 && p.Y == 0) { return(new ReversiPiecePosition(7, 0)); } else if (p.X == 6 && p.Y == 0) { return(new ReversiPiecePosition(0, 0)); } else if (p.X == 0 && p.Y == 1) { return(new ReversiPiecePosition(0, 7)); } else if (p.X == 0 && p.Y == 6) { return(new ReversiPiecePosition(0, 0)); } else if (p.X == 1 && p.Y == 7) { return(new ReversiPiecePosition(7, 7)); } else if (p.X == 6 && p.Y == 7) { return(new ReversiPiecePosition(0, 7)); } else if (p.X == 7 && p.Y == 1) { return(new ReversiPiecePosition(7, 7)); } else if (p.X == 7 && p.Y == 6) { return(new ReversiPiecePosition(7, 0)); } else { return(null); } }
/// <summary> /// 找出C位棋子附近的角位棋子 /// </summary> /// <param name="p">C位棋子的位置</param> /// <returns>传入非C位则返回空</returns> private ReversiPiecePosition CornerNearC(ReversiPiecePosition p) { if (p.X == 1 && p.Y == 0) { return(new ReversiPiecePosition(0, 0)); } else if (p.X == 6 && p.Y == 0) { return(new ReversiPiecePosition(7, 0)); } else if (p.X == 0 && p.Y == 1) { return(new ReversiPiecePosition(0, 0)); } else if (p.X == 0 && p.Y == 6) { return(new ReversiPiecePosition(0, 7)); } else if (p.X == 1 && p.Y == 7) { return(new ReversiPiecePosition(0, 7)); } else if (p.X == 6 && p.Y == 7) { return(new ReversiPiecePosition(7, 7)); } else if (p.X == 7 && p.Y == 1) { return(new ReversiPiecePosition(7, 0)); } else if (p.X == 7 && p.Y == 6) { return(new ReversiPiecePosition(7, 7)); } else { return(null); } }
/// <summary> /// 找出B位棋子附近的A位棋子 /// </summary> /// <param name="p">B位棋子的位置</param> /// <returns>传入非B位则返回空</returns> private ReversiPiecePosition CNearA(ReversiPiecePosition p) { if (p.X == 2 && p.Y == 0) { return(new ReversiPiecePosition(1, 0)); } else if (p.X == 5 && p.Y == 0) { return(new ReversiPiecePosition(6, 0)); } else if (p.X == 0 && p.Y == 2) { return(new ReversiPiecePosition(0, 1)); } else if (p.X == 0 && p.Y == 5) { return(new ReversiPiecePosition(0, 6)); } else if (p.X == 2 && p.Y == 7) { return(new ReversiPiecePosition(1, 7)); } else if (p.X == 5 && p.Y == 7) { return(new ReversiPiecePosition(6, 7)); } else if (p.X == 7 && p.Y == 2) { return(new ReversiPiecePosition(7, 1)); } else if (p.X == 7 && p.Y == 5) { return(new ReversiPiecePosition(7, 6)); } else { return(null); } }
/// <summary> /// 判断棋子是否在x位 /// </summary> /// <param name="position">棋子位置</param> /// <returns>0表示否, 1表示1,1 2表示6,1 3表示1,6 4表示6,6</returns> private byte IsX(ReversiPiecePosition position) { if (position.X == 1 && position.Y == 1) { return(1); } else if (position.X == 6 && position.Y == 6) { return(4); } else if (position.X == 1 && position.Y == 6) { return(3); } else if (position.X == 6 && position.Y == 1) { return(2); } else { return(0); } }
/// <summary> /// 判读棋子是否在倒数第三圈,如果在并且判断其是否在角 /// </summary> /// <param name="position">棋子的位置</param> /// <returns>0代表不在,1代表在角,2代表在a1,3代表在边</returns> private byte IsInThirdRect(ReversiPiecePosition position) { if ((position.X == 1 || position.X == 6) && position.Y > 0 && position.Y < 7) { int tmp = position.X + position.Y; if (tmp == 2 || tmp == 7 || tmp == 12) { return(1); } else if (tmp == 3 || tmp == 6 || tmp == 8 || tmp == 11) { return(2); } else { return(3); } } else if ((position.Y == 1 || position.Y == 6) && position.X > 0 && position.X < 7) { int tmp = position.X + position.Y; if (tmp == 2 || tmp == 7 || tmp == 12) { return(1); } else if (tmp == 3 || tmp == 6 || tmp == 8 || tmp == 11) { return(2); } else { return(3); } } return(0); }
/// <summary> /// 判断下A是否合适,禁止传入A位 /// </summary> /// <param name="position">棋子的位置</param> /// <returns>0表示合适,1表示会被占角,2表示会丢A附近的C,3表示会丢A附近的C</returns> private byte IsAOK(ReversiPiecePosition position) { bool cornerLost = false; bool cLost = false; ReversiPiecePosition tmpC = CNearA(position); reversiGame.SetPieceMoveArgs(position, MovePieceConfirmed, MovePieceCompleted); reversiGame.PieceMoves(); List <ReversiPiecePosition> tmp = reversiGame.GetEnabledPositions(); foreach (ReversiPiecePosition p in tmp) { if (IsCorner(p)) { cornerLost = true; } if (tmpC.X == p.X && tmpC.Y == p.Y) { cLost = true; } } reversiGame.RegretPieceMove(); if (cornerLost && (!cLost)) { return(1); } else if ((!cornerLost) && cLost) { return(2); } else if (cornerLost && cLost) { return(3); } return(0); }
private void MovePieceConfirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions) { }