Java设计网络黑白棋下载,它是如何将落子信息传给对方

计算概论大作业——黑白棋AI设计 - 算法 -
计算概论大作业——黑白棋AI设计
一周前从学长那得知了北京大学计算概论的大作业黑白棋AI,正好最近从炉石脱坑,去凑了个热闹
网站上有规则和交互方式,在此不再赘述
游戏界面大概长这样,支持bot间或者人机对战
每回合要求程序读入局面信息,输出落子位置
1.一开始熟悉一下给出的样例程序的框架,做一些小测试。
因为之前没怎么接触黑白棋,也不懂有什么策略。样例给出的是随机落子,就把样例修改了一下,比如每次选择能占有最多格子的落子处,结果打不过样例……
(1)极大极小搜索与AlphaBeta剪枝
一般AI的框架是把局面做一个估价,反应某一方的情况,数值越大代表优势越大,然后构建博弈树通过搜索得到较优策略。
比方说上面就是把占有的格子数当做一方的估价
假设博弈的两方叫做A和B,不妨设当前轮到A
如果A只考虑走一步,那么当然是走到一个对A估价最大的局面
如果A能往后考虑到B的下一步,B要走一个对A估价最小的局面,那A的落子就要使得下一步B落子后局面对A估价尽量大
A往后考虑若干步,以此类推,要使得A若干步后到达的局面对A估价尽量大。
局面之间形成一个树形结构,因为每一方每次有约10种走法,我们将博弈树限制在7-10层。
叶结点局面直接估价,其余结点用上述思路在树上深搜得出估价。
还有一个AlphaBeta剪枝,是说搜索一个结点的一些子节点一定不会改变这个结点的估价,就考虑剪枝
这两部分具体参见
可以通过改变搜索顺序来提高效率,在开局和终局也可以适当增加搜索树层数
3.初步研究估价函数
围棋中有一个术语,叫做“金角银边草肚皮”,黑白棋也适用,意思是格子的重要性不同
角是一般比赛中获胜的关键,为了尽可能占有角,每个角周围三个格子(星位)就尽量不去占
因此我们给不同的格子制定不同的权值,而不是单纯以占有格子数来评价局面
行动力与稳定子
看了基本的黑白棋策略,发现有这两个概念
行动力:可选落子点总数。
稳定子:不可能被翻转的子。(右上角的一些黑棋是稳定子)
稳定子不好精确计算,我们仅把那些八个方向都没有空格的子视为稳定子
实际上这是一个充分不必要条件
前期对局势的判断,应当基于这两个参数
一个区域指的是棋盘上一块空着的区域,通常(并非总是)包括一个角,与其它区域隔开(右上角是一个区域)。
如果要填入一个偶数空的区域,通常最后下入其中要好一些。这就是说,你希望对手先下入区域,之后你跟进,试图吃回一些你的对手刚刚吃掉的棋子。
这是黑白棋中一个很重要的理论,在实践中发现它很有效,一个区域大小 &= 6 时我尝试将奇偶性考虑在内,如果落子的区域大小为奇数,则提高估价,否则减少这一步的估价,即我们希望在奇数区域落子。
经过观察,我得出了一些结论
通常一方跳过回合会导致失败,少有例外
在游戏早期,一方的子越少越有利,这可能跟行动力有关
失败的一方通常在边角的占领上处于劣势,强大的AI较重视边上的稳定子
4.改进估价函数
对一个局面的估价越准确,AI的决策就会越明智,我发现对战中常出现这样的情况
如左图,白方占领了边上中间的若干个,但是这些子不稳定,黑方占有1B和1H的可能性提高
甚至如右图,边上的白子很大可能被翻
——有时去占边并不能占到便宜
改进AI对边的评价,设计一个动态规划算法,只考虑边上一行/列的8个棋子,给这3^8种情况的估价
八个格子占满的估价直接计算,角的权重2,边的权重为1
否则考虑一方有一定概率在某个空格落子
比如左图,三个格子黑白方等概率占,右图1B黑方有大概率占,1A黑白方等概率
使用记忆化搜索转移
当边上形成稳定子时,估价会明显提高,鼓励AI形成边上的优势
大概思路如此,再花一些时间调整参数,花了几个晚上
代码390行,目前botzone天梯已进前5名
3152882<FONT face=楷体
"自己选择的路,跪着也要走完"
图包度娘盘340*240(9M) 356t
WP-Cumulus by
9 or better.
本站热门109099560542750352607238916221220836Myfriends基于JAVA的网络五子棋游戏开发
&|&&|&&|&&|&&|&
您现在的位置:&&>>&&>>&&>>&&>>&正文
基于JAVA的网络五子棋游戏开发
&&&&&&&&&&★★★
【字体: 】
基于JAVA的网络五子棋游戏开发
作者:&&&&毕业设计来源:本站原创&&&&点击数:&&&&更新时间:&&&&
开发环境:java摘要:五子棋是我国古代的、传统的黑白棋种之一,大约在南北朝时期随围棋一起先后传入朝鲜、日本等地。五子棋在日本叫“连珠棋”。通过一系列的规则变化使连珠五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。日,国际连珠联盟(RIF)由日本、俄罗斯、瑞典、亚美尼亚等九个成员国在瑞典宣告成立。五子棋在国内外发展速度相当快,预计在几年后,五子棋能在很多国家形成热门运动。我国也不例外,在很多热衷于五子棋事业的棋手的共同努力下,有望在不久的将来成为五子棋运动的中心。本系统是采用了JAVA技术,使用myeclipse6.0编译软件开发的网络五子棋游戏本着操作简单,界面友好,功能实用的设计原则实现了人与人之间的游戏对战以及人与电脑之间的对战。该系统是以休闲娱乐为主的一款网络小游戏,供大家放松心情。关键词:五子棋,基于JAVA,myeclipse6.0 ----目录:1& 引言&11.1& 国内外研究现状、水平和发展趋势&11.2& 研究背景与研究目的及意义&11.2.1& 研究背景&11.2.2& 研究目的及意义&11.3& 系统可行性分析&21.3.1& 课题调研&21.3.2&& 经济可行性&21.3.3&& 技术可行性&21.3.4& 操作可行性&21.3.5& 法律可行性&31.4& 各章内容简介&32& 系统需求分析&32.1& 系统的功能分析&32.1.1& 系统的可靠性和可用性需求分析&42.1.2& 用户需求分析&42.2& 系统开发与运行环境确定&42.2.1& 系统开发&42.2.2& 系统运行环境&52.2.3& 开发工具的选用及介绍&52.2.4& 配置JDK&73& 系统设计&93.1& 系统总体系结构设计&103.1.1& 棋盘类基本功能分析&113.1.2& 信息传送类基本功能分析&113.1.3& 用户类基本功能分析&113.1.4& 服务器类基本功能分析&113.1.5& 客户端类基本功能分析&113.1.6& 系统运行类基本功能分析&113.2& 模块划分及系统流程&113.2.1& 系统模块划分介绍&113.2.2& 系统流程图&123.3& 关键技术和难点&123.3.1& Java Socket网络编程&123.3.2& Java图形编程&153.3& 算法详解及判断胜负方法介绍&173.3.1& 五子棋人工智能算法详解&173.3.2& 游戏胜负判断方法简解&184& 详细设计&184.1& 网络对弈的具体设计与实现&194.1.1& 网络对弈部分程序主体流程图&194.1.2& 五子棋客户端设计&194.1.3& 五子棋服务器端设计&214.1.8& 服务器端主体流程图&224.2& 网络对弈类的设计与实现&234.2.1& 信息传送Message类的设计与实现&234.2.2& 支持网络对弈的服务器Server类的设计与实现&234.2.3& 支持网络对弈的客户端ServerOneClient类的设计与实现&244.2.4& 玩家Player类的设计与实现&254.2.5& 网络对弈中对战玩家组Group类的设计与实现&254.3游戏界面的设计&255& 用户使用手册&305.1& 系统环境说明&305.2& 系统简介&305.2.1& 系统特点&305.2.2& 操作方法&305.3& 游戏需要改进的地方&326& 毕业设计心得与体会&32参 考 文 献&36----论文介绍:1.4& 各章内容简介第1章引言,这部分主要讲述的是课题的研究背景和意义,系统的可行性分析以及各章的内容简介。第2章系统需求分析,这部分只要包括系统的功能分析,开发和运行环境。第3章主要内容是:系统设计,包括系统总体系结构设计,模块化分及系统流程,关键技术和难点,算法详解及判断胜负方法介绍。第4章主要内容是:详细设计部分,主要描述主要模块的功能,对一些界面的设计,还有部分代码。第5章主要内容是:用户使用手册,包括系统环境,系统的使用方法及不足之处。第6章主要内容是:本毕业设计的心得体会。
毕业设计录入:admin&&&&责任编辑:admin&
上一篇毕业设计: 下一篇毕业设计: 没有了
【】【】【】【】【】
相关毕业设计
没有相关毕业设计
  毕业设计吧java-----五子棋小游戏(二)-----黑白棋落子制作 - 博客频道 - CSDN.NET
Be Careful
分类:java
一、代码实现
package org.like.game.
import java.awt.C
import java.awt.F
import java.awt.G
import java.awt.T
import java.awt.event.MouseE
import java.awt.event.MouseL
import java.awt.image.BufferedI
import java.io.F
import java.io.IOE
import javax.imageio.ImageIO;
import javax.swing.JF
import javax.swing.JOptionP
public class FiveChessFrame extends JFrame implements MouseListener
int width = Toolkit.getDefaultToolkit().getScreenSize().
int height = Toolkit.getDefaultToolkit().getScreenSize().
BufferedImage bgImage =
int x = 0;//存放鼠标点击位置的x坐标
int y = 0;//存放鼠标点击位置的y坐标
int[][] allChess = new int[19][19];//一个19*19的二维数组,0代表无棋子,1代表黑棋,2代表白旗,这样能保存之前的落子,避免repaint后,只有一个棋子显示,默认数组所有值都为0
boolean isBlack =//用来判断下一步是否下黑棋
public FiveChessFrame()
this.setTitle(&五子棋&);
this.setSize(500,500);
this.setLocation((width-500)/2,(height-500)/2);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.addMouseListener(this);
bgImage = ImageIO.read(new File(&F:/mypicture/java/background.jpg&));
catch (IOException e)
e.printStackTrace();
public void paint(Graphics g)
g.drawImage(bgImage,3,20,this);
g.setFont(new Font(&黑体&,Font.BOLD,20));
g.drawString(&游戏信息:&, 150, 50);
g.setFont(new Font(&宋体&,0,14));
g.drawString(&黑方时间:无限制&, 45, 470);
g.drawString(&白方时间:无限制&, 260, 470);
for(int i=0;i&19;i++)
g.drawLine(13, 70+20*i, 372, 70+20*i);
g.drawLine(13+20*i,70,13+20*i,430);
g.fillOval(71, 128, 4, 4);
g.fillOval(311, 128, 4, 4);
g.fillOval(311, 368, 4, 4);
g.fillOval(71, 368, 4, 4);
g.fillOval(311, 248, 4, 4);
g.fillOval(191, 128, 4, 4);
g.fillOval(71, 248, 4, 4);
g.fillOval(191, 368, 4, 4);
g.fillOval(191, 248, 4, 4);
for(int i=0;i&19;i++)//输出棋盘上所有的棋子
for(int j=0;j&19;j++)
if(allChess[i][j] == 1)
x = i * 20 + 13;//各个相邻横线和各个相邻竖线的距离是20,棋盘距离边界13
y = j * 20 + 70;
g.fillOval(x-7, y-7, 14, 14);//画大小为14的圆,x,y都减7使圆心在交叉线处
if(allChess[i][j] == 2)
x = i * 20 + 13;
y = j * 20 + 70;
g.setColor(Color.WHITE);//设置颜色为白色,默认是黑色
g.fillOval(x-7, y-7, 14, 14);
g.setColor(Color.BLACK);
g.drawOval(x-7, y-7, 14, 14);//在实心白圆的外边画一个空心黑圈
public void mouseClicked(MouseEvent e)
public void mousePressed(MouseEvent e)
x = e.getX();
y = e.getY();
if(x &= 13 && x &= 372 && y &= 70 && y &= 430)//判断鼠标点击位置是否在棋盘内部
x = (x - 13) / 20;//使坐标与二位数组坐标对应起来
y = (y - 70) / 20;
if(allChess[x][y] == 0)//判断那个地方是否有棋子,如果有,就弹出窗口提示
if(isBlack)
allChess[x][y] = 1;//存储棋盘上这个地方的棋子信息
isBlack =//使得下次落子显示白棋
allChess[x][y] = 2;
isBlack =//使得下次落子显示黑棋
this.repaint();//重新调用paint()绘制一遍
JOptionPane.showMessageDialog(this, &当前位置已经有旗子了,请重新落子!&);
public void mouseReleased(MouseEvent e)
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public static void main(String[] args)
FiveChessFrame ff = new FiveChessFrame();
二、效果展示
排名:千里之外
(22)(9)(10)(1)(1)(4)(1)(6)(3)(1)(1)(1)(1)(4)(1)(1)(0)(1)APP看帖 扫一扫!手机看帖更爽
*您的个人信息我们将严格保密,请放心填写
共21个关于&&的回复
畅玩在酷开,大家一起嗨!
& &这种小游戏还是挺有意思的,还可以益智,感谢楼主分享& &
畅玩在酷开,大家一起嗨!
觉得玩这样的游戏是比较费脑子的,所以一般智商不够是玩不了的&&
畅玩在酷开,大家一起嗨!
也算是比较经典的游戏吧,之前就有玩过,还是在电视上面呢&&
畅玩在酷开,大家一起嗨!
下棋我只会五子棋除了五子棋其他的棋都不会下
畅玩在酷开,大家一起嗨!
好像是很好玩的,不过自己不会下棋也玩不了了
畅玩在酷开,大家一起嗨!
很不错的一款小游戏,可以下载在手机上面,无聊的时候玩一玩
畅玩在酷开,大家一起嗨!
很经典的游戏,感谢楼主分享!
畅玩在酷开,大家一起嗨!
黑白棋黑白棋
畅玩在酷开,大家一起嗨!
大家一起嗨!
畅玩在酷开,大家一起嗨!
大家一起嗨!
畅玩在酷开,大家一起嗨!
经典的桌面休闲小游戏
畅玩在酷开,大家一起嗨!
现在很多规则都忘了,小时候经常玩。
畅玩在酷开,大家一起嗨!
简单易学,经久耐玩,很不错的棋牌游戏,支持楼主、
畅玩在酷开,大家一起嗨!
小时候那会都是拿石子玩呢,哪有现在这么好
畅玩在酷开,大家一起嗨!
还可以悔棋啊,那还有什么可玩性,一点难度都没有了。
畅玩在酷开,大家一起嗨!
在电视上玩没意思,系统都太垃圾了,一点挑战意义都没有。
畅玩在酷开,大家一起嗨!
我还是喜欢玩一些大型的网游,小游戏都是浪费时间的。
畅玩在酷开,大家一起嗨!
大家一起嗨!
畅玩在酷开,大家一起嗨!
大家一起嗨!
在线王勋章
16年度限量专属
16年度限量专属
酷开社区用心与你在一起
本周推荐度
本周明星用户
萌萌哒的我,美食做的相当棒,关注我肯定木错
敏锐洞察者,产品达人,激情小马达,新晋男神。
一双电眼,捕捉戏中善恶点滴,照亮戏外人生
在线王勋章
16年度限量专属
16年度限量专属
酷开社区用心与你在一起
川网文[6号 Copyright 2006-
All Rights Reserved
ICP备案证书号: 蜀ICP备号&&许可证号码:川B2-

我要回帖

更多关于 黑白棋在线游戏 的文章

 

随机推荐