Пример #1
0
        private bool ischeck(Token[] map,string side)
        {
            try
            {
                int k;
                for (k = 0; k < 64; k++)
                {
                    if (map[k] != null && map[k].getType() == "King" && map[k].getSide() == side)
                        break;
                }
                int x = map[k].getX();
                int y = map[k].getY();

                //check for pawn
                if ((side == "b") ? y < 7 : y > 0)
                {
                    if (x > 0 && map[getIndex(x - 1, (side == "b") ? y + 1 : y - 1)] != null &&
                        map[getIndex(x - 1, (side == "b") ? y + 1 : y - 1)].getType() == "Pawn" && map[getIndex(x - 1, (side == "b") ? y + 1 : y - 1)].getSide() != side)
                    {
                        return true;
                    }
                    if (x < 7 && map[getIndex(x + 1, (side == "b") ? y + 1 : y - 1)] != null &&
                        map[getIndex(x + 1, (side == "b") ? y + 1 : y - 1)].getType() == "Pawn" && map[getIndex(x + 1, (side == "b") ? y + 1 : y - 1)].getSide() != side)
                    {
                        return true;
                    }
                }
                //check for king
                for (int i = 0; i < 8; i++)
                {
                    int dx = King_move[i].X + x;
                    int dy = King_move[i].Y + y;
                    if (dx < 0 || dx > 7 || dy < 0 || dy > 7) continue;
                    if (map[getIndex(dx, dy)] != null && map[getIndex(dx, dy)].getType() == "King" && map[getIndex(dx, dy)].getSide() != side)
                        return true;
                }
                //check for knight
                for (int i = 0; i < 8; i++)
                {
                    int dx = Knight_move[i].X + x;
                    int dy = Knight_move[i].Y + y;
                    if (dx < 0 || dx > 7 || dy < 0 || dy > 7) continue;
                    if (map[getIndex(dx, dy)] != null && map[getIndex(dx, dy)].getType() == "Knight" && map[getIndex(dx, dy)].getSide() != side)
                        return true;
                }
                //check for castle&queen
                for (int i = 0; i < 28; i++)
                {
                    int dx = Castle_move[i].X + x;
                    int dy = Castle_move[i].Y + y;
                    if (dx < 0 || dx > 7 || dy < 0 || dy > 7) continue;
                    if (map[getIndex(dx, dy)] != null)
                    {
                        if ((map[getIndex(dx, dy)].getType() == "Castle" || map[getIndex(dx, dy)].getType() == "Queen")
                        && map[getIndex(dx, dy)].getSide() != side)
                            return true;
                        i = ((i / 7) + 1) * 7 - 1;
                    }
                }
                //check for bishop&queen
                for (int i = 0; i < 28; i++)
                {
                    int dx = Bishop_move[i].X + x;
                    int dy = Bishop_move[i].Y + y;
                    if (dx < 0 || dx > 7 || dy < 0 || dy > 7) continue;
                    if (map[getIndex(dx, dy)] != null)
                    {
                        if ((map[getIndex(dx, dy)].getType() == "Bishop" || map[getIndex(dx, dy)].getType() == "Queen")
                        && map[getIndex(dx, dy)].getSide() != side)
                            return true;
                        i = ((i / 7) + 1) * 7 - 1;
                    }
                }
                return false;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); return false; }
        }
Пример #2
0
 private Token[] map_clone(Token[] map)
 {
     Token[] r = new Token[64];
     for (int i = 0; i < 64; i++)
     {
         if (map[i] != null)
         {
             r[i] = map[i].Clone() as Token;
         }
     }
     return r;
 }
