从开始着手做五子棋,到现在已经有一段时间了。这个项目也算告一段落。 从开始做的网络版,再到加入人机元素, 可谓是耗尽精力。 人机水平达到了比较牛逼的程度,可以战胜大多数人(略显夸张。。) 大言不惭的说最好,也是不符合程序猿严谨的风格,在新手中看来这个程序应该是写的可以了。但大牛看来就是乱七八糟(被大牛吐槽过)。。人机写到这个程度感觉再要进一步很难了。所以就先把这个版本发出来。
先看下效果图吧。 还是很漂亮的吧。这个界面也花了我很久的时间。
登陆界面
人机界面
可以更换背景
网络人人版
可下棋聊天
然后说下 一些做的不好的地方吧
1.我做了两个版本 一个是客户端一个是服务端, 必须先启动服务端 然后用客户端去连接客户端。(我想做成就一个版本, 任意打开的两个可以互联,但是一直没成功,求大神指导思路)。
2.棋子直接用画布画的圆圈没有用图片,不太好看。
3.最新下的棋子没有加入闪烁效果,棋子多了 可能分不清对方是在哪里下子
总代码太长了 ,我就发下人机代码了 ,这是核心
电脑下棋思路: 15*15的五子棋盘一共有572种 成“5”组合。我们称这种组合为获胜组合。而保存这572种组合的表称为获胜表。每次下棋后,都要更新所以获胜组合情况(“5”中的棋子个数更改)。而电脑下棋前 扫描每个位置,看包含这个位置的所有组合,根据评估函数打分。分数有两个,一个是这个位置对电脑的得分,一个是对玩家的得分。。 电脑每次选取分数最高的地方下子。 五子棋人机思路及具体做法我做了个PPT ,大家可以下载看看,讲的很详细了。有什么不懂的地方欢迎留言。有什么可以改进的地方也欢迎留言指教!
package client; import java.awt.Point; public class ComputerNormal { static Integer[][][] pTable; // 人的获胜表 static Integer[][][] cTable;// 机器的获胜表 //win[0][k]:表示玩家在第k个获胜组合往其方向有win[0][k]个连续的黑棋。 //win[0][k]取值为9则表示第k个获胜组合被封死了,没有成5的可能。 // win[1][k]:表示计算机在第k个获胜组合往其方向有win[1][k]个连续的白棋。 static Integer win[][]; static int row = 15; static int col = 15; public ComputerNormal() { InitBoard(); } public static Point cPutChess(Integer map[][]) { //机器下子 判断机器分 int maxi = 0,maxj = 0; int max=-999999; for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { if(map[i][j]!=0) continue; int t=GiveScore(1, i, j); if(max<t) { max=t; maxi=i; maxj=j; } } } //机器下子 判断ren分 int mini = 0,minj = 0; int min=0; for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { if(map[i][j]!=0) continue; int t=GiveScore(2, i, j); if(min>t) { min=t; mini=i; minj=j; } } } int lastx=maxi,lasty=maxj; if(max<=Math.abs(min)) { lastx=mini; lasty=minj; } Point p = new Point(lastx,lasty); return p; } //人下子后的状态变化 public static void pboardModify( int x, int y ) { for( int k=0; k<572; k++ ) //修改玩家下子后棋盘状态的变化 { //如果[x][y]位置是玩家第k个"5"中的位置,且第k个"5"没有被封死 if( pTable[x][y][k]==1 && win[0][k]!=9 ) win[0][k]++; //如果[x][y]位置是计算机第k个"5"中的位置,则玩家下子后第k个"5"被封死 if( cTable[x][y][k]==1 ) //○●○○○ { cTable[x][y][k] = 0; win[1][k] = 9; } } }//pboard //计算机下子后的状态变化 public static void cboardModify( int x, int y ) { for( int k=0; k<572; k++ ) //修改计算机下子后,棋盘的变化状况 { //如果[x][y]位置是计算机第k个"5"中的位置,且第k个"5"没有被封死 if( cTable[x][y][k]==1 && win[1][k]!=9 ) { win[1][k]++; } //如果[x][y]位置是玩家第k个"5"中的位置,则计算机下子后第k个"5"被封死 if( pTable[x][y][k]==1 ) //●○●●● { pTable[x][y][k] =0; win[0][k] = 9; } } }//cboard /** * 估值 */ static int GiveScore( int type, int x, int y ) { int k, score = 0; for( k=0; k<572; k++ ) { if( type==1 ) //计算机下 { if( cTable[x][y][k]==1 ) //[x][y]是第k个"5"上的一个位置 { //第k个"5"中已经有win[1][k]个位置了 switch( win[1][k] ) { case 1: score += 5; break; case 2: score += 50; break; case 3: score += 500; break; case 4: score += 5000; break; default: break; } } } else //玩家下 { if( pTable[x][y][k] ==1) //[x][y]是第k个"5"上的一个位置 { //第k个"5"中已经有win[0][k]个位置了 switch( win[0][k] ) { case 1: score-=5; break; case 2: score-=50; break; case 3: score-=500; break; case 4: score-=5000; break; default: break; } } } } return score; } public static void InitBoard() { int i, j, k; pTable=new Integer[15][15][572]; cTable=new Integer[15][15][572]; for (i = 0; i < row; i++){ pTable[i]=new Integer[15][572]; cTable[i]=new Integer[15][572]; for (j = 0; j < col; j++) { pTable[i][j]=new Integer[572]; cTable[i][j]=new Integer[572]; for (k = 0; k < 572; k++) { //pTable[i][j][k]=new Integer(); pTable[i][j][k] = 0; cTable[i][j][k] = 0; } } } int count = 0; int x,y; // 横着的获胜组合 for (x= 0; x < 15; x++) { for (y= 0; y < 11; y++) { for (k = 0; k < 5; k++) { pTable[x][y+ k][count] = 1; cTable[x][y+ k][count] = 1; } count++; } } //竖的获胜组合 for (y = 0;y < 15; y++) { for (x = 0; x < 11; x++) { for (k = 0; k < 5; k++) { pTable[x+k][y][count] = 1; cTable[x+k][y][count] = 1; } count++; } } //主对角线 for( x = 0; x < 11; x++ ) { for( y = 0; y < 11; y++ ) { for( k = 0; k < 5; k++ ) { pTable[x+k][y+k][count] = 1; cTable[x+k][y+k][count] = 1; } count++; } } //次对角线 for( x = 4; x < 15; x++ ) { for( y = 0; y < 11; y++ ) { for( k = 0; k < 5; k++ ) { pTable[x-k][y+k][count] = 1; cTable[x-k][y+k][count] = 1; } count++; } } //初始化win win=new Integer[2][572]; win[0]=new Integer[572]; win[1]=new Integer[572]; for( k = 0; k < 572; k++ ) //初始化win数组 { win[0][k] = 0; win[1][k] = 0; } //初始化结束 }//init 结束 }
自己也知道有很多做的不好的地方,很多需要改进的地方。
欢迎大牛指点!
相关推荐
本程序通过selenium库和random库调用Google Chrome浏览器模拟人的手工操作,通过在关键词查询框里随机输入关键词、并设置键入的时间间隔模拟人的输入行为,然后再控制浏览器随机翻页,真正像普通人一样操作浏览器规避亚马逊的防爬虫机制。根据预定的关键词列表查询产品,然后通过BeautifulSoup解析查询结果获取亚马逊产品的价格、标题、ASIN、评论等信息,并将这些产品保存为本地csv文件,方便在Excel里分析处理。
微信诗词鉴赏小程序【基于微信小程序的在线诗词鉴赏平台】是一个以微信小程序为载体,专注于古代诗词鉴赏的项目 此项目旨在打造一个便捷、全面的移动端诗词学习与交流平台,让用户能够随时随地沉浸在中华
【毕业设计】Python的Django-vue的摄影交流平台源码(完整前后端+mysql+说明文档+LW+PPT).zip
基于Matlab Simulink的三相两电平逆变器矢量控制系统的仿真波形动态分析及其性能优化研究报告,基于Matlab Simulink仿真平台下的两电平逆变器矢量控制系统动态分析及其波形研究,基于Matlab Simulink的两电平逆变器矢量控制系统的仿真波形的动态分析 不,需要的资料,文档有 ,基于Matlab; Simulink; 两电平逆变器; 矢量控制系统; 仿真波形; 动态分析,基于Simulink的逆变器矢量控制系统动态仿真分析
【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:FinsDLL文件及调用手册 资源类型:程序源代码 源码说明:本人依据 Omron 通讯手册 编写的.DLL 使用 C# 开发 可以实现 对 OMRON PLC 内部寄存器 D区 M区 CIO区 HR区 字 。位 的 读写操作 以及 AR 区 字、位的读操作。使用方便 直接按照调用手册 操作步骤即可实现读写功能。 适合人群:新手及有一定经验的开发人员。内容来源于网络分享,如有侵权请联系我删除。
资源说明:https://editor.csdn.net/md/?articleId=129220710#323_oled_148 本设计的电梯系统采用的是stm32微处理器。STM32处理器是基于Cortex-M3架构的嵌入式微处理器MCU,其中Cortex-M3架构是ARM公司推出的。STM32处理器具有高速、高集成度、低功耗、高可靠性等优点。正是由于STM32处理器具有这些优点,它正适合运用于电梯控制。本设计中的电梯控制系统主要运用了STM32处理器GPIO口操作和其精确地定时功能。该电梯系统一共分6个部分,它们是 STM32处理器、电源系统、数码管显示器、键盘、LED小灯、直流电机驱动模块。这些部分是直接与STM32的GPIO口连接的,所以它们占用的GPIO口较多。 各功能模块简介: (1)电源系统:为整个系统提供+5V电源; (2)键盘:每个键位互不影响用以控制电梯运行状态; (3)LED指示小灯:用以指示小健是否被按下和电梯门开关状态; (4)4位8段数码管:用于显示电梯内部和每层电梯外部电梯所在的层数; STM32开发板:通过写入程序代码来控制电梯的运行状态。。。。。。。
推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等)及多语言参考,推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等多套实现),Matlab人脸识别源码6套,可运行(包括PCA算法,Adaboost算法,DLDA算法,费舍尔算法等)。 另含多套文档及JAVA,PYTHON,C#,OPENCV人脸识别源码可供参考 源码很多,请优先选择Matlab文件夹且标题里含有(推荐)标识者 ,Matlab人脸识别源码; PCA算法; Adaboost算法; DLDA算法; 费舍尔算法; JAVA,PYTHON,C#人脸识别源码; OPENCV人脸识别源码; 推荐标识; 优先选择Matlab文件夹。,Matlab人脸识别源码合集(推荐PCA、Adaboost、DLDA算法,含多套文档及跨平台源码)
分割资源UE5.3.z21重传
Labview操作者框架结合ADS与Twincat控制器:ST语言与EtherCAT总线控制工程项目资料,LabVIEW操作者框架结合ADS与Twincat控制器:Ethercat总线控制工程项目资料,labview操作者框架+ADS+twincat2(twincat3) st语言ethercat总线控制工程项目资料 twincat控制器+twincat资料 到手能用,labview界面+控制器 ,labview操作者框架; ADS; twincat2/3; st语言; ethercat总线控制; 控制器; 可用资料,LabVIEW操作者框架与TwinCAT控制器:Ethercat总线控制工程项目资料
基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,无人船 无人艇路径跟踪控制 fossen模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping ,无人船; 无人艇; 路径跟踪控制; Fossen模型; Matlab Simulink效果; 基于观测器的LOS制导; 反步法控制; ELOS+backstepping,基于Fossen模型的无人船路径跟踪控制:ELOS与反步法联合控制的Matlab Simulink效果分析
基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,【pmsm0512】MATLAB simulink永磁同步电机的矢量控制。 PMSM的矢量控制 ,PMSM; 矢量控制; MATLAB Simulink; 永磁同步电机; 0512,MATLAB Simulink PMSM矢量控制策略研究
深圳绿新威推出的GS2113S 半桥驱动芯片 应用于逆变器驱动 电机驱动等采用高压工艺
PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比,电流环PI滞环策略的建模与实现,PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比分析,电流环PI滞环方案搭建与验证,附详细说明文档及参考资料,PMSM永磁同步电机矢量控制simulink模型,包括matlab模型,两种方案对比,分别为速度环采用pi和滑模变结构对比,电流环采用pi滞环,搭建过程清晰且包含说明文档和其他附带参考资料。 ,PMSM永磁同步电机;矢量控制;Simulink模型;Matlab模型;速度环对比(PI vs 滑模变结构);电流环(PI滞环);搭建过程;说明文档;附带参考资料。,PMSM矢量控制Simulink模型:PI与滑模变结构方案对比
prov year 光缆线路长度/地区面积 安徽 2010 2.852140 4 安徽 2011 3.5921078 安徽 2012 4.3320751 安徽 2013 5.0716782 安徽 2014 5.8315897 安徽 2015 6.9423647 安徽 2016 9.9900103 安徽 2017 12.844298 安徽 2018 15.698587 安徽 20 19 16.412159 安徽 2020 17.125731 安徽 2021 17.839304 安徽 2022 19.266447 北京 2010 6 .5243206 北京 2011 8.9830551 北京 2012 11. 44179 北京 2013 13.407351 北京 2014 14.728 941 北京 2015 16.79026。内容来源于网络分享,如有侵权请联系我删除。
该资源为imutils-0.5.2.tar.gz,欢迎下载使用哦!
Matlab Simulink电机启动模型:模拟电压暂降及电能质量问题,适配IEEE 33节点模型研究,利用Matlab Simulink的电机启动模型精准模拟电压暂降等电能质量问题:适配IEEE 33节点模型,电机启动模型 Matlab simulink 可用于模拟电压暂降等电能质量问题,适配于本家的IEEE 33节点模型。 ,电机启动模型; Matlab Simulink; 电压暂降模拟; 电能质量问题; IEEE 33节点模型; 适配性。,Matlab Simulink电机启动模型:模拟电压暂降电能质量问题的适配IEEE 33节点模型
美赛教程&建模&数据分析&案例分析
台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,地址映像IO,高通用性与扩展性,快速项目实施利器。,台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,灵活高效可移植扩展,台达as系列plc程序模板。 本程序根据多年现场实际经验并参照车企通用模板编写,含6轴手动程序。 1+6(带一分支,可扩分支)自动流程程序。 io采用地址映像。 通用和可扩展性,可移植性强。 非常灵活,可为你项目实施节约大量宝贵时间。 ,台达AS系列PLC; 程序模板; 6轴手动程序; 1+6自动流程程序; IO地址映像; 通用可扩展性; 移植性强; 时间节约。,台达AS系列PLC程序模板:通用可扩展的自动化流程程序
S32系列MCU的S32K144与S32K148 Boot、网络与UDS标定程序定制服务,包含UDS烧写上位机解决方案,S32系列MCU的S32K144与S32K148的boot加载与网络通讯技术——包含UDS烧写及标定程序定制服务,S32k144,S32K148的boot,网络,uds,标定程序订做,包含uds烧写上位机 ,S32k144; S32K148; boot程序订做; 网络功能; UDS烧写; 上位机标定程序,S32系列MCU Boot网络UDS标定程序订制及UDS烧写上位机开发