




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计答辩记录教师主要提问记录学生回答问题情况课程设计成绩评定答辩成绩(50%)课程设计报告撰写质量(50%)总分是否同意通过同意 不同意答辩小组成员签名: 年 月 日封面成都信息工程学院课程设计题目: java网络版五子棋 作者姓名:班 级:网络083学 号:指导教师:日 期:2011年 9 月 27 日 作者签名:第 1 页 共 28 页java网络版五子棋摘 要传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为1515,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 随着五子棋的发展,逐步发现先行优势非常大,最后得出“先行必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先行必胜”的问题。于是有如下的解决办法:“交换”思维 “交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先行必胜”依然存在。关键词:五子棋,java版,c/s结构 目 录1引言01.1课题背景01.2国内外研究现状01.3本课题研究的意义01.4本课题的研究方法02概要设计02.1开发环境0eclipse简介:02.2功能需求设计03详细设计03.1总体设计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个以上同色棋子连成不间断的一排者为胜。 随着五子棋的发展,逐步发现先行优势非常大,最后得出“先行必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先行必胜”的问题。于是有如下的解决办法:“交换”思维 “交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先行必胜”依然存在。 如:欧洲的swap2、swap1;中国的swap3、第一手交换规则等。 “禁手”思维 禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先行必胜”。 “泡沫”原理 像泡沫一样会破灭。如“吃子”五子棋。连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。 “井字游戏”原理 井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。 通过缩小棋盘来抑制五子棋先行的优势。如:15路棋盘,13路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。 “跷跷板”原理 五子棋始终是先行领先一子。如果双方轮流领先一子呢? 台湾教授发明的六子棋,就如“跷跷板”一样。先行先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第11届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复杂性。1.2 国内外研究现状中国长久以来五子棋在中国一直没有得到发展。 2001年,国家体育总局批准中国棋院试办全国性五子棋比赛(更准确地说,这里的“五子棋”应该被称为“连珠五子棋”或“连珠棋”)。 2002年8月2-4日,中国棋院举办了首届全国五子棋个人邀请赛,此后每年举办一次。 2003年,国家体育总局批准了中国棋院审定的中国五子棋竞赛规则(试行)(参考资料1)和中国五子棋段级位制(试行)(参考资料2)。 2006年2月,国家体育总局对五子棋正式立项,作为围棋下的一个二级项目。全国各地相继成立了新的五子棋俱乐部。日本据日本史料文献记载,中国古代的五子棋先由中国传到高丽(朝鲜),然后于公元1688年至1704年日本的元禄时代再从高丽传到日本,最初在皇宫和贵族大家庭中流行,到元禄末期,开始在民间盛行。1899年,对传统五子棋进行规则改良后,经过公开征名,“联珠”这一名称才被正式确定下来。取意于汉书律历志上中“日月如合璧,五星如联珠”一句。现写做“连珠”。欧洲20世纪初传统五子棋及连珠从日本传入欧洲。五子棋英译为“five in a row”(缩写为fir),汉语拼音“w z qi”,同时根据日语的罗马拼音,把“五目、五目碰”英译为“gomoku、gobang”,“连珠”英译为“renju”。 1958年以及1979年,瑞典和前苏联分别成立了连珠联盟。1988年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟(renju international federation,简称rif). 20世纪90年代欧洲一些国家将传统五子棋引入“交换”等规则后,经过发展逐渐形成一系列的gomoku新规则,中欧一些国家成立了gomoku组织,并和六子棋共同成立了国际联盟(gcif)。 21世纪初在举办世界连珠(renju)锦标赛的同时也举办世界gomoku锦标赛(gt)及六子棋国际公开赛(ct)。 2009年8月在捷克共和国(czechrepublic)帕尔杜比采市(pardubice)将举行第11届世界连珠锦标赛和第3届世界gomoku锦标赛。1.3 本课题研究的意义 本课题研究的目的在于开发一个基于c/s模式的网络五子棋对战平台,提供给用户进行网络对战,因为与pc进行游戏太过单一,而且容易出现一种模式化的感觉,久而久之缺乏新鲜感,而与人对弈的好处是每一盘棋都在不停地变化,很难出现一模一样的两盘棋,而且与不同的人对战,难度不同,增加不少乐趣。同时基于网络的对战平台,可以供给在不同地方的用户进行游戏的机会。1.4 本课题的研究方法 本课题通过java语言基于socket进行开发,采用了java的多线程模式。2 概要设计2.1 开发环境 本软件用java语言开发,使用的集成开发软件为eclipse3.5.2java简介:java平台由java虚拟机(java virtual 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 standard 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软件很难具有的灵活性。许多软件开发商以eclipse为框架开发自己的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差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括oracle在内的许多 大公司也纷纷加入了该项目,并宣称eclipse将来能成为可进行任何语言开发的ide集大成者,使用者只需下载各种语言的插件即可。2.2 功能需求设计 对于普通的五子棋博弈而言,需要实现以下功能:有黑白两种棋子,两位棋手各执一棋,率先五连珠者获胜。所以需要设计黑白两类棋子类及键盘类并设计判断获胜的算法。对于网络五子棋而言,在普通的五子棋基础上还需要添加如下功能:拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登陆用户进行对弈,服务器支持多组用户同时进行对弈,用户可以在服务器上创建新游戏或者加入已创建的游戏,用户在下棋的时候可以进行聊天交流。 本程序采用tcp协议进行传输,采用多线程设计。3 详细设计3.1总体设计本程序采用tcp通信,使用java语言,且采用多线程设计,其中tcp协议的工作流程如图:服务器端实例化一个serversocket对象用accept方法监听连接请求用accept方法接受连接,并等待client端连接如连接已建立,accept返回新的套接字用getinputstream和getoutputstream方法在套接字上做数据交换进行连接数据交换用closed方法关闭i/o流关闭套接字,服务结束用socket方法建立套接字用connect方法把套接字与server端相连用getinputstream和getoutputstream方法在套接字上做数据交换用closed方法关闭i/o流关闭套接字,服务结束客户端相对于其他语言的tcp协议工作模式,java过程略微简单一两步。游戏从程序运行来看,分为客户端和服务器,从功能来分,可分为:服务器线程,服务器程序,客户端线程程序,出题程序和验证程序,以及客户端面板,么一部分的具体设计在3.2详解。总体设计流程图:3.2各功能模块详细设计模块一览表:模块名文件名功能描述用户面板模块userlistpad.java用户列表面板,列出所有用户usercontrolpad.java用户操作面板棋盘面板模块gamepointblack.java黑棋类gamepointwhite.java白棋类gamepad.java棋盘面板类gamethread.java棋盘多线程类服务器模块severmsgpanel.java服务器信息输出面板gameseverthread.java服务器多线程类gameserver.java服务器类客户端模块gameclient.java客户端类gameclientthread.java客户端多线程类3.2.1用户列表面板用户列表面板提供了显示所有用户的列表框,用户通过客户端登陆服务器后,可以通过此面板查看服务器上用户的情况。在初始状态下,默认显示10个用户。public class 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地址的标签等。public 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(加入游戏);public 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(exitbutton);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);同理可以得到白棋类,将颜色参数设置为color.white。3.2.4开发棋盘面板 棋盘面板将提供五子棋的棋盘功能,除了绘制棋盘的方法外,该类还需提供判断棋盘当前状态是否为胜利状态的方法,因为是网络五子棋,还需要实现网络对已功能。首先看棋盘的属性和构造方法,其中为了实现棋盘的网络功能,用到了socket类的chesssocket属性来作为棋盘的套接口来连接到服务器,并用该套接口来创建监听网络的输入流inputdata及发送信息的输出流outputdata,布局方法暂时省略。public class gamepad extends panel implements mouselistener, actionlistener/ 鼠标是否能使用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轴坐标位数组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;/ 套接口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 = 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地址和端口的套接口,然后创建基于该套接口的输入流和输出流,最后启用棋盘的多线程功能,线程启动后将利用上面的套接口和输入输出流来监听网络的数据流向。/ 连接到主机public boolean connectserver(string serverip, int serverport) throws exceptiontry/ 取得主机端口chesssocket = new socket(serverip, serverport);/ 取得输入流inputdata = new datainputstream(chesssocket.getinputstream();/ 取得输出流outputdata = new dataoutputstream(chesssocket.getoutputstream();gamethread.start();return true;catch (ioexception ex)statustext.settext(连接失败! n);return false;setlocation方法该方法用于设定指定的棋子的位置,其中参数xpos和ypos分别给出了棋子的横坐标和纵坐标,而参数chesscolor给出了棋子的颜色,1为黑棋,-1为白棋。chessblack_xpos和chessblack_ypos分别为保存黑棋的横坐标和纵坐标的两个数组,该数组通过在棋盘上的个数chessblackcount来进行索引。白棋的方法类似。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_yposchesswhitecount = ypos * 20;chesswhitecount+;checkvicstatus方法用于判断当前棋盘是否为胜利状态,获取一个棋子的位置,然后判断其左右,上下,左上和右下,左下和右上是否存在五连珠即可。以左右为例,用循环判断右边是否为同一颜色,当连接数达到5,就返回true。其余类似public boolean checkvicstatus(int xpos, int ypos, int chesscolor)int chesslinkedcount = 1; / 连接棋子数int chesslinkedcompare = 1; / 用于比较是否要继续遍历一个棋子的相邻网格int chesstocompareindex = 0; / 要比较的棋子在数组中的索引位置int closegrid = 1; / 相邻网格的位置if (chesscolor = 1) / 黑棋时chesslinkedcount = 1; / 将该棋子自身算入的话,初始连接数为1/以下每对for循环语句为一组,因为下期的位置能位于中间而非两端for (closegrid = 1; closegrid = 4; closegrid+) / 遍历相邻4个网格for (chesstocompareindex = 0; chesstocompareindex = chessblackcount; chesstocompareindex+) / 遍历棋盘上所有黑棋子if (xpos + closegrid) * 20 = chessblack_xposchesstocompareindex)& (ypos * 20) = chessblack_yposchesstocompareindex) / 判断当前下的棋子的右边4个棋子是否都为黑棋chesslinkedcount = chesslinkedcount + 1; / 连接数加1if (chesslinkedcount = 5) / 五子相连时,胜利return true;if (chesslinkedcount = (chesslinkedcompare + 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;/ 将白棋的位置设置到零点for (int i = 0; i = 1 & i 0 & !user.startswith(inchess) / 用户信息有效时firclient.userlistpad.userlist.add(user);/ 将用户信息添加到用户列表中usernumber+;else if (msgreceived.startswith(/yourname ) / 收到的信息为用户本名时firclient.chessclientname = msgreceived.substring(10); / 取得用户本名firclient.settitle(java 五子棋客户端 + 用户名:+ firclient.chessclientname); / 设置程序frame的标题else if (msgreceived.equals(/reject) / 收到的信息为拒绝用户时tryfirclient.firpad.statustext.settext(不能加入游戏!);firclient.usercontrolpad.cancelbutton.setenabled(false);firclient.usercontrolpad.joinbutton.setenabled(true);firclient.usercontrolpad.createbutton.setenabled(true);catch (exception ef)firclient.usercontrolpad.joinbutton.setenabled(true);else if (msgreceived.startswith(/peer ) / 收到信息为游戏中的等待时firclient.firpad.chesspeername = msgreceived.substring(6);if (firclient.iscreator) / 若用户为游戏建立者firclient.firpad.chesscolor = 1; / 设定其为黑棋先行firclient.firpad.ismouseenabled = true;firclient.firpad.statustext.settext(黑方下.);else if (firclient.isparticipant) / 若用户为游戏加入者firclient.firpad.chesscolor = -1; / 设定其为白棋后性firclient.firpad.statustext.settext(游戏加入,等待对手.);else if (msgreceived.equals(/youwin) / 收到信息为胜利信息firclient.isonchess = false;firclient.firpad.setvicstatus(firclient.firpad.chesscolor);firclient.firpad.statustext.settext(对手退出);fircl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能家居安全系统安装协议
- 的股权转让合同书
- 节能环保设施采购与运营协议
- 农民合作种养殖技术支持合同
- 详细收入及年终奖金津补贴证明(7篇)
- 行政管理市政学知识更新试题及答案
- 在建筑工程中提升竞争力试题及答案
- 行政管理的组织变革试题及答案
- 现代管理中的实施策略与执行力考查试题及答案
- 科技助力市政管理试题及答案
- CJ/T 156-2001 沟槽式管接头
- 黑龙江省齐齐哈尔市五县联考2023-2024学年七年级下学期期末数学试题
- CJJT81-2013 城镇供热直埋热水管道技术规程
- 留置导尿法操作评分标准
- 图集04S206自动喷水与水喷雾灭火设施安装
- IQC来料不合格品处理流程管理规定
- 2023年拍卖师考试真题模拟汇编(共469题)
- MOOC 引领世界的中国乒乓-西南交通大学 中国大学慕课答案
- 低碳示范区评价技术规范低碳景区
- 语法填空谓语和非谓语动词解题技巧课件(共16张)
- 人教版七年级上册数学《整式的加减》单元作业设计
评论
0/150
提交评论