五子棋人机博弈游戏(cocos creator)

Python017

五子棋人机博弈游戏(cocos creator),第1张

参考文章: 【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)

源码: goBang

思考一:作为对手的系统用什么算法下棋?

估值函数、搜索算法和胜负判断等

博弈算法,在极大极小值搜索中应用alpha-beta剪枝

智能五子棋博弈程序的核心算法

智能五子棋中的算法研究

人机版五子棋两种算法概述

思考二:人机博弈的要点

1.棋局的状态能够在机器中表示出来,并能让程序知道当时的博弈状态

2.合法的走法规则如何在机器中实现,以便不让机器随便乱走而有失公平

3.如何让机器从所有的合法走法中选择最佳的走法

4.一种判断博弈状态优劣的方法,并能让机器能够做出智能的选择

5.一个显示博弈状态的界面,有了这样的界面程序才能用的起来而有意义

思考三:五子棋下棋规矩

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。

整个对局过程中黑方有禁手,白方无禁手。

黑方禁手有三三禁手、四四禁手和长连禁手三种

思考四:人机下棋逻辑

系统先下,黑棋落子,交换下子顺序

玩家下,监测胜负(无胜负,交换下子顺序)

系统下(五元组中找最优位置),监测胜负(无胜负,交换下子顺序)

。。。

直到分出胜负(这里未考虑平局)

出现提示窗,告知玩家战局结果,同时可选择“返回菜单”或“再来一局”

具体实现:涉及知识点

官方文档--预制资源

将其改名为Chess拖入下面assets文件夹使其成为预制资源

1.在canvas节点上挂载Menu脚本组件

2.在按钮事件中,拖拽和选择相应的Target,Component和Handler

初始化棋子节点断点截图

系统为黑棋的评分表:

​ 找最优位置下子

个人想法

这是我学习五子棋游戏开发的记录,后续还会写其他游戏开发,加油!

/**

 * 

 */

package com.efounder.gwt.action

import java.util.HashMap

import java.util.Map

import poc.shared.annotations.reflection.ClassForNameAble

import com.efounder.builder.meta.bizmodel.SYS_MDL_CTN

import com.efounder.gwt.action.utils.ActionUtils

import com.efounder.gwt.form.application.util.FormScriptUtil

import com.efounder.gwt.form.base.ActionComponent

import com.efounder.gwt.form.base.DataSetComponent

import com.efounder.gwt.model.FilterDataSet

import com.efounder.gwt.model.FormModel

import com.gwtent.reflection.client.Reflectable

/**

 * 创建单据分录或明细

 * @author xiewanzhi

 * @datetime 2015年3月30日 上午9:38:34

 */

@ClassForNameAble

@Reflectable

