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; } }
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; }
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; }
private string move(Token[] map, int po_x, int po_y) { return move(map, po_x, po_y, ""); }
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(); } } }
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(); }