private bool DiagonalLineR5(CaroNode a, bool Draw) //đường chéo phải { if (a.Line > _CaroBoard.LineAmount - 4 || a.Column < 5) { return(false); //không thể đủ 5 quân } int countN; for (countN = 1; countN < 5; countN++) { if (_Nodes[a.Line + countN, a.Column - countN].NStatus != a.NStatus) { return(false); //gặp quân khác trạng thái } } if ((_Nodes[a.Line - 1, a.Column + 1].NStatus == -a.NStatus || _Nodes[a.Line - 1, a.Column + 1].NStatus == 2) && (_Nodes[a.Line + 5, a.Column - 5].NStatus == -a.NStatus || _Nodes[a.Line + 5, a.Column - 5].NStatus == 2)) { return(false); //bị chặn 2 đầu } if (Draw) //vẽ { _g.DrawLine(pen, a.Pos.X + CaroNode.Width, a.Pos.Y, _Nodes[a.Line + countN, a.Column - countN].Pos.X + CaroNode.Width, _Nodes[a.Line + countN, a.Column - countN].Pos.Y); } return(true); }
private bool VerticalLine5(CaroNode a, bool Draw) //đường dọc từ trên xuống { if (a.Line > _CaroBoard.LineAmount - 4) { return(false); //xét xuống không thể đủ 5 quân } int countN; for (countN = 1; countN < 5; countN++) { if (_Nodes[a.Line + countN, a.Column].NStatus != a.NStatus) { return(false); //gặp ô khác trạng thái thì break } } if ((_Nodes[a.Line - 1, a.Column].NStatus == -a.NStatus || _Nodes[a.Line - 1, a.Column].NStatus == 2) && (_Nodes[a.Line + 5, a.Column].NStatus == -a.NStatus || _Nodes[a.Line + 5, a.Column].NStatus == 2)) { return(false); // bị chặn 2 đầu } if (Draw) //có vẽ đường chiến thắng không { _g.DrawLine(pen, a.Pos.X + CaroNode.Width / 2, a.Pos.Y, _Nodes[a.Line + countN, a.Column].Pos.X + CaroNode.Width / 2, _Nodes[a.Line + countN, a.Column].Pos.Y); } return(true); }
private bool HorizontalLine5(CaroNode a, bool Draw) //đường ngang trái qua phải { if (a.Column > _CaroBoard.ColumnAmount - 4) { return(false); // không thể đủ 5 quân } int countN; for (countN = 1; countN < 5; countN++) { if (_Nodes[a.Line, a.Column + countN].NStatus != a.NStatus) { return(false); } } if ((_Nodes[a.Line, a.Column - 1].NStatus == -a.NStatus || _Nodes[a.Line, a.Column - 1].NStatus == 2) && (_Nodes[a.Line, a.Column + 5].NStatus == -a.NStatus || _Nodes[a.Line, a.Column + 5].NStatus == 2)) { return(false); // bị chặn 2 đầu } if (Draw) //vẽ { _g.DrawLine(pen, a.Pos.X, a.Pos.Y + CaroNode.Height / 2, _Nodes[a.Line, a.Column + countN].Pos.X, _Nodes[a.Line, a.Column + countN].Pos.Y + CaroNode.Height / 2); } return(true); }
public void Undo() //chức năng undo { if (_StackMoves.Count > 1) //chỉ undo khi có hơn 1 nước đi { if (WinCheck(false)) //nếu đã thắng thì xóa nước đi ra khỏi stack và vẽ lại toàn bàn cờ { CaroNode a = _StackMoves.Pop(); //lấy nước đi cuối cùng ra _Nodes[a.Line, a.Column].NStatus = 0; //set trạng thái thành chưa đánh if (_Result == -1) //nếu là máy thắng thì lấy thêm 1 nước nữa { a = _StackMoves.Pop(); _Nodes[a.Line, a.Column].NStatus = 0; } _g.Clear(_sbBG.Color); //xóa bàn cờ DrawCaroBoard(); //vẽ lại bàn cờ reDrawMoves(); //vẽ lại các nước đã đi } else //nếu không thì chỉ xóa ô cờ bị undo đi { CaroNode a = _StackMoves.Pop(); _Nodes[a.Line, a.Column].NStatus = 0; a.Del(); //lấy 2 nước cuối cùng ra và set trạng thái về chưa đánh a = _StackMoves.Pop(); _Nodes[a.Line, a.Column].NStatus = 0; a.Del(); //xóa các nước đó đi } } }
private Stack <CaroNode> _StackMoves; //stack lưu các nước đã đi private void InitNodes() //khởi tạo mảng các ô cờ { _Nodes = new CaroNode[_CaroBoard.LineAmount + 2, _CaroBoard.ColumnAmount + 2]; for (int i = 0; i < _CaroBoard.LineAmount + 2; i++) { for (int j = 0; j < _CaroBoard.ColumnAmount + 2; j++) { if (i == 0 || i == _CaroBoard.LineAmount + 1 || j == 0 || j == _CaroBoard.ColumnAmount + 1) { _Nodes[i, j] = new CaroNode(i, j, new Point(0, 0), 2); // nếu là biên gán trạng thái là 2 } else { _Nodes[i, j] = new CaroNode(i, j, new Point((j - 1) * CaroNode.Width, (i - 1) * CaroNode.Height), 0); //tất cả các ô cờ còn lại trạng thái 0 } } } }