实例介绍
【实例简介】
【实例截图】
【核心代码】
using 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--;
}
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论