课程设计(论文)-java网络版五子棋.docx

上传人:韩长文 文档编号:3971856 上传时间:2019-10-11 格式:DOCX 页数:28 大小:258.65KB
返回 下载 相关 举报
课程设计(论文)-java网络版五子棋.docx_第1页
第1页 / 共28页
课程设计(论文)-java网络版五子棋.docx_第2页
第2页 / 共28页
课程设计(论文)-java网络版五子棋.docx_第3页
第3页 / 共28页
课程设计(论文)-java网络版五子棋.docx_第4页
第4页 / 共28页
课程设计(论文)-java网络版五子棋.docx_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《课程设计(论文)-java网络版五子棋.docx》由会员分享,可在线阅读,更多相关《课程设计(论文)-java网络版五子棋.docx(28页珍藏版)》请在三一文库上搜索。

1、课程设计答辩记录教师主要提问记录学生回答问题情况课程设计成绩评定答辩成绩(50%)课程设计报告撰写质量(50%)总分是否同意通过同意 不同意答辩小组成员签名: 年 月 日封面成都信息工程学院课程设计题目: JAVA网络版五子棋 作者姓名:班 级:网络083学 号:指导教师:日 期:2011年 9 月 27 日 作者签名:第 1 页 共 28 页java网络版五子棋摘 要传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为1515,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 随着五子棋的发展,逐步发现先行优势非常大,

2、最后得出“先行必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先行必胜”的问题。于是有如下的解决办法:“交换”思维 “交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先行必胜”依然存在。关键词:五子棋,java版,C/S结构 目 录1引言01.1课题背景01.2国内外研究现状01.3本课题研究的意义01.4本课题的研究方法02概要设计02.1开发环境0Eclipse简介:02.2功能需求设计03详细设计03.1总体设计

3、03.2各功能模块详细设计03.2.1用户列表面板03.2.2用户操作面板03.2.3开发棋子类03.2.4开发棋盘面板03.2.5棋盘线程03.2.6服务器信息面板03.2.7 服务器线程03.2.8 服务器端03.2.9 客户端线程03.2.10 客户端0测试与分析0结 论0参考文献01 引言1.1 课题背景 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为1515,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 随着五子棋的发展,逐步发现先行优势非常大,最后得出“先行必胜”。五子棋要成为竞技运动,核心问题是怎

4、样解决传统五子棋下法中“先行必胜”的问题。于是有如下的解决办法:“交换”思维 “交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先行必胜”依然存在。 如:欧洲的Swap2、Swap1;中国的Swap3、第一手交换规则等。 “禁手”思维 禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先行必胜”。 “泡沫”原理 像泡沫一样会破灭。如“吃子”五子棋。

5、连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。 “井字游戏”原理 井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。 通过缩小棋盘来抑制五子棋先行的优势。如:15路棋盘,13路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。 “跷跷板”原理 五子棋始终是先行领先一子。如果双方轮流领先一子呢? 台湾教授发明的六子棋,就如“跷跷板”一样。先行先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第11届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复

6、杂性。1.2 国内外研究现状中国长久以来五子棋在中国一直没有得到发展。 2001年,国家体育总局批准中国棋院试办全国性五子棋比赛(更准确地说,这里的“五子棋”应该被称为“连珠五子棋”或“连珠棋”)。 2002年8月2-4日,中国棋院举办了首届全国五子棋个人邀请赛,此后每年举办一次。 2003年,国家体育总局批准了中国棋院审定的中国五子棋竞赛规则(试行)(参考资料1)和中国五子棋段级位制(试行)(参考资料2)。 2006年2月,国家体育总局对五子棋正式立项,作为围棋下的一个二级项目。全国各地相继成立了新的五子棋俱乐部。日本据日本史料文献记载,中国古代的五子棋先由中国传到高丽(朝鲜),然后于公元1