Пример #3
0
        private string move(Token[] map,int po_x, int po_y,string promote)
        {
            enPassant = null;
            Point p = new Point(po_x, po_y);
            //if (possiblemove.Count != 0 && possiblemove.Contains(p))
            {
                //MessageBox.Show("choosed");
                //castling
                if (tokenChosed.getType() == "King" && Math.Abs(p.X - tokenChosed.getX()) == 2)
                {
                    if (p.X < tokenChosed.getX())
                    {
                        map[getIndex(tokenChosed.getX() - 1, tokenChosed.getY())] = map[getIndex(0, tokenChosed.getY())];
                        map[getIndex(0, tokenChosed.getY())] = null;
                        map[getIndex(tokenChosed.getX() - 1, tokenChosed.getY())].setmove(tokenChosed.getX() - 1, tokenChosed.getY());
                    }
                    else
                    {
                        map[getIndex(tokenChosed.getX() + 1, tokenChosed.getY())] = map[getIndex(7, tokenChosed.getY())];
                        map[getIndex(7, tokenChosed.getY())] = null;
                        map[getIndex(tokenChosed.getX() + 1, tokenChosed.getY())].setmove(tokenChosed.getX() + 1, tokenChosed.getY());
                    }
                }

                if (tokenChosed.getType() == "Pawn")
                {
                    //log for en passant
                    if (Math.Abs(tokenChosed.getY() - p.Y) == 2)
                    {
                        enPassant = tokenChosed;
                    }
                    //capture en passant
                    if (tokenChosed.getX() != p.X && map[getIndex(p.X, p.Y)] == null)
                    {
                        map[getIndex(p.X, tokenChosed.getY())] = null;
                    }
                }

                map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = null as Token;
                tokenChosed.setmove(po_x, po_y);
                map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = tokenChosed;

                //promote
                if ((map == t_map) && tokenChosed.getType() == "Pawn" && (tokenChosed.getY() == 0 || tokenChosed.getY() == 7))
                {
                    DialogResult res=new DialogResult();
                    if (promote == "")
                    {
                        res = MessageBox.Show("You can promote your pawn.\nIf you prefer a queen, press \"Yes\".\nIf you prefer a knight, press\"No\".", "Promotion", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                        promote=(res==DialogResult.Yes)?"Queen":"Knight";
                    }
                    if (tokenChosed.getSide() == "b")
                        if (promote=="Queen")
                            map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = new Queen(tokenChosed.getX(), tokenChosed.getY(),
                                                                      tokenChosed.getSide(), Resources.Queen_b_l, Resources.Queen_b_d, Resources.Queen_b_l_p, Resources.Queen_b_d_p, Resources.Queen_b_l_s, Resources.Queen_b_d_s);
                        else
                            map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = new Knight(tokenChosed.getX(), tokenChosed.getY(),
                                                                      tokenChosed.getSide(), Resources.Knight_b_l, Resources.Knight_b_d, Resources.Knight_b_l_p, Resources.Knight_b_d_p, Resources.Knight_b_l_s, Resources.Knight_b_d_s);
                    else
                        if (promote=="Queen")
                            map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = new Queen(tokenChosed.getX(), tokenChosed.getY(), tokenChosed.getSide(), Resources.Queen_w_l, Resources.Queen_w_d, Resources.Queen_w_l_p, Resources.Queen_w_d_p, Resources.Queen_w_l_s, Resources.Queen_w_d_s);
                        else
                            map[getIndex(tokenChosed.getX(), tokenChosed.getY())] = new Knight(tokenChosed.getX(), tokenChosed.getY(), tokenChosed.getSide(), Resources.Knight_w_l, Resources.Knight_w_d, Resources.Knight_w_l_p, Resources.Knight_w_d_p, Resources.Knight_w_l_s, Resources.Knight_w_d_s);
                }

            }
            return promote;
        }
Пример #4
0
 private string move(Token[] map, int po_x, int po_y)
 {
     return move(map, po_x, po_y, "");
 }
Пример #5
0
        private void gamebox_MouseDown(object sender, MouseEventArgs e)
        {
            if(gamemode=="Local" || myside==whosturn)
            {
                int po_x = e.X / (Screen.PrimaryScreen.WorkingArea.Width / 8);
                int po_y = e.Y / (Screen.PrimaryScreen.WorkingArea.Width / 8);
                Point p = new Point(po_x, po_y);
                if (possiblemove.Count != 0 && possiblemove.Contains(p))
                {

                    int chose_x = tokenChosed.getX();
                    int chose_y = tokenChosed.getY();

                    enPassant = null;
                    string promote=move(t_map, po_x, po_y);

                    if (gamemode == "Network")
                    {
                        NetworkStream nets = _tcpl.GetStream();
                        string msg = string.Format("play " + opponent + " " + chose_x.ToString() + " " + chose_y.ToString() + " " + po_x.ToString() + " " + po_y.ToString() + " " + promote);
                        byte[] buffer = new byte[1024];
                        buffer = Encoding.Unicode.GetBytes(msg.ToCharArray());
                        nets.Write(buffer, 0, buffer.Length);
                    }

                    tokenChosed = null;
                    possiblemove.Clear();
                    drawScreen();
                    whosturn = (whosturn == "w") ? "b" : "w";
                    label1.Text = (whosturn == "w") ? "White's turn" : "Black's turn";
                    if(ischeck(t_map,whosturn))
                    {
                        if (ismate(whosturn))
                        {
                            MessageBox.Show("Checkmate!");
                            win();
                        }
                        else
                        {
                            MessageBox.Show("Check!");
                        }
                    }
                    else if (ismate(whosturn))
                    {
                        MessageBox.Show("Stalemate!");
                        drawgame();
                    }
                }
                else if (t_map[getIndex(po_x, po_y)]!=null && t_map[getIndex(po_x, po_y)].isHere(po_x, po_y) && t_map[getIndex(po_x, po_y)].getSide() == whosturn)
                {
                    tokenChosed = t_map[getIndex(po_x, po_y)] as Token;
                    displaymove(t_map[getIndex(po_x, po_y)]);
                    drawScreen();
                }
                else
                {
                    tokenChosed = null;
                    possiblemove.Clear();
                    drawScreen();
                }
            }
        }
Пример #6
0
 private void displaymove(Token t)
 {
     switch (t.getType())
     {
         case ("Pawn"):
             movecontrol_Pawn((Pawn)t);
             break;
         case ("Bishop"):
             movecontrol_Bishop((Bishop)t);
             break;
         case ("King"):
             movecontrol_King((King)t);
             break;
         case ("Queen"):
             movecontrol_Queen((Queen)t);
             break;
         case ("Castle"):
             movecontrol_Castle((Castle)t);
             break;
         case ("Knight"):
             movecontrol_Knight((Knight)t);
             break;
         default:
             break;
     }
     test_check();
 }