C++ 象棋引擎

我的更多想法

第一篇技术博,希望大家支持

       这几天想写一个人机象棋游戏,想到以后也可能用到,于是想把代码写成类似于一个算法引擎的代码;现阶段只是完成了一个初步的工作,即可以能够下棋、悔棋、取消悔棋。后面会继续完善代码,增加更多的功能接口;

      刚才说到关于接口,C++好像没有接口的概念;我说的接口是该引擎在用户最后使用的时候使用的函数功能,由于采用了适配器设计模式,在最后使用该算法代码的时候使用的是Chess,ChessAdapter,ChessUI这三个部分的ChessUI这部分;Chess主要集中了具体


的象棋算法,ChessUI的功能是给用户提供一个方便使用的函数功能,以及在与具体的UI代码结合的时候更方便,ChessUI是一个抽象类,需要根据你具体的程序界面实现关于移动和移除棋子的虚函数;ChessAdapter的作用当然就是为了适配Chess和ChessUI而存在的了,至于为什么要使用适配器,我觉得不用适配器也可以在ChessUI里面完成关于两部分算法结合的代码,我认为适配器的作用是为了让代码清晰逻辑明了而存在的,我想这是当初模式设计者的一个目的吧;

     关于适配器设计模式理解不是很深入,书上说的是为了解决两个类的协同工作,因为之前我写过android程序,里面的listview需要重写适配器baseadapter来自定义ListView的视图。所以我想就像是书上说的是为了解决listview的逻辑算法与界面显示的协同调用工作吧。然而我在写ChessAdapter的时候居然没有让ChessAdapter来完成具体的UI与逻辑结合工作,而是让ChessUI来完成的,那我的目的就是利用这种设计模式的思想来理清代码的思路吧,想要完整的体现适配器设计模式的思想还是有点困难,个人觉得这些设计模式就是给程序员提供代码思路,需要自己灵活的使用.嘿嘿........个人认为设计模式是一种艺术,是值得深究的,但是这里就不说了,直接来关于怎么使用这个ChessUI吧,它才是关于这些代码的使用者需要关心的地方;

    首先如果要使用ChessUI来完成象棋逻辑和GUI的结合,需要一个继承自ChessUI的子类,我们这里假如就是myCheesUI

class myChessUI:public ChessUI
{
	CCPoint pto;
	HelloWorld *target;//依赖的具体视图,这里也可以不用这个属性,可以直接用多继承啊, 
public :
	myChessUI:: myChessUI(HelloWorld* target, CPoint zero,CPoint size):ChessUI(zero,size)//意思是原点和每格棋格的大小
               {
               this->target=target;
                });
void move(int tag,CPoint to);意思是把tag标记的那个棋子移到CPoint这个点,
	void removeChess(int tag);
 };


基本上实现上面的两个函数就可以使用这个所谓的引擎来开发象棋程序了,那岂不是灰常的简单吗.其实还有很多的问题,由于当初的设计问题,由于采用了适配器模式在使用的时候需要定义这样来完成

	 chess=new CChess();
	 adpter=new ChessAdapter(chess);
	 CPoint zero,size(60,60);//CPoint 是一个在引擎代码里面的一个类,(60,60)当然就是棋格的大小啊
	 CUI =new myChessUI(this,zero,size);
	 CUI->setAdapter(adpter);

这样就可以愉快的使用了

    CUI->ButtonDown(p)

    CUI->ButtonUp(p);

        这里就表示在哪里点下,在哪里抬起,之后的事情就是美化你的程序界面和其他功能设置了,当然不是说这个引擎的功能很强大了,还有很多功能没有考虑呢,将会在后面逐渐完善吧。比如,因为人机对战的算法是比较耗时间的,需要开辟另一个线程来计算。

        由于考虑到这个代码的重用性每个操作系统平台的都不一样,呵呵....我是不是想多了呢.这个功能由于水平有限就放在后面来实现了,希望尽快实现吧.当然也希望那些大侠能提供思路,这里先说我的思路吧:把要计算的整个ChessUI当成一个线程来处理,但是ChessUI必定要和其他线程交换数据,很难避免数据的不一致性,后台计算线程在玩家完成落子后启动,这个过程中间UI线程不能调用任何的ChessUI代码的话就可以保证不会发生冲突,在后台计算完成后触发UI线程的UI事件再暂停该计算线程,那么好像冲突问题就解决了。但是线程入口函数问题,就是主要执行计算代码怎么让不同的平台的线程去调用。

   这里还有一个个人问题想和大家讨论一下,就是假如同一个对象的函数被两个线程调用会有什么问题呢?

   最后贴一张自己用Cocos2d-x完成的半成品程序截图吧,由于使用Cocos2d-x所以可以移植到手机上哦,移植到手机那个环境真是麻烦,折腾了一两天,唉,说多了都是泪啊。

    http://download.csdn.net/detail/u012706436/6618475 ;这个是代码的下载链接,由于积分尚少,所以就要一个积分吧

           

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值