7、688年至1704年日本的元禄时代再从高丽传到日本,最初在皇宫和贵族大家庭中流行,到元禄末期,开始在民间盛行。1899年,对传统五子棋进行规则改良后,经过公开征名,“联珠”这一名称才被正式确定下来。取意于汉书律历志上中“日月如合璧,五星如联珠”一句。现写做“连珠”。欧洲20世纪初传统五子棋及连珠从日本传入欧洲。五子棋英译为“Five In A Row”(缩写为FIR),汉语拼音“w z qi”,同时根据日语的罗马拼音,把“五目、五目碰”英译为“Gomoku、Gobang”,“连珠”英译为“Renju”。 1958年以及1979年,瑞典和前苏联分别成立了连珠联盟。1988年,日本、前苏联以及瑞典

8、三个国家的连珠组织在瑞典成立国际连珠联盟(Renju International Federation,简称RIF). 20世纪90年代欧洲一些国家将传统五子棋引入“交换”等规则后,经过发展逐渐形成一系列的Gomoku新规则,中欧一些国家成立了Gomoku组织,并和六子棋共同成立了国际联盟(GCIF)。 21世纪初在举办世界连珠(renju)锦标赛的同时也举办世界Gomoku锦标赛(GT)及六子棋国际公开赛(CT)。 2009年8月在捷克共和国(CzechRepublic)帕尔杜比采市(Pardubice)将举行第11届世界连珠锦标赛和第3届世界Gomoku锦标赛。1.3 本课题研究的意义 本