public class FormAddItemAction extends ActionComponent implements IFormAction{

public FormAddItemAction() {

super.setActionText("增加")

}

private FormModel formModel = null

/**

 * 获取表单模型

 * @return

 */

public FormModel getFormModel() {

return formModel

}

/**

 * 设置表单模型

 * @param formModel

 */

public void setFormModel(FormModel formModel) {

this.formModel = formModel

}

private String CTN_ID = null

/**

 * 内容id

 * @return

 */

public String getCTN_ID() {

return CTN_ID

}

/**

 * 设置内容id

 * @param cTN_ID

 */

public void setCTN_ID(String cTN_ID) {

CTN_ID = cTN_ID

}

private String ctnType = SYS_MDL_CTN._BIZ_CTN_TYPE_JIDS_

/**

 * 分录类型:分录(SYS_MDL_CTN._BIZ_CTN_TYPE_JIDS_)还是辅助分录(SYS_MDL_CTN._BIZ_CTN_TYPE_JPDS_)

 * @return

 */

public String getCtnType() {

return ctnType

}

/**

 * 分录类型:分录和明细

 * @param ctnType

 */

public void setCtnType(String ctnType) {

this.ctnType = ctnType

}

/**

 * 数据集组件,FormModel,过滤器FilterDataSet等

 */

private DataSetComponent dataSetComponent = null

/**

 * 数据集组件,FormModel,过滤器FilterDataSet等

 * @return

 */

public DataSetComponent getDataSetComponent() {

return dataSetComponent

}

/**

 * 设置数据集组件,FormModel,过滤器FilterDataSet等

 * @param dataSetComponent

 */

public void setDataSetComponent(DataSetComponent dataSetComponent) {

this.dataSetComponent = dataSetComponent

}

/**

 * 执行添加分录操作

 */

@Override

public Object doAction() {

// 检查模型

assert formModel != null : "添加分录action没有关联表单模型FormModel"

// 检查内容ID

assert CTN_ID != null && !"".equals(CTN_ID) : "添加分录action没有设置内容id"

Map<String, Object> args = new HashMap<String, Object>()

//执行脚本

if("0".equals(FormScriptUtil.executeCompScripts(this,scriptContext, "beforeAdd", this, args))){

return null

}

// 增加分录

if ( SYS_MDL_CTN._BIZ_CTN_TYPE_JIDS_.equals(ctnType) ) {

if ( dataSetComponent == null ) {

formModel.setCopy(isCopyRow)

formModel.createItem(CTN_ID, isAppend, null)

}

else {

// add by LiChao 使用数据集过滤集时创建一条分录

if( dataSetComponent instanceof FilterDataSet ){

formModel.setCopy(isCopyRow)

((FilterDataSet) dataSetComponent).createItem(CTN_ID)

}else

{

formModel.setCopy(isCopyRow)

((FormModel)dataSetComponent).createItem(CTN_ID, isAppend, null)

}

}

}

// 添加辅助分录

else if ( SYS_MDL_CTN._BIZ_CTN_TYPE_JPDS_.equals(ctnType) ) {

if ( dataSetComponent == null ) {

formModel.setCopy(isCopyRow)

//modified by LiChoa 执行添加辅助分录明细动作

formModel.createPart(CTN_ID)

} else {

// add by LiChao 使用数据集过滤集时创建一条明细

if( dataSetComponent instanceof FilterDataSet ){

((FilterDataSet) dataSetComponent).createPart(CTN_ID)

}else{

formModel.setCopy(isCopyRow)

((FormModel)dataSetComponent).createPart(CTN_ID, isAppend,"")

}

}

}

//执行脚本

FormScriptUtil.executeCompScripts(this,scriptContext, "endAdd", this, args)

return null

}

/**

 * 更新button状态

 */

@Override

public void doUpdate() {

if ( formModel == null ) {

this.setEnabled(false)

return

}

// 通常单据提交之后,增加按钮不可用

if ( formModel.isEditing() ) {

this.setEnabled(true)

} else {

this.setEnabled(false)

}

//根据属性配置检查

this.setEnabled(ActionUtils.canEnable(this))

//formmodel可编辑时设置该action不可编辑  chenkai2016年10月24日

if (!canEdit) {

this.setEnabled(false)

}

//enabled = ActionUtils.canEnable(this)

super.doUpdate()

}

private boolean isCopyRow = false

/**

 * 是否复制上一行

 * @return

 */

public boolean isCopyRow() {

return isCopyRow

}

// baiguanghong 获取是否复制上一行

public boolean getIsCopyRow() {

return isCopyRow

}

public void setIsCopyRow(boolean isCopyRow) {

this.isCopyRow = isCopyRow

}

private boolean isAppend = false

/**

 * 是否追加。默认false;

 * @return

 */

public boolean isAppend() {

return isAppend

}

public void setIsAppend(boolean isAppend) {

this.isAppend = isAppend

}

boolean canEdit = true

/**

 * 设置不可编辑 chenkai2016年10月24日

 * @param canEdit

 */

public void setCanEdit(boolean canEdit) {

this.canEdit = canEdit

}

@Override

public void register() {

super.register()

registerAciton()

}

public native void registerAciton() /*-{

this.getActionText = [email protected]::getActionText()

this.setCanEdit = [email protected]::setCanEdit(Z)

this.setFormModel = [email protected]::setFormModel(Lcom/efounder/gwt/model/FormModel)

this.setDataSetComponent = [email protected]::setDataSetComponent(Lcom/efounder/gwt/form/base/DataSetComponent)

}-*/

}

软件工程专业大一都会学一个学期的C,大二会学习C++与java。 老弟,请你记住,这三门语言里面一定要精通一门,别什么都去学。软件工程重要的几科是:计算机算法、数据结构(特别重要)、操作系统、计算机网络、分布式系统。这几科理论一定要认真听课,一定要掌握好,它们决定了你日后的路能走多远,至于上面的编程语言都只是他们的实现,学习那种语言由你自己决定,如果你学的是java或者是C++,那么还要精通“设计模式”以及“面向对象理论”。下面是我学习java的路线图。

1.首先找一本简单的教材,先对java有个基本的认识(大概看那么半个月就差不多了,随便下载一本入门的书就行了)

2.然后推荐你看<<java核心技术>>,分为上下两卷,已经是第八版了,大概有一千六七百页当 你看完后,基本的java知识已经掌握了(记住,一定要多练习啊)(但是要弄懂,呵呵,至少看个三四遍吧,这两本书只要能搞懂70%就很不错了)

