中国象棋-开篇
最近刚看了设计模式,学了就想用,顺便在总结和实战中提升自己,就做了个象棋。实现了单机热座和联网对战功能,至于人工智能,实在想不出来,若哪位前辈大哥能指点一二,感激不尽。下面先说说整体思路:
象棋三要素:棋子、棋盘、棋手。
棋子有很多种,帅啊车啊什么的,还有红的和黑的两派,他们虽各具特色,但又有很多共同点。所以我设计了一个超类,让这些棋子继承他,每个子都有一样的属性,名字啊,图片路径啊,位置啊,上一步啊等等,这些每个子都有,只是赋值不同罢了,还有不同的方法,比如马走日象飞田,这些移动上的都是不同的,所以我写了一个虚方法,让他们override,谁该怎么走就怎么走,谁也碍不着谁。下面把这个超类的代码摆上
#region 棋子的基类 [Serializable] public class Chess { public string ChessName { get; set; } public SoundPlay soundPlayer = new SoundPlay(); public Point Location { get; set; } public Point LastLocation { get; set; } public string ImgSrc { get; set; } public Chess(string ChessName, Point Location) { this.ChessName = ChessName; this.Location = Location; this.ImgSrc = AppDomain.CurrentDomain.BaseDirectory + @"/images/" + ChessName + ".png"; } public bool Move(Point destination, ref List<Chess> chessList, ref bool rollbackNeed, ref Chess deadChess) { } protected virtual bool RouteProtocol(Point Location, Point destination, ref List<Chess> chessList, ref bool rollbackNeed, ref Chess deadChess) { } protected virtual void IsMurderGeneral(Point destination, List<Chess> chessList) { } protected bool CheckRollBack(Point Location, Point destination, ref List<Chess> chessList, ref Chess deadChess) { } protected bool IsAlly(Point destination, List<Chess> chessList, ChessCamp chessCamp) { } protected void GeneralMurder(List<Chess> chessList) { } } #endregion
里面有一些方法刚才没提到,后面会细讲,这里不多说了
再说说棋盘,棋盘分为了90块,棋盘虽说是静态的,但考虑到后面棋子移动后,需要重绘棋子上一步的地方,所以把棋盘分为了90块,每一块就是一个棋子可以落子的位置。每走一步都要重绘棋子上一步的位置和棋子落子的位置。这里是对背景初始化,就是画棋盘,这里省略了画棋盘的代码,大概思路就是先画到一个bmp上,然后按棋盘drawLine就可以了,另外把棋盘的每一块也都存储了下来,以备后续使用
private void backgroundPanel_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.DrawImage(initialChess.DrawChessBoard(), new Point(boardLeftEdge, boardTopEdge)); cellBmp = initialChess.CellBmp; turnBmp = initialChess.TurnBmp; this.startX = initialChess.StartX - width / 2; this.startY = initialChess.StartY - width / 2; }
最后,就是棋手了,说是棋手,其实就是对鼠标点击事件的控制。在此我获取了mouse_down事件
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.X > startX + boardLeftEdge && e.X < startX + 9 * width + boardLeftEdge && e.Y > boardTopEdge + startY && e.Y < boardTopEdge + startY + 11 * width)
{
int newStartX = (e.X - (startX + boardLeftEdge)) / width;
int newStartY = (e.Y - (startY + boardTopEdge)) / width;
Point mousePoint = new Point(newStartX, newStartY);
g = panel1.CreateGraphics();
if (isChessSelected)
{
//棋子移动
if (isMoved)
{
AfterMove();
}
}
else
{
SelectChess(mousePoint, gameModels);
}
}
}
AfterMove和SelectChess从字面上也能看出来,一个是后续的处理,一个是选棋子。具体的先不讲了。
大概就是这么个思路,当然实现起来还需要一些工作,今天先弄到这吧,欢迎各位吐槽,批评指点,小弟一定虚心接受

浙公网安备 33010602011771号