9、课题研究的目的在于开发一个基于C/S模式的网络五子棋对战平台,提供给用户进行网络对战,因为与PC进行游戏太过单一,而且容易出现一种模式化的感觉,久而久之缺乏新鲜感,而与人对弈的好处是每一盘棋都在不停地变化,很难出现一模一样的两盘棋,而且与不同的人对战,难度不同,增加不少乐趣。同时基于网络的对战平台,可以供给在不同地方的用户进行游戏的机会。1.4 本课题的研究方法 本课题通过java语言基于socket进行开发,采用了java的多线程模式。2 概要设计2.1 开发环境 本软件用java语言开发,使用的集成开发软件为eclipse3.5.2Java简介:Java平台由Java虚拟机(Java Vi

10、rtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.5,最近版本为Java1.7。Java分为三个体系JavaSE(Java2 Platform S

11、tandard Edition,java平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。Eclipse简介: Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开 发,但是目前亦有人通过插件使其作为其他计算机语言比如C+和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得 Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclips

12、e为框架开发自己的IDE。 Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中, 其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任

13、何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多 大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。2.2 功能需求设计 对于普通的五子棋博弈而言,需要实现以下功能:有黑白两种棋子,两位棋手各执一棋,率先五连珠者获胜。所以需要设计黑白两类棋子类及键盘类并设计判断获胜的算法。对于网络五子棋而言,在普通的五子棋基础上还需要添加如下功能:拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登陆用户进行对弈,服务器支持多组用户同时进行对弈,用户可以在服务器上创建新

14、游戏或者加入已创建的游戏,用户在下棋的时候可以进行聊天交流。 本程序采用TCP协议进行传输,采用多线程设计。3 详细设计3.1总体设计本程序采用TCP通信,使用java语言,且采用多线程设计,其中TCP协议的工作流程如图:服务器端实例化一个ServerSocket对象用accept方法监听连接请求用accept方法接受连接,并等待client端连接如连接已建立,accept返回新的套接字用getInputStream和getOutputStream方法在套接字上做数据交换进行连接数据交换用closed方法关闭I/O流关闭套接字,服务结束用socket方法建立套接字用connect方法把套接字与

15、server端相连用getInputStream和getOutputStream方法在套接字上做数据交换用closed方法关闭I/O流关闭套接字,服务结束客户端相对于其他语言的TCP协议工作模式,java过程略微简单一两步。游戏从程序运行来看,分为客户端和服务器,从功能来分,可分为:服务器线程,服务器程序,客户端线程程序,出题程序和验证程序,以及客户端面板,么一部分的具体设计在3.2详解。总体设计流程图:3.2各功能模块详细设计模块一览表:模块名文件名功能描述用户面板模块UserListPad.java用户列表面板,列出所有用户UserControlPad.java用户操作面板棋盘面板模块Ga

16、mePointBlack.java黑棋类GamePointWhite.java白棋类GamePad.java棋盘面板类GameThread.java棋盘多线程类服务器模块SeverMsgPanel.java服务器信息输出面板GameSeverThread.java服务器多线程类GameServer.java服务器类客户端模块GameClient.java客户端类GameClientThread.java客户端多线程类3.2.1用户列表面板用户列表面板提供了显示所有用户的列表框,用户通过客户端登陆服务器后,可以通过此面板查看服务器上用户的情况。在初始状态下,默认显示10个用户。public cl

17、ass UserListPad extends Panelpublic List userList = new List(10);public UserListPad()setLayout(new BorderLayout();for (int i = 0; i 10; i+)userList.add(i + . + 无用户);add(userList, BorderLayout.CENTER);3.2.2用户操作面板用户操作面板提供了显示用户主机信息的标签,创建,加入,放弃及退出游戏的按钮以及连接到主机的按钮。用户操作面板采用了“FlowLayout”的布局,含有显示IP地址的标签等。pub

18、lic class UserControlPad extends JPanelpublic JLabel ipLabel = new JLabel(IP, JLabel.LEFT);public JTextField ipInputted = new JTextField(localhost, 10);public JButton connectButton = new JButton(连接到服务器);public JButton createButton = new JButton(创建游戏);public JButton joinButton = new JButton(加入游戏);pub

19、lic JButton cancelButton = new JButton(放弃游戏);public JButton exitButton = new JButton(退出程序);public UserControlPad()setLayout(new FlowLayout(FlowLayout.LEFT);setBackground(Color.LIGHT_GRAY);add(ipLabel);add(ipInputted);add(connectButton);add(createButton);add(joinButton);add(cancelButton);add(exitButt

20、on);3.2.3开发棋子类 以黑棋为例:棋盘继承了Canvas类,即画布:public class GamePointBlack extends CanvasGamePad padBelonged; / 黑棋所属的棋盘public GamePointBlack(GamePad padBelonged)setSize(20, 20); / 设置棋子大小this.padBelonged = padBelonged;public void paint(Graphics g) / 画棋子g.setColor(Color.black);g.fillOval(0, 0, 14, 14);同理可以得到白棋

21、类,将颜色参数设置为Color.white。3.2.4开发棋盘面板 棋盘面板将提供五子棋的棋盘功能,除了绘制棋盘的方法外,该类还需提供判断棋盘当前状态是否为胜利状态的方法,因为是网络五子棋,还需要实现网络对已功能。首先看棋盘的属性和构造方法,其中为了实现棋盘的网络功能,用到了Socket类的chessSocket属性来作为棋盘的套接口来连接到服务器,并用该套接口来创建监听网络的输入流inputData及发送信息的输出流outputData,布局方法暂时省略。public class GamePad extends Panel implements MouseListener, ActionLi

22、stener/ 鼠标是否能使用public boolean isMouseEnabled = false;/ 是否胜利public boolean isWinned = false; / 是否在下棋中public boolean isGaming = false;/ 棋子的x轴坐标位public int chessX_POS = -1;/ 棋子的y轴坐标位public int chessY_POS = -1;/ 棋子的颜色public int chessColor = 1;/ 黑棋x轴坐标位数组public int chessBlack_XPOS = new int200;/ 黑棋y轴坐标位数

23、组public int chessBlack_YPOS = new int200;/ 白棋x轴坐标位数组public int chessWhite_XPOS = new int200;/ 白棋y轴坐标位数组public int chessWhite_YPOS = new int200;/ 黑棋数量public int chessBlackCount = 0;/ 白棋数量public int chessWhiteCount = 0;/ 黑棋获胜次数public int chessBlackVicTimes = 0;/ 白棋获胜次数public int chessWhiteVicTimes = 0

24、;/ 套接口public Socket chessSocket;public DataInputStream inputData;public DataOutputStream outputData;public String chessSelfName = null;public String chessPeerName = null;public String host = null;public int port = 4331;public TextField statusText = new TextField(请连接服务器!);public GameThread gameThread

25、 = new GameThread(this);public GamePad()setSize(440, 440);setLayout(null);setBackground(Color.LIGHT_GRAY);addMouseListener(this);add(statusText);statusText.setBounds(new Rectangle(40, 5, 360, 24);statusText.setEditable(false);ConnectServer方法:该方法主要用于将棋盘连接到主机以进行网络对弈,首先创建指定ip地址和端口的套接口,然后创建基于该套接口的输入流和输出

26、流,最后启用棋盘的多线程功能,线程启动后将利用上面的套接口和输入输出流来监听网络的数据流向。/ 连接到主机public boolean connectServer(String ServerIP, int ServerPort) throws Exceptiontry/ 取得主机端口chessSocket = new Socket(ServerIP, ServerPort);/ 取得输入流inputData = new DataInputStream(chessSocket.getInputStream();/ 取得输出流outputData = new DataOutputStream(ch

27、essSocket.getOutputStream();gameThread.start();return true;catch (IOException ex)statusText.setText(连接失败! n);return false;setLocation方法该方法用于设定指定的棋子的位置,其中参数xPos和yPos分别给出了棋子的横坐标和纵坐标,而参数chessColor给出了棋子的颜色,1为黑棋,-1为白棋。chessBlack_XPOS和chessBlack_YPOS分别为保存黑棋的横坐标和纵坐标的两个数组,该数组通过在棋盘上的个数chessBlackCount来进行索引。白棋

28、的方法类似。public void setLocation(int xPos, int yPos, int chessColor)if (chessColor = 1) / 棋子为黑棋时chessBlack_XPOSchessBlackCount = xPos * 20;chessBlack_YPOSchessBlackCount = yPos * 20;chessBlackCount+;else if (chessColor = -1) / 棋子为白棋时chessWhite_XPOSchessWhiteCount = xPos * 20;chessWhite_YPOSchessWhiteCo

29、unt = yPos * 20;chessWhiteCount+;checkVicStatus方法用于判断当前棋盘是否为胜利状态,获取一个棋子的位置,然后判断其左右,上下,左上和右下,左下和右上是否存在五连珠即可。以左右为例,用循环判断右边是否为同一颜色,当连接数达到5,就返回true。其余类似public boolean checkVicStatus(int xPos, int yPos, int chessColor)int chessLinkedCount = 1; / 连接棋子数int chessLinkedCompare = 1; / 用于比较是否要继续遍历一个棋子的相邻网格int

30、chessToCompareIndex = 0; / 要比较的棋子在数组中的索引位置int closeGrid = 1; / 相邻网格的位置if (chessColor = 1) / 黑棋时chessLinkedCount = 1; / 将该棋子自身算入的话,初始连接数为1/以下每对for循环语句为一组,因为下期的位置能位于中间而非两端for (closeGrid = 1; closeGrid = 4; closeGrid+) / 遍历相邻4个网格for (chessToCompareIndex = 0; chessToCompareIndex = chessBlackCount; chess

31、ToCompareIndex+) / 遍历棋盘上所有黑棋子if (xPos + closeGrid) * 20 = chessBlack_XPOSchessToCompareIndex)& (yPos * 20) = chessBlack_YPOSchessToCompareIndex) / 判断当前下的棋子的右边4个棋子是否都为黑棋chessLinkedCount = chessLinkedCount + 1; / 连接数加1if (chessLinkedCount = 5) / 五子相连时,胜利return true;if (chessLinkedCount = (chessLinkedC

32、ompare + 1) chessLinkedCompare+;else / 若中间有一个棋子非黑棋,则会进入此分支,此时无需再遍历break; 其余方向判断方法类似,就不列出。setVicStatus方法:设置胜利方法,设定胜利时棋盘状态,指定胜利棋子的颜色,并且清空棋盘。public void setVicStatus(int vicChessColor)/ 清空棋盘this.removeAll();/ 将黑棋的位置设置到零点for (int i = 0; i = chessBlackCount; i+)chessBlack_XPOSi = 0;chessBlack_YPOSi = 0;/

33、 将白棋的位置设置到零点for (int i = 0; i = 1 & i = 3)chessInfoi - 1 = chessInfoToken;i+;currPad.paintNetFirPoint(Integer.parseInt(chessInfo0), Integer.parseInt(chessInfo1), Integer.parseInt(chessInfo2);else if (msgReceived.startsWith(/yourname ) / 收到的信息为改名currPad.chessSelfName = msgReceived.substring(10);else

34、if (msgReceived.equals(/error) / 收到的为错误信息currPad.statusText.setText(用户不存在,请重新加入!);/ 发送信息public void sendMessage(String sndMessage)trycurrPad.outputData.writeUTF(sndMessage);catch (Exception ea)ea.printStackTrace();public void run()String msgReceived = ;trywhile (true) / 等待信息输入msgReceived = currPad.i

35、nputData.readUTF();dealWithMsg(msgReceived);catch (IOException es)3.2.6服务器信息面板用于提供各种信息的显示,用于显示服务器状态和信息输出.public class ServerMsgPanel extends Panelpublic TextArea msgTextArea = new TextArea(, 22, 50,TextArea.SCROLLBARS_VERTICAL_ONLY);public JLabel statusLabel = new JLabel(当前连接数:, Label.LEFT);public P

36、anel msgPanel = new Panel();public Panel statusPanel = new Panel();public ServerMsgPanel()setSize(350, 300);setBackground(Color.LIGHT_GRAY);setLayout(new BorderLayout();msgPanel.setLayout(new FlowLayout();msgPanel.setSize(210, 210);statusPanel.setLayout(new BorderLayout();statusPanel.setSize(210, 50

37、);msgPanel.add(msgTextArea);statusPanel.add(statusLabel, BorderLayout.WEST);add(msgPanel, BorderLayout.CENTER);add(statusPanel, BorderLayout.NORTH);3.2.7 服务器线程为支持多组用户同时进行网络对弈,需要为服务器添加多线程的功能。其中包含三个hash表,clientDataHash用于保存客户端套接字与输出流对应,其中套接口为key,输出流为value,clientNameHash为客户端套接口和客户名的对应,其中套接口为Key,客户名为valu

38、e。Chesspeerhash用于保存游戏创建者和游戏加入者的对应,游戏创建者为key,游戏加入者为value。Feedback方法用于发送反馈信息给当前线程链接到主机的用户,首先从clientDataHash中取得当前的套接口和数据输出流,接着调用writeUtf方法输出。public void Feedback(String feedBackMsg)synchronized (clientDataHash)DataOutputStream outputData = (DataOutputStream) clientDataHash.get(clientSocket);tryoutputDa

39、ta.writeUTF(feedBackMsg);catch (Exception eb)eb.printStackTrace();后面还包括像所有用户发送信息,向指定用户发送所有信息的方法3.2.8 服务器端服务器端用于生成服务器的界面,创建服务器以及初始化服务器线程中的三个哈希表,其中包含main方法,是服务器程序启动的入口。/ 用指定端口和面板创建服务器public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOExceptionSocket clientSocket; / 客户端套接口long clientAccessNumber = 1; / 连接到主机的客户数量this.serverMsgPanel = serverMsgPanel; / 设定当前主机tryse

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1