void setPiece(ChessPiece3D p, int x, int y) { pieces[y * 8 + x] = p; if (p != null) pieces[y * 8 + x].Pos2D = new Vector2(x, y); }
void setPiece(ChessPiece3D p, Vector2 pos) { pieces[(int)(pos.Y * 8 + pos.X)] = p; if (p != null) pieces[(int)(pos.Y * 8 + pos.X)].Pos2D = pos; }
public override int Update(GameTime gameTime) { int hPos = -1; int sPos = -1; bool moved = false; if (!isBattle && !isPromote) // Chưa có đánh nhau va chua co thang cap ms = Mouse.GetState(); if (!isClicked) { if (ms.X >= 0 && ms.X < Util.screenWidth && ms.Y >= 0 && ms.Y < Util.screenHeight) { if (!surrender.Update(gameTime)) return (turn + 1) % 2 + 1; if (!back.Update(gameTime)) return 6; Color[] data = new Color[Util.screenWidth * Util.screenHeight]; mainRenderTarget.GetData<Color>(data); Color c = data[ms.Y * Util.screenWidth + ms.X]; hoverPos = getPosFromColorDepth(c); // Vị trí tương ứng trên bàn cờ dc chọn hPos = (int)(hoverPos.Y * 8 + hoverPos.X); if (ms.LeftButton == ButtonState.Pressed) // Nếu có click chuột { sPos = hPos; if (lstNewPos.Count + lstDie.Count + lstSpecial.Count != 0) // Có con cờ đang được chọn { foreach (Vector2 p in lstNewPos) // Duyệt toàn bộ các vị trí có thể di chuyển đến if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok, chạy tới đó { if (passant == 1) // Con chốt di chuyển đầu tiên passantX = (int)p.X; movePiece(selectingPos, p); moved = true; if (checkCheck(p)) // Con vua đối phương bị check { checkPos = kingPos; chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2; } else { checkPos = new Vector2(-1, -1); chekedSide = 0; } selectingPiece = null; selectingPos = new Vector2(-1, -1); lstNewPos.Clear(); lstDie.Clear(); lstSpecial.Clear(); break; } foreach (Vector2 p in lstDie) // Duyệt các con có thể ăn được if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok, phang nó { ChessPiece3D t = getPiece(p); if (t.Type == Util.PieceType.King) // Con bị ăn là con vua testWin = true; killPiece(selectingPos, p); if (isBattle) // Đánh nhau { return 4; } if (testWin && winSide == turn % 2) // Con vua đối phương bị ăn return turn % 2 + 1; moved = true; if (checkCheck(p)) // Con vua đối phương bị check { checkPos = kingPos; chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2; } else { checkPos = new Vector2(-1, -1); chekedSide = 0; } selectingPiece = null; selectingPos = new Vector2(-1, -1); lstNewPos.Clear(); lstDie.Clear(); lstSpecial.Clear(); break; } foreach (Vector2 p in lstSpecial) // Duyệt các vị trí có thể di chuyển đặc biệt if ((int)p.X == (int)hoverPos.X && (int)p.Y == (int)hoverPos.Y) // Nếu vị trí click chuột nằm trong ds vị trí này thì ok { moved = true; switch (moveSpecial) { case Util.MoveSpecial.Castling: movePiece(selectingPos, p); if ((int)p.X == 1) { movePiece(0, (int)p.Y, 2, (int)p.Y); if (checkCheck(new Vector2(4, p.Y))) // Con vua đối phương bị check checkPos = kingPos; else checkPos = new Vector2(-1, -1); } else { movePiece(7, (int)p.Y, 4, (int)p.Y); if (checkCheck(new Vector2(4, p.Y))) // Con vua đối phương bị check checkPos = kingPos; else checkPos = new Vector2(-1, -1); } break; case Util.MoveSpecial.EnPassant: if (selectingPiece.Side == Util.PieceSide.White) { killPiece(selectingPos, new Vector2(p.X, p.Y - 1)); if (isBattle) // Đánh nhau { return 4; } movePiece(new Vector2(p.X, p.Y - 1), p); //removePiece((int)p.X, (int)p.Y - 1); } else { killPiece(selectingPos, new Vector2(p.X, p.Y + 1)); if (isBattle) // Đánh nhau { return 4; } movePiece(new Vector2(p.X, p.Y + 1), p); //removePiece((int)p.X, (int)p.Y + 1); } //movePiece(selectingPos, p); break; case Util.MoveSpecial.Promotion: Util.PieceType tmp = getPromotion(); if (isPromote) // Thang cap return 5; if (getPiece(hoverPos) != null) movePiece(selectingPos, p); else killPiece(selectingPos, p); moved = true; switch (tmp) { case Util.PieceType.Bishop: setPiece(new Bishop(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p); break; case Util.PieceType.Knight: setPiece(new Knight(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p); break; case Util.PieceType.Queen: setPiece(new Queen(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p); break; case Util.PieceType.Rook: setPiece(new Rook(selectingPiece.Side == Util.PieceSide.White, selectingPiece.Rotation, selectingPiece.Scale, (int)p.X, (int)p.Y), p); break; } break; } if (checkCheck(p)) // Con vua đối phương bị check { checkPos = kingPos; chekedSide = selectingPiece.Side == Util.PieceSide.White ? 1 : 2; } else { checkPos = new Vector2(-1, -1); chekedSide = 0; } selectingPiece = null; selectingPos = new Vector2(-1, -1); lstNewPos.Clear(); lstDie.Clear(); lstSpecial.Clear(); break; } } } } } for (int i = 0; i < 64; ++i) { if (pieces[i] != null) // có con cờ tại vị trí đang xét { if (pieces[i].Type == Util.PieceType.King && (pieces[i].Side == Util.PieceSide.Black) == (turn % 2 == 0)) kingPos = new Vector2(i % 8, i / 8); if (i == hPos) // Con cờ đang xét trùng với vị trí đang hover chuột if (i == sPos) // Có sự click tại đây if (moved) // Nếu là con cờ vừa di chuyển tới nơi thì Normal { pieces[i].State = ChessPiece3D.PieceState.Normal; ++turn; if (passant == 1) passant = 2; else passant = 0; } else { if (turn % 2 == 0 && pieces[i].Side == Util.PieceSide.White || turn % 2 != 0 && pieces[i].Side == Util.PieceSide.Black) // Xét lượt đánh hợp lệ { pieces[i].State = ChessPiece3D.PieceState.Click; selectingPiece = pieces[i]; selectingPos = pieces[i].Pos2D; getNextPos(i); } else pieces[i].State = ChessPiece3D.PieceState.Normal; } else pieces[i].State = ChessPiece3D.PieceState.Hover; else pieces[i].State = ChessPiece3D.PieceState.Normal; pieces[i].Update(gameTime); } } isClicked = (ms.LeftButton == ButtonState.Pressed); camera.Update(gameTime); return 0; }