3.这个时候可以看看<<thinking in java>>中文名"java编程思想",这本书写的比较难,如果看完了,而且懂了,那么证明java水平到达了一个中等的层次;(去参加面试的时候问的那些java知识完全可以应付过来了)(或者可以先看下面的书,边看thinking in java这本书,这样也是可以的,而且学习的效率应该会高些)

4.然后java就会分方向,j2me(手机编程),已经过时了;j2ee方向(Web编程),先学html,javaScript,css(这些书多得数不清),然后就学servlet、jsp还有tomcat服务器,《jsp应用开发详解》(入门) 《Servlet与JSP核心编程》(核心) 《Tomcat与Java Web开发技术详解》这几本书还不错,然后就可以学习SSH

5.学习数据库理论、JDBC(最好能够学好oracle),学习struts的时候建议从struts1开始学起《精通Struts基于MVC的Java Web设计与开发》,然后就可以学习struts2《Struts2权威指南》,接下来学习Hibernate《精通Hibernate:Java对象持久化技术详解》,最后学习Spring《spring2.0技术手册》和EJB《Enterprise JavaBeans, 2nd Edition》(提示:只要java基础学得好,这些东西都会学得很快)

6.这个时候就要把注意力放在设计模式(做应用特别重要),数据结构和计算机算法上面来了,设计模式可以先看<<深入浅出设计模式>> 然后再看<<java与模式>>, 数据结构可以看清华大学严慰敏老师写的那本教材;计算机算法要了解基本的排序,如果时间充裕可以看那个<<算法导论>。 (设计模式,数据结构和算法才是真正的精髓,光看懂还不行的,一定要多练习多思考) ,理论上来说,5万行以上的代码量可以看懂设计模式,20万行以上可以运用设计模式 (第一个重点)

7.等掌握前面的这些知识之后,推荐看<<effective java>>,这本书是目前java领域公认的高级书籍。在项目中肯定会遇到一些前端的知识,那么得精通javascript、Ajax,<<JavaScript权威指南>>(入门), <<JavaScript高级程序设计>>(进阶),这两本书弄懂了,那么学习jquery和extjs都会很快的<<深入浅出ExtJS>>和《锋利的jQuery》。

8.学习SSH源码,里面的思想太多太有用了。不要心急,不要图快,所有的书要一本本的慢慢看,多看几遍(一本书看上个四五遍,就可以成高手,呵呵)。

9.java基础(j2se)的重点有:继承、多态、流、线程、网络编程、反射、集合、数据库连接、泛型、JNI技术、分布式技术还有解析xml也是很重要的,如果你想学android手机编程,那么SWING和AWT要熟悉一下。《Google+Android开发入门与实战》(入门) 《Google Android SDK开发范例大全》(深入)(建议把android当作业余爱好,把web编程当作主攻方向,因为j2ee包含了大量框架知识),书很多,可以自己去搜。多想 多看 多练才是王道,不要相信什么培训机构,这些都没啥用,真正学好只能靠自己。

10.面向对象思想+java基础(j2se)+数据结构+设计模式+计算机算法为核心,本科生什么都可以不学好,唯独这几科一定要学好,切记切记!(第二个重点)

11.学完以上的知识,可以做一个ERP系统了,不过这些都还只停留在Web application阶段,这里也是本科生与研究生的分水岭!

12.互联网的制高点是Web Service,前端是J2EE+移动终端(Android、IOS、黑梅),后端是linux操作系统。

12.那么如何将大量的服务器集成呢?如何把一个工作分为多个任务分发给多个服务器来处理呢?如何将解决多个服务器之间通信的问题呢?如何解决服务器之间高并发的问题呢?

如何建立一个Web Service提供接口让外界调用呢?(这些都是研究生学习的内容)http://www.ibm.com/developerworks/cn/education/java/j-cxf/section2.html

13.深入理解计算机网络、操作系统、分布式系统的原理知识。学习RMI、JMS、《JAVA消息服务》,《JAVA并发编程实践》对这些问题都有一个初步的介绍与实现

14.学习linux操作系统《鸟哥的私房菜》

15.学习处理服务器端的海量数据,云计算等知识 《Hadoop权威指南》

16.集成系统的时候,有可能上游企业用的是其他的语言,那么你还得去学另外的语言。

17.掌握一门脚本语言,比如ruby

18.软件工程的名言 “什么是专业?专业就是你比别人花更多的时间!”(多花时间) “最好的最厉害的招式就是没有招式!”(设计模式的最高境界)