Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 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
         }
     }
 }
Beispiel #5
0
 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
             }
         }
     }
 }