C#版智能五子棋游戏(2)
C#版智能五子棋游戏(2)IChessEngine 五子棋实现
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace QiuQiu.ChessEngine { /// <summary> /// 游戏引擎 /// </summary> public class ChessEngine : IChessEngine { #region private fields private IPlayer _plyer1;//玩家1 private IPlayer _plyer2;//玩家2 private IPlayer _currentPlayer;//当前玩家 private IChessData _chessData;//棋子数据 private Thread _doChessThread;//下棋线程 private IChessLogic _chessLogic;//下棋逻辑 private ChessTimer _timer;//计时器 private TimeSpan _timeLimit = TimeSpan.FromMinutes(10); private bool _disposed = false; /// <summary> /// 数据变化时触发该事件 /// </summary> public event EventHandler DataChange; /// <summary> /// 当前玩家改变时触发该事件 /// </summary> public event EventHandler PlayerChange; /// <summary> /// 其他事件发生时触发该事件 /// </summary> public event EngineEventHandle EventFire; public TimeSpan TimeLimit { get { return _timeLimit; } set { _timeLimit = value; } } /// <summary> /// 计时器 /// </summary> public ChessTimer Timer { get { return _timer; } } /// <summary> /// 获取棋子数据的副本 /// </summary> public IChessData ChessData { get { return _chessData.Copy(); } } /// <summary> /// 玩家1 /// </summary> public IPlayer Plyer1 { get { return _plyer1; } set { _plyer1 = value; } } /// <summary> /// 列家2 /// </summary> public IPlayer Plyer2 { get { return _plyer2; } set { _plyer2 = value; } } /// <summary> /// 当前玩家 /// </summary> public IPlayer CurrentPlayer { get { return _currentPlayer; } } #endregion /// <summary> /// 构造方法 /// </summary> public ChessEngine() { _chessData = new ChessData(); _timer = new ChessTimer(); _timer.Elapsed += new ChessTimerElapsed(_timer_Elapsed); } /// <summary> /// 开始 /// </summary> public void Start() { if (_plyer1 == null || _plyer2 == null) { return; } _chessData = new ChessData(); _chessLogic = new ChessLogic(); _plyer1.Init(ChessType.Black); _plyer2.Init(ChessType.White); _currentPlayer = _plyer1; _plyer1.PutChess += new PutChessEventHandle(plyerPutChess); _plyer2.PutChess += new PutChessEventHandle(plyerPutChess); _timer.Start(ChessType.Black); _doChessThread = new Thread(new ThreadStart(StartDoChess)); _doChessThread.Start(); //DoChess(_plyer1); } /// <summary> /// 停止 /// </summary> public void Stop() { StopTimer(); StopThread(); } /// <summary> /// 停止计时器 /// </summary> private void StopTimer() { if(_timer != null) _timer.Stop(); } /// <summary> /// 停止线程 /// </summary> private void StopThread() { if (_doChessThread != null) { if (_doChessThread.ThreadState != ThreadState.Stopped) { try { _doChessThread.IsBackground = true; _doChessThread.Abort(); } catch (Exception ep) { string t = ep.Message; } finally { _doChessThread.Join(5000); } } } } /// <summary> /// 当一家放下棋子事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void plyerPutChess(IPlayer sender, PutChessEventArgs args) { if (_currentPlayer != sender) { //没轮他该玩家,犯规 StopTimer(); FireEvents(EventType.Illegality); StopThread(); return; } if (args.TheChessPosition.ColIndex < 0 || args.TheChessPosition.ColIndex >= 15 || args.TheChessPosition.RowIndex < 0 || args.TheChessPosition.RowIndex >= 15) { //不在范围内 StopTimer(); FireEvents(EventType.Illegality); StopThread(); return; } if (_chessData.HasChess(args.TheChessPosition)) { //这里已经有棋子了,犯规 StopTimer(); FireEvents(EventType.Illegality); StopThread(); return; } //落子 _chessLogic.PutChess(ref _chessData, new ChessInfo(args.TheChessPosition, sender.ChessType)); if (DataChange != null) { DataChange(this, EventArgs.Empty); } //检查是否赢 ChessType whoWin = _chessLogic.TestWin(_chessData); if (whoWin == ChessType.Black) { StopTimer(); FireEvents(EventType.BlackWin); StopThread(); return; } if (whoWin == ChessType.White) { StopTimer(); FireEvents(EventType.WhiteWin); StopThread(); return; } //检查是否是平局 if (_chessLogic.TestDogfall(_chessData)) { StopTimer(); FireEvents(EventType.DataFull); StopThread(); return; } //对方下棋 try { DoChess(sender == _plyer1 ? _plyer2 : _plyer1); } catch (ThreadAbortException ep) { } catch (Exception ep) { string t = ep.Message; StopTimer(); StopThread(); FireEvents(EventType.Exceptions, ep.Message); } } /// <summary> /// 下子 /// </summary> /// <param name="player"></param> private void DoChess(IPlayer player) { _currentPlayer = player; if (PlayerChange != null) PlayerChange(this, EventArgs.Empty); _timer.Tick(_currentPlayer.ChessType); _currentPlayer.DoChess(ChessData); } /// <summary> /// 开始下子 /// </summary> private void StartDoChess() { DoChess(_plyer1); } /// <summary> /// 计时器事件处理程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _timer_Elapsed(object sender, ChessTimerEventArgs e) { //判断是否超时 if (_timeLimit.Ticks > 0) { if (e.BlackPlayer > _timeLimit) { Stop(); FireEvents(EventType.WhiteWin); } if (e.WhitePlayer > _timeLimit) { Stop(); FireEvents(EventType.BlackWin); } } } /// <summary> /// 触发一个其他事件 /// </summary> /// <param name="eventType"></param> private void FireEvents(EventType eventType) { if (EventFire != null) EventFire(this, new EngineEventArgs(this, eventType)); } /// <summary> /// 触发一个其他事件 /// </summary> /// <param name="eventType"></param> /// <param name="message"></param> private void FireEvents(EventType eventType, string message) { if (EventFire != null) EventFire(this, new EngineEventArgs(this, eventType, message)); } protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { // TODO: 此处释放受控资源 if (_timer != null) { _timer.Stop(); _timer.Dispose(); _timer = null; StopThread(); } } // TODO: 此处释放所有受控资源 _disposed = true; } ~ChessEngine() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } } IChessLogic 接口,封装部分逻辑 using System; using System.Collections.Generic; using System.Text; namespace QiuQiu.ChessEngine { /// <summary> /// 棋类游戏逻辑接口 /// </summary> public interface IChessLogic { /// <summary> /// 测试是否某一方赢棋 /// </summary> /// <param name="chessData"></param> /// <returns></returns> ChessType TestWin(IChessData chessData); /// <summary> /// 测试是否是平局 /// </summary> /// <param name="chessData"></param> /// <returns></returns> bool TestDogfall(IChessData chessData); /// <summary> /// 落子逻辑,在某一点落子后的逻辑 /// </summary> /// <param name="chessData"></param> /// <param name="chessInfo"></param> void PutChess(ref IChessData chessData, ChessInfo chessInfo); } } IChessLogic 五子棋实现 ChessLogic using System;
using System.Collections.Generic; using System.Text; namespace QiuQiu.ChessEngine { /// <summary> /// 棋类游戏逻辑 /// </summary> public class ChessLogic : IChessLogic { /// <summary> /// 判断是否是某一方赢棋 /// </summary> /// <param name="chessData"></param> /// <returns></returns> public ChessType TestWin(IChessData chessData) { if (chessData.ChessCount < 9) return ChessType.None; int seriesNum = 0;//某个子连续出现的个数 ChessType nowChess = ChessType.None; //遍历列 for (int rowIndex = 0; rowIndex < chessData.RowCount; rowIndex++) { for (int colIndex = 0; colIndex < chessData.ColCount; colIndex++) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } } nowChess = ChessType.None; seriesNum = 0; } //遍历行 for (int colIndex = 0; colIndex < chessData.ColCount; colIndex++) { for (int rowIndex = 0; rowIndex < chessData.RowCount; rowIndex++) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } } nowChess = ChessType.None; seriesNum = 0; } //遍历左上到右下 for (int scolIndex = 0; scolIndex < chessData.ColCount; scolIndex++) { int rowIndex = 0; int colIndex = scolIndex; while (rowIndex < chessData.RowCount && colIndex < chessData.ColCount) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } rowIndex++; colIndex++; } nowChess = ChessType.None; seriesNum = 0; } for (int srowIndex = 0; srowIndex < chessData.ColCount; srowIndex++) { int rowIndex = srowIndex; int colIndex = 0; while (rowIndex < chessData.RowCount && colIndex < chessData.ColCount) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } rowIndex++; colIndex++; } nowChess = ChessType.None; seriesNum = 0; } //遍历左下到右上 for (int scolIndex = 0; scolIndex < chessData.ColCount; scolIndex++) { int rowIndex = 0; int colIndex = scolIndex; while (rowIndex < chessData.RowCount && colIndex >= 0) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } rowIndex++; colIndex--; } nowChess = ChessType.None; seriesNum = 0; } for (int srowIndex = 0; srowIndex < chessData.RowCount; srowIndex++) { int rowIndex = srowIndex; int colIndex = chessData.ColCount - 1; while (rowIndex < chessData.RowCount && colIndex >= 0) { ChessType currentChess = chessData.GetChess(new ChessPosition(rowIndex, colIndex)); if (currentChess == ChessType.None) { nowChess = currentChess; seriesNum = 0; } else if (currentChess == nowChess) { seriesNum++; if (seriesNum >= 5) { return currentChess; } } else { nowChess = currentChess; seriesNum = 1; } rowIndex++; colIndex--; } nowChess = ChessType.None; seriesNum = 0; } return ChessType.None; } /// <summary> /// 测试是否是平局 /// </summary> /// <param name="chessData"></param> /// <returns></returns> public bool TestDogfall(IChessData chessData) { return chessData.IsFull; } /// <summary> /// 落子逻辑,在某一点落子后的逻辑 /// </summary> /// <param name="chessData"></param> /// <param name="chessInfo"></param> public void PutChess(ref IChessData chessData,ChessInfo chessInfo) { chessData.SetChess(chessInfo.ChessPosition, chessInfo.TheChessType); } } }
参考文档:
C#网络版中国象棋游戏源代码(VS2005) C#版智能五子棋游戏(1) C#版智能五子棋游戏(3) C#版智能五子棋游戏(4)-主窗体 C#贪吃蛇小游戏的源代码 C#积木游戏(改编自DevExpress GridTetris) C#绑定TreeList的DataSource属性及获取DataRow数据 C#.NET反射枚举窗体字段成员变量 C#.Net快速开发平台|Winform快速开发平台介绍 [原创]C#一键隐藏QQ/MSN,显示/隐藏系统托盘图标,获取托盘图标 C# GridView列头添加CheckBox控件实现全选功能 C#实现DevExpress控件换肤功能 C#实现UDP穿透NAT(UDP打洞)完整版(原) C#源码-百易通智能办公系统开发平台源码-源码下载 C#源码-[CMS程序]奥硕智能建站王管理系统 v1.2_asznw-源码下载
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |