6月27日
围棋游戏的实现
摘 要
围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。
关键词:数据结构; 围棋游戏; 信息自动化,JAVA
目 录
第1章 引言
第2章 系统功能需求分析
2.1 问题描述:
2.2 需求分析
第3章 概要设计
3.1 抽象数据类型(ADT)
3.3 系统流程图
第4章 详细设计
4.1 重要程序段1
4.2 重要程序段2
4.3 重要程序段3
4.4 重要程序段4
4.5 重要程序段5
4.6 重要程序段6
第5章 调试分析
第6章 运行结果
第7章 总结体会
附录
第1章 引言
此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制, 再加入复选框,按钮,标签及实现本游戏的用户界面布局。
在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。
第2章 系统功能需求分析
2.1 问题描述:
设计一个简易的围棋游戏。盘面有纵横各十九条等距离、垂直交叉的平行线,共构成361个交叉点(以下简称为"点")。棋子分黑白两色。对局双方各执一色棋子,黑先白后,交替下子,每次只能下一子。 棋子下在棋盘的点上。棋子下定后,不得向其它点移动。轮流下子是双方的权利,但允许任何一方放弃下子权。谁占据的点位越多谁获胜。
设计要求:
(1) 要求实现图形化界面;
(2) 要求实现棋谱的记录;
(3) 要求实现人人对弈和人机对弈;
2.2 需求分析
主要功能包括:
能实现联机对战,和单机版游戏对战。
开始游戏之后:
1、用户双方自行选择白棋和黑棋。
2、任何一方可以随时随地认输,游戏结束。
4、要实现围棋最基本吃掉对方的法则。
此设计为本人原创作品。其中包括:源程序,可执行程序,论文,录像,使用说明。
(1)有一个或多个游戏服务器启动特定游戏服务;
(2)游戏者到游戏网站下载客户端程序并申请游戏账号。然后启动客户端程序通过某种网络协议连接游戏服务器。
(3)客户端负责处理客户端显示和操作界面,具有简单的逻辑处理功能力, 同时负责接收发送与服务器端交互的数据包。
(4)服务器程序负方处理服务器端逻辑、游戏逻辑、客户之间的网络信息传递,以及数据库之间的数据读取保存工作。 同时服务器端还要承担客户端数据的接收、转发工作。
第3章 概要设计
3.1 设计思路
此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制, 再加入复选框,按钮,标签及实现本游戏的用户界面布局。
在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。
3.2 工作流程
private void jbInit() throws Exception
{
choice1.setBackground(new Color(236, 190, 98));
button1.setBackground(new Color(236, 190, 98));
// try
// {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// }catch(Exception e){e.printStackTrace();}
this.setResizable(false);
new Thread(this).start();//启动监听线程
this.PORT=1976;
this.isInitiative=false;//是否主动连接
this.stopFlag=false;//是否继续监听的标志
this.choice1.addItem("黑");
this.choice1.addItem("白");
LastPoint=new Point();
messagePoint=new Point();
this.setSize(470,450);
this.setTitle("围棋大战 制造者:郭欣");
this.panelGo.setEnabled(false);//开始之前屏蔽掉盘面
checkbox1.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
checkbox1_mouseClicked(e);
}
});
this.goStartPoint=this.panelGo.getLocation();//
this.setLayout(borderLayout1);
panel1.setLayout(borderLayout2);
checkbox1.setCheckboxGroup(checkboxGroup1);
checkbox1.setLabel("单机");
checkbox2.setCheckboxGroup(checkboxGroup1);
checkbox2.setLabel("联机");
checkbox2.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
checkbox2_mouseClicked(e);
}
});
label1.setText("对方地址");
button1.setLabel("连接");
3.3 系统流程图
第4章 详细设计
此设计是一个小游戏(围棋)的实现,主要运用了GUI(用户图形界面)API(应用程序借口)来实现。此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制, 再加入复选框,按钮,标签及实现本游戏的用户界面布局。
在页面上通过单纯的JCreator实现的下棋程序,能够实现提子,打劫等简单的下棋功能。更好的掌握java编程以及布局和设计。通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应用软件、开发系统软件等各项工作。通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。
4.1 重要程序段1
void initMyHash(Point startPoint,int interval)
{
One one;
Point key; //逻辑点标志
int i,j; //定义i,j
for(i=1;i<=19;i++)
for(j=1;j<=19;j++) //循环
{
key=new Point(i,j);
one=new One(); //创建对象
one.posX=startPoint.x+(i-1)*interval;//相邻点处理,获取
one.posY=startPoint.y+(j-1)*interval;//相邻点处理。获取//获取相邻点
one.pointAround[0]=new Point(i,j-1); //上
one.pointAround[1]=new Point(i,j+1); //下
one.pointAround[2]=new Point(i-1,j); //左
one.pointAround[3]=new Point(i+1,j); //右
if(i==1)one.pointAround[2]=one.OUT; //左的周围
if(i==19)one.pointAround[3]=one.OUT; //右的周围
if(j==1)one.pointAround[0]=one.OUT; //上的周围
if(j==19)one.pointAround[1]=one.OUT; //下的周围
myHash.put(key,one); //我的我的哈希表并且在里键入关键字
}
}
//更新盘面
public void paint(Graphics g)
{
Point startPoint=STARTPOINT; //创建对象,开始点
int interval=INTERVAL; //定义成员变量
this.paintChessboard(g,startPoint,interval); //棋盘的操作
this.paintChessman(g,startPoint,interval); //棋子的操作
}
//画棋盘
4.2 重要程序段2
public void run()
{
try
{
ServerSocket serverSocket=new ServerSocket(PORT);
Socket receiveSocket=null;
receiveSocket=serverSocket.accept();
if(this.isInitiative)//如果已在进行,则不接受连接
this.stopFlag=true;
this.checkboxGroup1.setSelectedCheckbox(this.checkbox2);//自动选择联机
this.button1.setEnabled(false);
this.choice1.setEnabled(true);
this.textField1.setEnabled(false);
this.checkbox1.setEnabled(false);
this.checkbox2.setEnabled(false);
this.writer=new PrintWriter(receiveSocket.getOutputStream(),true);
BufferedReader reader=new BufferedReader(new InputStreamReader(receiveSocket.getInputStream()));
String message;
while(!this.stopFlag)
{
this.panelGo.showError("接收连接成功");
message=reader.readLine();
this.doMessage(message);
}
reader.close();
receiveSocket.close();
serverSocket.close();
}catch(IOException ioe){this.panelGo.showError("您赢了");}
}
//处理接收到的东西
4.3 重要程序段3
void doMessage(String message)
{
if(message.startsWith("start"))//判断开始
{
this.panelGo.showError("开始了");
if(message.equals("start_black"))
this.choice1.select("白");
else
this.choice1.select("黑");
if(this.choice1.getSelectedItem().equals("黑"))//只要你是黑的,就先走
this.panelGo.setEnabled(true);
this.paintMyColor();//表明颜色
this.disableLink();
}
else//下子的信息
{
int color=Integer.parseInt(message.substring(0,1));
this.messagePoint.x=Integer.parseInt(message.substring(1,3));
this.messagePoint.y=Integer.parseInt(message.substring(3,5));
this.panelGo.setEnabled(true);//解禁
this.panelGo.doStep(this.messagePoint,color);
}
}
//为鼠标定位
posted on 2023-06-27 00:30 20214073-付沛森 阅读(13) 评论(0) 编辑 收藏 举报