找传奇、传世资源到传世资源站!

中国象棋C#(wpf)源码

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

from clipboardusing ChineseChess.Game;using ChineseChess.Game.AI;using ChineseChess.Game.Pieces;using System;using System.Collections.Generic;using System.Linq;using System.Security.Permissions;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents; using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Windows.Threading;namespace ChineseChess{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Loaded = MainWindow_Loaded; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { Chessboard.CurrectCamp = true; init(); initPieces(); } /// <summary> /// 初始化棋子 /// </summary> private void initPieces() { Chessboard.PieceList.Clear(); #region 黑方棋子 JuPiece ju20 = new JuPiece(2,vgap, hgap); ju20.setXy(0,0); chessboard.Children.Add(ju20); Chessboard.PieceList.Add(ju20); MaPiece ma20 = new MaPiece(2, vgap, hgap); ma20.setXy(1, 0); chessboard.Children.Add(ma20); Chessboard.PieceList.Add(ma20); XiangPiece xiang20 = new XiangPiece(2, vgap, hgap); xiang20.setXy(2, 0); chessboard.Children.Add(xiang20); Chessboard.PieceList.Add(xiang20); ShiPiece shi20 = new ShiPiece(2, vgap, hgap); shi20.setXy(3, 0); chessboard.Children.Add(shi20); Chessboard.PieceList.Add(shi20); JiangPiece jiang2 = new JiangPiece(2, vgap, hgap); jiang2.setXy(4, 0); chessboard.Children.Add(jiang2); Chessboard.PieceList.Add(jiang2); ShiPiece shi21 = new ShiPiece(2, vgap, hgap); shi21.setXy(5, 0); chessboard.Children.Add(shi21); Chessboard.PieceList.Add(shi21); XiangPiece xiang21 = new XiangPiece(2, vgap, hgap); xiang21.setXy(6, 0); chessboard.Children.Add(xiang21); Chessboard.PieceList.Add(xiang21); MaPiece ma21 = new MaPiece(2, vgap, hgap); ma21.setXy(7, 0); chessboard.Children.Add(ma21); Chessboard.PieceList.Add(ma21); JuPiece ju21 = new JuPiece(2, vgap, hgap); ju21.setXy(8, 0); chessboard.Children.Add(ju21); Chessboard.PieceList.Add(ju21); PaoPiece pao20 = new PaoPiece(2, vgap, hgap); pao20.setXy(1, 2); chessboard.Children.Add(pao20); Chessboard.PieceList.Add(pao20); PaoPiece pao21 = new PaoPiece(2, vgap, hgap); pao21.setXy(7, 2); chessboard.Children.Add(pao21); Chessboard.PieceList.Add(pao21); BingPiece bing20 = new BingPiece(2, vgap, hgap); bing20.setXy(0, 3); chessboard.Children.Add(bing20); Chessboard.PieceList.Add(bing20); BingPiece bing21 = new BingPiece(2, vgap, hgap); bing21.setXy(2, 3); chessboard.Children.Add(bing21); Chessboard.PieceList.Add(bing21); BingPiece bing22 = new BingPiece(2, vgap, hgap); bing22.setXy(4, 3); chessboard.Children.Add(bing22); Chessboard.PieceList.Add(bing22); BingPiece bing23 = new BingPiece(2, vgap, hgap); bing23.setXy(6, 3); chessboard.Children.Add(bing23); Chessboard.PieceList.Add(bing23); BingPiece bing24 = new BingPiece(2, vgap, hgap); bing24.setXy(8, 3); chessboard.Children.Add(bing24); Chessboard.PieceList.Add(bing24); #endregion #region 红方棋子 JuPiece ju10 = new JuPiece(1, vgap, hgap); ju10.setXy(0, 9); chessboard.Children.Add(ju10); Chessboard.PieceList.Add(ju10); MaPiece ma10 = new MaPiece(1, vgap, hgap); ma10.setXy(1, 9); chessboard.Children.Add(ma10); Chessboard.PieceList.Add(ma10); XiangPiece xiang10 = new XiangPiece(1, vgap, hgap); xiang10.setXy(2, 9); chessboard.Children.Add(xiang10); Chessboard.PieceList.Add(xiang10); ShiPiece shi10 = new ShiPiece(1, vgap, hgap); shi10.setXy(3, 9); chessboard.Children.Add(shi10); Chessboard.PieceList.Add(shi10); JiangPiece jiang1 = new JiangPiece(1, vgap, hgap); jiang1.setXy(4, 9); chessboard.Children.Add(jiang1); Chessboard.PieceList.Add(jiang1); ShiPiece shi11 = new ShiPiece(1, vgap, hgap); shi11.setXy(5, 9); chessboard.Children.Add(shi11); Chessboard.PieceList.Add(shi11); XiangPiece xiang11 = new XiangPiece(1, vgap, hgap); xiang11.setXy(6, 9); chessboard.Children.Add(xiang11); Chessboard.PieceList.Add(xiang11); MaPiece ma11 = new MaPiece(1, vgap, hgap); ma11.setXy(7, 9); chessboard.Children.Add(ma11); Chessboard.PieceList.Add(ma11); JuPiece ju11 = new JuPiece(1, vgap, hgap); ju11.setXy(8, 9); chessboard.Children.Add(ju11); Chessboard.PieceList.Add(ju11); PaoPiece pao10 = new PaoPiece(1, vgap, hgap); pao10.setXy(1, 7); chessboard.Children.Add(pao10); Chessboard.PieceList.Add(pao10); PaoPiece pao11 = new PaoPiece(1, vgap, hgap); pao11.setXy(7, 7); chessboard.Children.Add(pao11); Chessboard.PieceList.Add(pao11); BingPiece bing10 = new BingPiece(1, vgap, hgap); bing10.setXy(0, 6); chessboard.Children.Add(bing10); Chessboard.PieceList.Add(bing10); BingPiece bing11 = new BingPiece(1, vgap, hgap); bing11.setXy(2, 6); chessboard.Children.Add(bing11); Chessboard.PieceList.Add(bing11); BingPiece bing12 = new BingPiece(1, vgap, hgap); bing12.setXy(4, 6); chessboard.Children.Add(bing12); Chessboard.PieceList.Add(bing12); BingPiece bing13 = new BingPiece(1, vgap, hgap); bing13.setXy(6, 6); chessboard.Children.Add(bing13); Chessboard.PieceList.Add(bing13); BingPiece bing14 = new BingPiece(1, vgap, hgap); bing14.setXy(8, 6); chessboard.Children.Add(bing14); Chessboard.PieceList.Add(bing14); #endregion } private int hgap; private int vgap; /// <summary> /// 初始化棋盘 /// </summary> private void init() { #region 参数初始化 chessboard.Children.Clear();//清空棋盘 int width = (int)chessboard.ActualWidth; //棋盘宽度 int height = (int)chessboard.ActualHeight; //棋盘高度 int hlinenum = 10; //横向线数 int vlinenum = 9; //纵向线数 int i = 0; hgap = height / (hlinenum-1); //横向间隔 vgap = width / (vlinenum-1); //纵向间隔 int gap = 2; //棋盘向下偏移量 #endregion #region 绘制横向线 for (i = 0; i < hlinenum; i ) { Line line = new Line(); line.X1 = 0; line.Y1 = (hgap * i) gap; line.X2 = width; line.Y2 = (hgap * i) gap; line.StrokeThickness = 1; line.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line); } #endregion #region 绘制纵向线 for (i = 0; i < vlinenum; i ) { Line line1 = new Line(); line1.X1 = (vgap * i); line1.Y1 = 0 gap; line1.X2 = (vgap * i); line1.Y2 = (hgap * 4) gap; line1.StrokeThickness = 1; line1.Stroke = new SolidColorBrush(Colors.Black); Line line2 = new Line(); line2.X1 = (vgap * i); line2.Y1 = (hgap * 5) gap; line2.X2 = (vgap * i); line2.Y2 = (hgap * 9) gap; line2.StrokeThickness = 1; line2.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line1); chessboard.Children.Add(line2); } #endregion #region 画皇宫斜线 Line line3 = new Line(); line3.X1 = (vgap * 3); line3.Y1 = 0 gap; line3.X2 = (vgap * 5); line3.Y2 = (hgap * 2) gap; line3.StrokeThickness = 1; line3.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line3); Line line4 = new Line(); line4.X1 = (vgap * 5); line4.Y1 = 0 gap; line4.X2 = (vgap * 3); line4.Y2 = (hgap * 2) gap; line4.StrokeThickness = 1; line4.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line4); Line line5 = new Line(); line5.X1 = (vgap * 3); line5.Y1 = (hgap * 7) gap; line5.X2 = (vgap * 5); line5.Y2 = (hgap * 9) gap; line5.StrokeThickness = 1; line5.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line5); Line line6 = new Line(); line6.X1 = (vgap * 5); line6.Y1 = (hgap * 7) gap; line6.X2 = (vgap * 3); line6.Y2 = (hgap * 9) gap; line6.StrokeThickness = 1; line6.Stroke = new SolidColorBrush(Colors.Black); chessboard.Children.Add(line6); #endregion } private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { init(); initPieces(); } /// <summary> /// 是否选中棋子 /// </summary> private bool isSelect = false; private Piece SelectPiece = null; /// <summary> /// 检查游戏是否结束,0未结束,1红胜,2黑胜 /// </summary> /// <param name="pies"></param> /// <returns></returns> private int checkIsFail(List<Piece> pies) { bool redKing = false; bool blackKing = false; for (int i = 0; i < pies.Count; i ) { Piece pie = pies[i]; if(pie.Name == ChessName.将 ) { if(pie.isRed) { redKing = true; } else { blackKing = true; } } } if (redKing && blackKing) { return 0; } if(blackKing == false) { return 1; } if(redKing == false) { return 2; } return 0; } private void chessboard_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { int x = (int)e.GetPosition(chessboard).X; int y = (int)e.GetPosition(chessboard).Y; if (isSelect) { int xz = (x vgap/2) / vgap; int yz = (y hgap/2) / hgap; for (int i = 0; i < chessboard.Children.Count; i ) { var pie = chessboard.Children[i]; if (pie is Piece) { var piece = (Piece)(pie); if (piece != SelectPiece && piece.X == xz && piece.Y == yz) { //吃子 List<Point> point = SelectPiece.rule.getNextPos(SelectPiece,Chessboard.PieceList); //获取下一步可以走的点 if (point.Contains(new Point(xz, yz))) { if (piece.isRed != SelectPiece.isRed) // 不是同一方的子,吃 { chessboard.Children.Remove(piece); Chessboard.PieceList.Remove(piece); SelectPiece.BorderColor = SelectPiece.ColorType == Colors.Red ? Colors.Black : Colors.Red; isSelect = false; SelectPiece.X = xz; SelectPiece.Y = yz; SelectPiece.InvalidateVisual(); ClearMark(); if (piece.Name == ChessName.将) { MessageBox.Show((piece.isRed ? "黑方" : "红方") "胜!"); init(); initPieces(); return; } Chessboard.ChangeCamp(); UsingAi.Run(Chessboard.PieceList, chessboard); int isover = checkIsFail(Chessboard.PieceList); if(isover != 0 ) { MessageBox.Show((isover==2 ? "黑方" : "红方") "胜!"); init(); initPieces(); return; } Chessboard.ChangeCamp(); return; } } else { //同一方的子,不走 return; } } } } List<Point> points = SelectPiece.rule.getNextPos(SelectPiece,Chessboard.PieceList); //获取下一步可以走的点 if(points.Contains(new Point(xz,yz))) { //可以走子 SelectPiece.BorderColor = SelectPiece.ColorType == Colors.Red ? Colors.Black : Colors.Red; isSelect = false; SelectPiece.X = xz; SelectPiece.Y = yz; SelectPiece.InvalidateVisual(); ClearMark(); Chessboard.ChangeCamp(); UsingAi.Run(Chessboard.PieceList,chessboard); int isover = checkIsFail(Chessboard.PieceList); if (isover != 0) { MessageBox.Show((isover == 2 ? "黑方" : "红方") "胜!"); init(); initPieces(); return; } Chessboard.ChangeCamp(); return; } } for (int i = 0; i < chessboard.Children.Count; i ) { var pie = chessboard.Children[i]; if (pie is Piece) { //棋子判定 Piece piece = (Piece)(pie); if(x< piece.getGapX() piece.Width/2 && x > piece.getGapX() - piece.Width / 2 && y< piece.getGapY() piece.Height / 2 && y > piece.getGapY() - piece.Height / 2) { //System.Windows.Forms.MessageBox.Show(piece.Name.ToString()); if (piece.BorderColor == Colors.Blue) { piece.BorderColor = piece.ColorType == Colors.Red ? Colors.Black : Colors.Red; isSelect = false; ClearMark(); } else { if (isSelect == false && piece.isRed == Chessboard.CurrectCamp){ piece.BorderColor = Colors.Blue; SelectPiece = piece; isSelect = true; AddNextMark(piece); } } piece.InvalidateVisual(); } } } } //16进制颜色转rgb private Color ConvertColor(string colorText) { string val = colorText; val = val.Replace("#", ""); byte a = System.Convert.ToByte("ff", 16); byte pos = 0; if (val.Length == 8) { a = System.Convert.ToByte(val.Substring(pos, 2), 16); pos = 2; } byte r = System.Convert.ToByte(val.Substring(pos, 2), 16); pos = 2; byte g = System.Convert.ToByte(val.Substring(pos, 2), 16); pos = 2; byte b = System.Convert.ToByte(val.Substring(pos, 2), 16); Color col = Color.FromArgb(a, r, g, b); return col; } /// <summary> /// 添加下一步提示标记 /// </summary> /// <param name="piece"></param> private void AddNextMark(Piece piece) { ClearMark(); List<Point> list = piece.rule.getNextPos(piece, Chessboard.PieceList); foreach (Point point in list) { Ellipse ellipse = new Ellipse(); ellipse.Tag = 1; ellipse.Width = 15; ellipse.Height = 15; RadialGradientBrush fillBrush = new RadialGradientBrush(); fillBrush.GradientStops.Add(new GradientStop(ConvertColor("#FFFF4F00"), 0.3)); fillBrush.GradientStops.Add(new GradientStop(ConvertColor("#93D4842E"), 0.574)); fillBrush.GradientStops.Add(new GradientStop(ConvertColor("#C2F5F4EC"), 0.8)); ellipse.Fill = fillBrush; ellipse.Stroke = null; //point.Offset(-ellipse.Width / 2.0, -ellipse.Height / 2.0); Thickness thk = new Thickness(); thk.Left = point.X * vgap - 8; thk.Top = point.Y * hgap - 8; ellipse.Margin = thk; chessboard.Children.Add(ellipse); } } /// <summary> /// 删除标记 /// </summary> private void ClearMark() { for (int i = 0; i < chessboard.Children.Count; i ) { if (chessboard.Children[i] is Ellipse) { chessboard.Children.RemoveAt(i); i--; } } } }}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复