五子棋Java实验报告
五子棋报告-java
XXXX大学XX学院课程设计报告课程名称:面向对象程序设计题目名称:五子棋游戏设计学生姓名:专业班级:指导教师:任晓强一、课程设计目的与任务(四号、宋体、加黑、顶格)(1)掌握Java编程、面向对象的基础知识。
(2)较熟练地编写Java应用程序Application。
(3)了解Java的常用标准类库、编程技巧、异常处理。
(4)联系已学过的内容,巩固所学的理论,增强独立工作能力。
(5)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
(6)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
二、课程设计内容1本设计题目的主要内容设计一个15╳15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能:1.选择落子的先后顺序2.重置棋盘3.刷新重新开始4.退出提示并且规定退出者判为负,但退出过程中要有提示。
以防不小心点错了。
最后判断某一方是否为五子连珠。
实现一个简单的多用户五子棋的游戏程序,包括如下两个界面(1)选择对弈桌(执黑、执白)。
(2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负);2 设计思想与程序构架程序流程图程序的功能分配a. 棋盘的绘制public void draw_qipan(Graphics G) 添加按钮Button b1=new Button("开始");Button b2=new Button("重置游戏");Label lblWin=new Label(" ");Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button("退出");public void init(){ckbHB[0]=new Checkbox("执白",ckgHB,false);ckbHB[1]=new Checkbox("执黑",ckgHB,false);ckbHB[2]=new Checkbox("观看",ckgHB, false);}c. 鼠标棋子的触发事件public void mouseClicked(MouseEvent e) {Graphics g=getGraphics();int x1,y1;x1=();y1=();if ()<20 || ()>300 || ()<20 || ()>300) {return;}if (x1%20>10) {x1+=10;}if(y1%20>10) {y1+=10;}x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1);}d. 按钮的触发事件public void actionPerformed(ActionEvent e) { Graphics g=getGraphics();if ()==b1) {Game_start();}else{Game_re();}if()==exist){Game_re();(Get_qizi_color(color_Qizi)+"输了!");intGame_Start=0;}e. 判断落子的位置及画出相应的黑白棋子public void set_Qizi(int x,int y) 判断胜负if (Game_win_1(x/20,y/20)) 进入游戏界面游戏开始的界面有三个选择项,用户可以选择相应的角色,选择完毕后点击开始进入游戏。
java五子棋小游戏实验资料报告材料(附源代码)
手机五子棋游戏的设计与实现专业::班级:学号:指导教师:J2ME(Java 2 Micro Edition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项开发技术。
它因其“write once,run anywhere”的Java特性而提高了开发的效率。
随着手机性能的不断提高,手机休闲娱乐应用将成为PC休闲娱乐应用之后又一重要业务增长点。
棋类游戏规则单一,比较适合在手机等便携终端推广。
由于具有跨平台、易于移植、占用空间小的优势,J2ME成为移动应用开发平台的主流,并提供了很多用以支持移动应用软件的开发的API。
现将该技术用于这次的手机游戏开发,可以实现游戏的快速开发,不但便于查看游戏运行过程中存的占用量和程序的每一部分代码消耗了多少处理器时间,而且可以不断地优化代码,使代码具有高度的复用性、可扩展性、可维护性。
游戏的开发以J2ME为平台,利用Java技术,结合J2ME的MIDP技术,并对于程序设计思想,重要类、方法等展开讨论。
在对弈部分,分析设计走棋算法,选择合适的方式组织成代码,实现基本的人工智能。
过程中使用了J2ME中的CLDC/MIDP软件体系,主要运用了MID Profile的特定类的支持,来完成游戏的开发。
关键词:J2ME;CLDC;MIDPJ2ME is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It improves the efficiency of the development process because of its "write once, run anywhere" nature. The development trend of the entertainment market based on the cell phone is very obvious because the handset performance enhances unceasingly. The entertainment market based on the cell phone will to be the new important business growth point follow the PC entertainment market. As the rules of a single chess game, it is more suitable for mobile phones and other portable terminal extension.J2ME has been the preferred platform for development because of its platform independent and compatibility, and provides a lot of APIs to support the development of mobile application software. The technology for mobile game development, can achieve the rapid development of the game. It is not only easy to observe the memory consumption and processor consumed time during the operation of the game, but also can optimize the code, so that the code has a high degree of reusability, scalability, maintainability.The game has designed by J2ME, the Java technology and the MIDP technology. I studied the procedure thought, the important class and the method. In the playing chess part, I have analyzed the algorithm, choosed the appropriate way to organize the code and realized the basic artificial intelligence. On the other hand,I learned software system of CLDC/MIDP and the specific class of the MID Profile to complete the game development.Key words: J2ME;CLDC;MIDP目录1 概述 (5)1.1 课题研究背景 (5)1.2 课题研究意义 (5)2 开发技术背景 (6)2.1 JAVA语言概述 (6)2.2 J2ME简介 (6)2.3 移动信息设备简表 (6)3 系统分析及总体设计 (7)3.1 可行性分析 (7)3.2 需求分析 (8)3.3 系统概要设计 (8)4 系统详细设计 (9)4.1 界面设计 (9)4.1.1 图形的低级绘制 (10)4.1.2 用户按键设计 (10)4.2 走棋算法 (11)4.3 胜负判断 (11)5 系统测试 (11)5.1 测试方案 (11)5.2 测试结果 (12)6总结 (14)基于J2ME的手机五子棋游戏的设计与实现1 概述1.1 课题研究背景五子棋是当前非常流行的一种棋。
崔钊 五子棋实训报告
《java语言程序设计》实训报告实训题目: 五子棋游戏制作专业:软件技术班级:15软件(1)班姓名:崔钊指导教师:邓衍青2016年6月11日目录一、实训目的: (1)二、实训题目描述和要求 (1)2.1实训题目描述: (1)2.2实训题目要求: (1)三、实训报告内容: (2)3.1需求分析: (2)3.2需求设计: (3)3.3详细设计 (4)四、游戏的测试 (16)五、结论 (21)六、参考书目: (22)一、实训目的:在制作五子棋游戏过程中,增加学生对java和Eclipse的熟练使用,增加对java语言的运用,让我们学到用到的知识来掌握熟练度!二、实训题目描述和要求2.1实训题目描述:五子棋的娱乐性强、规则简单、易学、流行性广,普通人不需长时间专门训练即可自如行棋,因此极受大众喜欢·五子棋规则为:1.棋盘:采用像围棋盘一样的棋盘,本系统采用18路的棋盘·2.下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点·3.输赢判断:黑、白双方有一方的五个棋子在横、竖或斜方向上连接成一线即为该方赢·2.2实训题目要求:1.设计功能明确。
2.熟悉JAVA开发环境,掌握JAVA程序的编译和运行。
3.掌握JAVA基本编程技术和方法。
4.实训上交内容:实训报告一份,电子版本实训报告一份,源程序代码。
5.游戏界面要如下图所示:三、实训报告内容:3.1需求分析:程序流程我们看到本程序由4个基本功能模块构成,各模块的详细分析如下:1.初始化FiveChessFrame类过try {bgImage = ImageIO.read(new File("E:/帅志文/image/background.jpg"));} catch (IOException e) {e.printStackTrace();}}加载背景图片,然后再背景图上通过:paint方法中的for(int i= 0; i< 19; i++) {g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);}语句绘制一个18*18的网格棋盘,每次下棋后通过调用repaint方法来初始化程序。
java课程设计实验报告---自娱自乐五子棋
Java课程设计说明书----五子棋小游戏院系; 管理学院专业班级: 信管151学生学号: 201500705009学生姓名: 雷晓指导教师: 伍良启日期2017.01.05成绩:指导老师签名:批改日期:目录 (1)课程设计的目的 (5)课程设计思路 (5)(1)棋盘界面设计 (5)(2)算法设计 (6)(3)五子棋规则 (6)程序流程图 (7)程序的设计方法 (8)程序中主要方法的说明 (8)程序中类及成员变量的说明 (9)主要成员变量(属性) (9)java源文件及其功能 (10)五子棋游戏中的注册监听 (10)游戏整体设计 (11)(1)五子棋的游戏主界面 (11)(2)机器人部分的设计 (11)(3)五子棋面板的设计 (12)设计结果与分析 (12)设计体会 (13)参考文献 (15)附录:程序源代码 (15)课程设计的目的学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西,通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来完成课程设计。
这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。
通过此次课程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。
课程设计思路(1)棋盘界面设计在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。
棋子的设计方面系统中设置了两种棋子颜色,yellow或者red,游戏者可自行选择。
棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。
运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。
这样主界面里的棋子就确定了,而且也确定了几个所需要的类。
可以先定义好这些类了。
五子棋程序实习报告
五子棋程序实习报告一、实习背景及目的近期,我通过五子棋程序的实习,深入了解了五子棋的规则和算法,并成功编写了一个五子棋程序。
本次实习的目的是为了提高我的编程能力和逻辑思维能力,同时了解人工智能在棋类游戏中的应用。
二、五子棋规则及算法分析五子棋是一种两人对弈的棋类游戏,游戏的目标是在棋盘上形成连续的五个棋子。
棋盘通常为15×15的网格,每个玩家轮流在空格中放置自己的棋子。
五子棋的算法主要包括两种:一种是基于搜索的算法,如极大极小值搜索和启发式搜索;另一种是基于机器学习的算法,如蒙特卡洛树搜索和深度学习。
三、程序设计及实现在本次实习中,我选择了基于极大极小值搜索的五子棋算法,并使用Python语言进行程序设计。
程序的主要功能包括棋盘的显示、玩家的输入和计算机的智能下棋。
首先,我使用类来表示棋盘,每个棋盘对象包含一个15×15的二维数组,用于存储棋子的位置。
同时,我还定义了一个常量类,用于存储棋子的颜色和空格的表示。
接下来,我实现了一个玩家输入的类,玩家可以通过该类来选择下棋的位置。
为了简化输入过程,我使用了一个简单的文本界面,玩家只需输入坐标即可。
最后,我实现了一个计算机下棋的类,该类使用了极大极小值搜索算法。
具体实现过程如下:1. 将棋盘划分为多个可能的获胜区域,例如横线、竖线和斜线。
2. 对于每个获胜区域,计算计算机和玩家在该区域获胜的概率。
3. 使用极大极小值搜索算法,选择最优的落子位置。
四、实习心得通过本次五子棋程序的实习,我对五子棋的规则和算法有了更深入的了解,同时也提高了我的编程能力和逻辑思维能力。
在程序设计过程中,我遇到了很多问题,如棋盘的表示、搜索算法的实现等,通过查阅资料和不断调试,我最终成功解决了这些问题。
此外,通过本次实习,我也了解到了人工智能在棋类游戏中的应用。
目前,深度学习等算法在棋类游戏中取得了显著的成果,例如AlphaGo在围棋领域的突破。
未来,我相信人工智能将在更多棋类游戏中发挥重要作用。
java五子棋实习报告
Java程序设计基础实习报告课程名称Java程序设计基础实习题目java五子棋专业班级学号学生姓名指导教师Java实习报告一、JAVA技术介绍:Java技术是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。
Java编程语言与众不同之处在于:Java程序既是编译型的(转换为一种称为Java字节码的中间语言),又是解释型的(JVM 对字节码进行解析和运行)。
编译只进行一次,而解释在每次运行程序时都会进行。
编译后的字节码采用一种针对JVM 优化过的机器码形式;解释器是JVM 的实现。
二、摘要五子棋作为一个棋类竞技运动,在民间十分流行,本课题主要完成了五子棋人机对战和玩家之间联网对战2个功能。
网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。
服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。
在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。
分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。
算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。
三、课题分析与设计1)键盘上事先设定8个按键,分作两组,每组四个,分别代表两个人用来控制棋子的上下左右键。
2)绘制棋盘,15条横线,15条竖线,在直线交点处下棋子(实心圆形)。
3)黑子先行,黑白交替下子,在棋盘上设定一个与棋盘格大小边长相等的正方形,初始状态,正方形的中心位于期盼的中心点。
当一方欲走棋的时候,应用四个按键来控制所要下棋的位置,每按一次按键,正方形都要向相应方向移动一个格,并且让喇叭发出某种声音,将要移出边界时,发出另一种警告声音并不让其移出边界。
java五子棋课程设计报告总结
课程设计报告:Java五子棋1. 背景五子棋是一种两人对弈的策略棋类游戏,它的目标是在一个棋盘上先将自己的五个棋子连成一条线,可以是横线、竖线、斜线等。
五子棋具有简单规则、易于上手、趣味性强等特点,因此在各个年龄段都备受欢迎。
本次课程设计旨在使用Java语言实现一个简单的五子棋游戏,并通过该项目来提高学生对面向对象编程和图形用户界面开发的理解和实践能力。
2. 分析2.1 需求分析根据五子棋游戏的规则,我们需要实现以下功能:•创建一个可视化的游戏界面,包括棋盘和落子提示•实现落子操作,玩家可以通过点击鼠标来在合法位置落下自己的棋子•判断胜负条件,当任意一方连成五个棋子时,游戏结束并宣布胜利者•提供重新开始和退出游戏的选项2.2 设计思路为了实现上述功能,我们将采取以下设计思路:•使用Java Swing库来创建游戏界面,包括棋盘和落子提示•使用二维数组来表示棋盘,并通过判断数组中的元素来确定当前位置是否已经有棋子•使用鼠标事件监听器来实现玩家的落子操作•使用算法判断胜负条件,例如遍历棋盘判断是否有五个连续的棋子•使用菜单栏和对话框来实现重新开始和退出游戏的选项3. 实现3.1 游戏界面设计我们将使用Java Swing库来创建游戏界面。
首先,我们需要创建一个主窗口,并设置其大小、标题和布局。
然后,在主窗口上添加一个棋盘面板和一个状态栏面板。
在棋盘面板上,我们使用GridLayout布局将其分割为15行15列的格子。
每个格子可以是一个按钮,用于玩家落子操作。
同时,我们还需要在每个格子上显示当前位置是否已经有棋子。
在状态栏面板上,我们将显示当前玩家的提示信息(轮到哪一方落子)以及胜利者信息(如果有)。
3.2 落子操作实现为了实现玩家的落子操作,我们需要使用鼠标事件监听器。
当玩家点击某个格子时,程序会捕捉到鼠标点击事件,并根据当前玩家的身份在对应的位置上落下棋子。
为了判断当前位置是否已经有棋子,我们可以使用一个二维数组来表示棋盘。
java五子棋小游戏实验报告(附源代码)
手机五子棋游戏的设计与实现专业:姓名:班级:学号:指导教师:J2ME(Java 2 Micro Edition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项开发技术。
它因其“write once,run anywhere”的Java特性而提高了开发的效率。
随着手机性能的不断提高,手机休闲娱乐应用将成为PC休闲娱乐应用之后又一重要业务增长点。
棋类游戏规则单一,比较适合在手机等便携终端推广。
由于具有跨平台、易于移植、占用空间小的优势,J2ME成为移动应用开发平台的主流,并提供了很多用以支持移动应用软件的开发的API。
现将该技术用于这次的手机游戏开发,可以实现游戏的快速开发,不但便于查看游戏运行过程中内存的占用量和程序的每一部分代码消耗了多少处理器时间,而且可以不断地优化代码,使代码具有高度的复用性、可扩展性、可维护性。
游戏的开发以J2ME为平台,利用Java技术,结合J2ME的MIDP技术,并对于程序设计思想,重要类、方法等展开讨论。
在对弈部分,分析设计走棋算法,选择合适的方式组织成代码,实现基本的人工智能。
过程中使用了J2ME中的CLDC/MIDP软件体系,主要运用了MID Profile的特定类的支持,来完成游戏的开发。
关键词:J2ME;CLDC;MIDPJ2ME is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It improves the efficiency of the development process because of its "write once, run anywhere" nature. The development trend of the entertainment market based on the cell phone is very obvious because the handset performance enhances unceasingly. The entertainment market based on the cell phone will to be the new important business growth point follow the PC entertainment market. As the rules of a single chess game, it is more suitable for mobile phones and other portable terminal extension.J2ME has been the preferred platform for development because of its platform independent and compatibility, and provides a lot of APIs to support the development of mobile application software. The technology for mobile game development, can achieve the rapid development of the game. It is not only easy to observe the memory consumption and processor consumed time during the operation of the game, but also can optimize the code, so that the code has a high degree of reusability, scalability, maintainability.The game has designed by J2ME, the Java technology and the MIDP technology. I studied the procedure thought, the important class and the method. In the playing chess part, I have analyzed the algorithm, choosed the appropriate way to organize the code and realized the basic artificial intelligence. On the other hand,I learned software system of CLDC/MIDP and the specific class of the MID Profile to complete the game development.Key words: J2ME;CLDC;MIDP目录1 概述 (5)1.1 课题研究背景 (5)1.2 课题研究意义 (5)2 开发技术背景 (6)2.1 JAVA语言概述 (6)2.2 J2ME简介 (6)2.3 移动信息设备简表 (6)3 系统分析及总体设计 (7)3.1 可行性分析 (7)3.2 需求分析 (8)3.3 系统概要设计 (8)4 系统详细设计 (9)4.1 界面设计 (9)4.1.1 图形的低级绘制 (10)4.1.2 用户按键设计 (10)4.2 走棋算法 (11)4.3 胜负判断 (11)5 系统测试 (11)5.1 测试方案 (11)5.2 测试结果 (12)6总结 (13)基于J2ME的手机五子棋游戏的设计与实现1 概述1.1 课题研究背景五子棋是当前非常流行的一种棋。
JAVA程序设计五子棋制作实训
JAVA程序设计五子棋制作实训五子棋是一种非常古老而有趣的棋类游戏,它的规则简单,但又充满了智慧的机会。
在这个实训中,我们将使用JAVA编程语言来制作一个五子棋游戏程序。
首先,我们需要创建一个棋盘类,来表示游戏的棋盘。
棋盘可以用一个二维数组来表示,每个数组元素可以是一个空格、一个黑子或一个白子。
我们可以使用0表示空格,1表示黑子,-1表示白子。
棋盘类还需要提供方法来判断是否有玩家赢得了游戏,以及判断当前位置是否为空。
接下来,我们需要创建两个类来表示黑子和白子。
这两个类都可以拥有一个坐标属性来表示它们在棋盘上的位置,还可以拥有方法来判断它们是否赢得了游戏。
然后,我们需要创建一个游戏类,来控制整个游戏的进行。
游戏类需要实例化一个棋盘对象和两个玩家对象。
游戏类提供方法来让玩家交替落子、判断游戏是否结束以及输出棋盘的状态。
最后,我们可以创建一个主类,来启动游戏。
在主类中,我们可以创建游戏对象并调用游戏的开始方法来开始游戏。
下面是一个示例代码,用于实现上述的五子棋游戏程序:```javapublic class Chessboardprivate int[][] board;public Chessboard(int size)board = new int[size][size];}public boolean isOccupied(int x, int y)return board[x][y] != 0;}public boolean isWin(int x, int y, int player)//判断该位置是否4子连珠,即判断水平、垂直和两个对角线方向上是否有连续的4个同色棋子//略}public void prin//输出棋盘的状态//略}public class Playerprivate int x;private int y;public Player(int x, int y)this.x = x;this.y = y;}public void move(Chessboard board)//玩家落子的逻辑//略}public boolean isWin(Chessboard board) return board.isWin(x, y, 1);}public class Gameprivate Chessboard board;private Player player1;private Player player2;public Game(int size)board = new Chessboard(size);player1 = new Player(0, 0);player2 = new Player(size - 1, size - 1); }public void starint turn = 1;while (true)Player currentPlayer = (turn == 1) ? player1 : player2; currentPlayer.move(board);board.print(;if (currentPlayer.isWin(board))System.out.println("Player " + turn + " wins!"); break;}turn = -turn;}}public class Mainpublic static void main(String[] args)Game game = new Game(15);game.start(;}```。
五子棋程序实习报告
一、实习背景随着计算机技术的不断发展,编程已成为现代生活的重要组成部分。
为了提高自己的编程技能,培养自己的实际动手能力,我选择了五子棋程序设计作为实习项目。
五子棋是一种古老的中国传统棋类游戏,具有极高的趣味性和挑战性。
通过本次实习,我学习了Java编程语言,掌握了五子棋游戏的算法和实现方法,提高了自己的编程水平。
二、实习目标1. 熟练掌握Java编程语言的基本语法和常用类库;2. 掌握五子棋游戏的设计和实现方法;3. 学会使用面向对象编程思想进行程序设计;4. 培养自己的团队协作和沟通能力。
三、实习内容1. 系统设计在系统设计阶段,我首先分析了五子棋游戏的规则和特点,明确了游戏的基本功能,包括:棋盘显示、落子、判断胜负、悔棋等。
然后,我设计了五子棋游戏的基本架构,包括以下几个模块:(1)棋盘模块:负责棋盘的显示和落子操作;(2)落子模块:负责实现玩家的落子操作;(3)判断胜负模块:负责判断游戏是否结束,以及判断胜负;(4)悔棋模块:负责实现玩家的悔棋操作。
2. 算法设计五子棋游戏的算法主要包括以下几个部分:(1)棋盘表示:使用二维数组表示棋盘,每个元素代表一个棋子,其中0表示空位,1表示玩家1的棋子,2表示玩家2的棋子;(2)落子算法:根据玩家的落子位置,在棋盘上放置对应的棋子;(3)判断胜负算法:从落子位置开始,向四个方向(上、下、左、右)查找连续的五个相同的棋子,如果找到,则判断为胜利;(4)悔棋算法:撤销上一步的落子操作,将棋盘恢复到上一步的状态。
3. 编码实现在编码实现阶段,我按照设计文档和算法要求,使用Java编程语言完成了五子棋游戏的基本功能。
具体实现如下:(1)棋盘模块:使用JFrame创建一个窗口,使用JPanel绘制棋盘,使用鼠标监听器实现落子操作;(2)落子模块:在棋盘模块的基础上,增加一个方法,用于处理玩家的落子操作;(3)判断胜负模块:编写一个方法,用于判断游戏是否结束,以及判断胜负;(4)悔棋模块:编写一个方法,用于撤销上一步的落子操作。
java课程设计报告五子棋
工作原理图2.2功能的规划1.建立一个棋盘类,绘制棋盘的样式,在棋盘面板上添加各种按钮及相应胡触发事件。
同时注意面板的设计,使面板设计的尽量胡的合理美观。
a.棋盘的绘制public void draw_qipan(Graphics G) //画棋盘 15*15{G.setColor(Color.lightGray);G.fill3DRect(10,10,300,300,true);G.setColor(Color.black);for(int i=1;i<16;i++){G.drawLine(20,20*i,300,20*i);G.drawLine(20*i,20,20*i,300);}}b.添加按钮与按钮胡规划Button b1=new Button("开始");Button b2=new Button("重置游戏");Label lblWin=new Label(" ");Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button("退出");public void init(){ckbHB[0]=new Checkbox("执白",ckgHB,false);ckbHB[1]=new Checkbox("执黑",ckgHB,false);ckbHB[2]=new Checkbox("观看",ckgHB, false);}C.鼠标棋子胡相应触发事件public void mouseClicked(MouseEvent e) {Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) { return;}if (x1%20>10) {x1+=10;}if(y1%20>10) {y1+=10;}x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1);}d.按钮的触发事件public void actionPerformed(ActionEvent e) {Graphics g=getGraphics();if (e.getSource()==b1) {Game_start();}else{Game_re();}if(e.getSource()==exist){Game_re();lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");intGame_Start=0;}2.编写一个功能判断落子的位置及画出相应的黑白棋子public void set_Qizi(int x,int y) //落子{if (intGame_Start==0) //判断游戏未开始{return;}if (intGame_Body[x/20][y/20]!=0) {return;}Graphics g=getGraphics();if (color_Qizi==1)//判断黑子还是白子{g.setColor(Color.black);color_Qizi=0;}else{g.setColor(Color.white);color_Qizi=1;}g.fillOval(x-10,y-10,20,20);intGame_Body[x/20][y/20]=color_Qizi+1;}3.判断胜负if (Game_win_1(x/20,y/20)) //判断输赢1{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_2(x/20,y/20)) //判断输赢2{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_3(x/20,y/20)) //判断输赢3{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_4(x/20,y/20)) //判断输赢4{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;} }4.添加用户聊天功能NetchatClient chat=new NetchatClient();chat.frame();chat.setVisible(true);三具体实现3.1创建棋盘类Public class WcyChess extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{ int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子int intGame_Start=0;//游戏开始标志 0未开始 1游戏中int intGame_Body[][]=new int[16][16]; //设置棋盘棋子状态int m=-1;Button b1=new Button("开始");Button b2=new Button("重置游戏");Label lblWin=new Label(" ");Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button("退出");CheckboxGroup ckgHB=new CheckboxGroup();NetchatClient chat=new NetchatClient();public void init(){setLayout(null);addMouseListener(this);add(b1);b1.setBounds(330,50,80,30);b1.addActionListener(this);add(b2);b2.setBounds(330,90,80,30);b2.addActionListener(this);ckbHB[0]=new Checkbox("执白",ckgHB,false);ckbHB[0].setBounds(320,20,60,30);ckbHB[1]=new Checkbox("执黑",ckgHB,false);ckbHB[1].setBounds(380,20,60,30);ckbHB[2]=new Checkbox("观看",ckgHB, false);add(ckbHB[0]);add(ckbHB[1]);add(ckbHB[2]);ckbHB[0].addItemListener(this);ckbHB[1].addItemListener(this);add(lblWin);lblWin.setBounds(330,180,80,30);lblWin.setBackground(Color.red);lblWin.setText("胜利者!");//没有显示?ckbHB[2].setBounds(440, 20,60, 30);add(exist);exist.setBounds(330,130,80,30);exist.addActionListener(this);// add(chat);chat.setBounds(20, 500, 300, 300);chat.frame();chat.setVisible(true);Game_start_csh();setSize(500,600);setVisible(true);}public void itemStateChanged(ItemEvent e) {if (ckbHB[0].getState()) //选择黑子还是白子{color_Qizi=0;}else{color_Qizi=1;}}public void mousePressed(MouseEvent e){}public void mouseClicked(MouseEvent e) {Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) { return;}if (x1%20>10) {x1+=10;}if(y1%20>10) {y1+=10;}x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1);}public void actionPerformed(ActionEvent e) {Graphics g=getGraphics();if (e.getSource()==b1) {Game_start();}else {Game_re();}if(e.getSource()==exist){Game_re();lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");intGame_Start=0;}}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseReleased(MouseEvent e){}public void mouseDragged(MouseEvent e){}public void mouseMoved(MouseEvent e){}public void paint(Graphics g) {draw_qipan(g);}3.2判断输赢功能实现if (Game_win_1(x/20,y/20)){ //判断输赢1lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_2(x/20,y/20)){//判断输赢2lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_3(x/20,y/20)) //判断输赢3{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}if (Game_win_4(x/20,y/20)) //判断输赢4{lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");intGame_Start=0;}//判断输赢程序实现在详细过程public boolean Game_win_1(int x,int y){ //横向判断输赢int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ) {if (x1>15) {break;}if (intGame_Body[x1+i][y1]==intGame_Body[x][y]) {t+=1;}else{break;}}for (int i=1;i<5 ;i++ ){if (x1<1)break;}if(intGame_Body[x1-i][y1]==intGame_Body[x][y])t+=1;}else{break;}}if (t>4){return true;}else{return false;}}public boolean Game_win_2(int x,int y) { //纵向判断输赢int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){ t+=1;}else{break;}}for (int i=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){ t+=1;}else{break;}}if (t>4){return true;}else{return false;}}public boolean Game_win_3(int x,int y) //左斜判断输赢{ int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){ t+=1;}else{break;}}for (int i=1;i<5 ;i++ ){if (x1<1){break;}if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){ t+=1;}else{break;}}if (t>4){return true;}else{return false;}}public boolean Game_win_4(int x,int y) { //左斜判断输赢int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ) {if (x1>15) {break;}if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]) {t+=1;}else{break;}}for (int i=1;i<5 ;i++ ) {if (x1<1) {break;}if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) {t+=1;}else{break; } }if (t>4) {return true;}else{return false;}}3.3实现聊天功能类package NetchatClient;import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import javax.swing.*;public class NetchatClient extends Frame {Frame x=new Frame("liaotianchengxu");TextField tf=new TextField();TextArea ta=new TextArea();Socket s=null;DataOutputStream dos=null;public static void main(String[] args) {new NetchatClient().frame();}public void frame(){System.out.println("frame()");setLocation(20, 400);setSize(300,300);add(tf,BorderLayout.SOUTH);add(ta,BorderLayout.NORTH);pack();setVisible(true);connect();this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent arg0) { cconnect();System.exit(0);}});addWindowListener(new WindowAdapter()//窗口适配器 {public void windowClosing(WindowEvent e) {System.exit(0);//程序退出} } );tf.addActionListener(new nclistener());}public void connect() {System.out.println("connnect()..");try {s=new Socket("127.0.0.1",8888);//设置客户端的IP和端口 dos=new DataOutputStream(s.getOutputStream());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void cconnect(){try {dos.close();s.close();} catch (IOException e) {e.printStackTrace();} }public class nclistener implements ActionListener{public void actionPerformed(ActionEvent e) {String st=tf.getText();ta.setText(st);tf.setText("");try {dos.writeUTF(st);dos.flush();} catch (IOException e1) {e1.printStackTrace();} } } }四测试结果4.1 进入游戏的界面分析:游戏开始的界面有三个选择项,用户可以选择相应的角色,选择完毕后点击开始进入游戏。
java五子棋报告
五子棋一、程序功能介绍设计一个20*20的五子棋盘,由两个玩家交替下子,并且可以实现以下功能:1.鼠标点击横竖线交汇处落子2.通过落子使得五个黑子或者五个白子在一条横线、竖线或斜线上2.重新开始按钮刷新重新开始3. 检查是否实现了五子连珠4. 有一方五子连珠时提示结果5.结束按钮结束程序二、课程设计过程1.如图一:程序流程图2.程序功能设计(1)先写draw类,在类中先画出一个Jframe窗口体,在这个窗口体上增加重新开始,退出,和主棋盘按钮。
并且设置监听按钮的监听。
并在draw类中设置主函数启动程序。
(2)fivechess类实现程序的功能,定义wh_array二维数组表示棋盘。
定义wh_arr一维数组,将wh_array值通过从上往下转换成一维,可用于判断输赢。
定义paintComponent(Graphics g)绘图函数,将整个棋盘给画出。
3.程序中用的变量、方法、类等class fivechess extends JPanel{} //定义变量,落子监听,判断输赢int[][] wh_array = new int[20][20]; // 定义二维数组,表示棋子在棋盘的位置int[] wh_arr = new int[430]; // 定义一维数组,转换二维数组,判断是否连线public void mouseClicked(MouseEvent e) // 单击鼠标落子并且判断输赢public fivechess() {} // 鼠标操作protected void paintComponent(Graphics g) // 绘图函数public Dimension getPerferredSize() //返回期盼大小public class draw extends JFrame {} //添加按钮,设置监听,启动程序public draw() //绘制窗口,增加重新开始和退出按钮b.addActionListener() //重新开始按钮设置监听exit. addActionListener()//退出按钮设置监听public static void main(String args[]){}//主函数启动程序三、程序设计的完整代码及注解//双人对战五子棋import java.awt.*;import java.awt.event.*;import javax.swing.*;class fivechess extends JPanel { // 函数int wh_color, x1, y1, wh_x, wh_y, wh_i, wh_j, wh_arri, wh_stop = 3;// 定义各种整型变量//x1,y1表示坐标wh_x,wh_y圆大小坐标wh_i,wh_j二维数组boolean wh_rf; // 定义布尔型变量,判断玩家String s;int[][] wh_array = new int[20][20]; // 定义二维数组int[] wh_arr = new int[430]; // 定义一维数组public fivechess() { // 鼠标操作for (int i = 0; i < 20; i++) { // 给二维数组赋值为0for (int j = 0; j < 20; j++) {wh_array[i][j] = 0; // 赋值为0}}for (int i = 0; i < 400; i++) { // 给一维数组赋初始值0wh_arr[i] = 0;}addMouseListener(new MouseListener() { // 鼠标监听器public void mouseClicked(MouseEvent e) // 单击鼠标{Graphics g = getGraphics();if (wh_stop == 3) // 当wh_stop==3时运行程序{x1 = e.getX(); // 返回鼠标当前x坐标y1 = e.getY(); // 返回鼠标当前y坐标wh_i = (x1 - 54) / 32; // 计算列值wh_j = (y1 - 34) / 32; // 计算行值wh_arri = 20 * wh_j + wh_i; // 计算二维数组变为一维数组时的对应值if (x1 > 54 && x1 < 694 && y1 > 34 && y1 < 674) // 在棋盘范围内单击鼠标才运行程序{if (wh_array[wh_i][wh_j] == 0) // 当二维数组取值为0时运行程序{wh_rf = !wh_rf; // Boolean值单击后循环变化if (wh_rf == true) // Boolean值为TRUE时{wh_color = 1; // 令wh_color=1s = "黑棋";wh_array[wh_i][wh_j] = 1; // 对应的二维数组值赋为1wh_arr[wh_arri] = 1; // 对应的一维数组赋值为1}if (wh_rf == false) // Boolean值为FALSE时{wh_color = 2; // wh_color为2s = "白棋";wh_array[wh_i][wh_j] = 2; // 对应的二维数组值赋为2wh_arr[wh_arri] = 2; // 对应的一维数组值赋为2}for (int i = 0; i < 20; i++) // 确定鼠标位置的范围{for (int j = 0; j < 20; j++) {if (x1 >= 54 + i * 32&& x1 < 54 + (i + 1) * 32&& y1 >= 34 + j * 32&& y1 < 34 + (j + 1) * 32)// 鼠标在此范围内时{wh_x = 54 + (i) * 32 + 1; // 取这个小方格的左上角x坐标值+1wh_y = 34 + (j) * 32 + 1; // 取这个小方格的左上角y坐标值+1}}}if (wh_color == 1) // 当棋子为黑色时{g.setColor(Color.BLACK); // 设置颜色}if (wh_color == 2) // 如果棋子为白色{g.setColor(Color.WHITE); // 设置颜色}g.fillOval(wh_x, wh_y, 30, 30); // 在这个小方格范围内画圆形}}for (int i = 0; i < 395; i++) // 判断黑白双方谁胜利{g.setColor(Color.RED);if ((wh_arr[i] == 1 && wh_arr[i + 1] == 1&& wh_arr[i + 2] == 1 && wh_arr[i + 3] == 1&& wh_arr[i + 4] == 1 && (i + 4) / 20 == i / 20)|| // 判断横行黑子连续为5个(wh_arr[i] == 1 && wh_arr[i + 20] == 1&& wh_arr[i + 40] == 1&& wh_arr[i + 60] == 1&& wh_arr[i + 80] == 1 && (i + 4) / 20 == i / 20)|| // 判断竖行黑子连续为5个(wh_arr[i] == 1 && wh_arr[i + 19] == 1&& wh_arr[i + 2 * 19] == 1&& wh_arr[i + 3 * 19] == 1&& wh_arr[i + 4 * 19] == 1 && (i - 4) / 20 == i / 20)|| // 判断斜左黑子连续为5个(wh_arr[i] == 1 && wh_arr[i + 21] == 1&& wh_arr[i + 2 * 21] == 1&& wh_arr[i + 3 * 21] == 1 && wh_arr[i + 4 * 21] == 1)) // 判断斜右黑子连续为5个{g.drawString("黑棋胜利", 300, 300); // 显示黑棋胜利wh_stop = 0; // 当胜利时赋值为0,再次运行时将停止}if ((wh_arr[i] == 2 && wh_arr[i + 1] == 2&& // 判断白棋子wh_arr[i + 2] == 2 && wh_arr[i + 3] == 2&& wh_arr[i + 4] == 2 && (i + 4) / 20 == i / 20)|| // 判断横行白子连续为5个(wh_arr[i] == 2 && wh_arr[i + 20] == 2&& wh_arr[i + 40] == 2&& wh_arr[i + 60] == 2&& wh_arr[i + 80] == 2 && (i + 4) / 20 == i / 20)|| // 判断竖行白子连续为5个(wh_arr[i] == 2 && wh_arr[i + 19] == 2&& wh_arr[i + 2 * 19] == 2&& wh_arr[i + 3 * 19] == 2&& wh_arr[i + 4 * 19] == 2 && (i - 4) / 20 == i / 20)|| // 判断斜左白子连续为5个(wh_arr[i] == 2 && wh_arr[i + 21] == 2&& wh_arr[i + 2 * 21] == 2&& wh_arr[i + 3 * 21] == 2 && wh_arr[i + 4 * 21] == 2)) // 判断斜行连续5子{g.drawString("白棋胜利", 300, 300);wh_stop = 0;}}}} // 单击事件结束public void mouseEntered(MouseEvent e) // 鼠标进入组件的事件{}public void mouseExited(MouseEvent e) // 鼠标离开组件的事件{}public void mousePressed(MouseEvent e) // 鼠标按下时的事件{}public void mouseReleased(MouseEvent e) // 鼠标放开时的事件{}}); // 监听器结束addMouseMotionListener(new MouseMotionListener() // 鼠标motion监听{public void mouseMoved(MouseEvent e) // 处理鼠标移动事件{}public void mouseDragged(MouseEvent e) // 处理鼠标拖动事件{}});}protected void paintComponent(Graphics g) // 绘图函数{g.setColor(Color.gray);g.fill3DRect(0, 0, 748, 728, true);g.setColor(Color.BLACK); // 设置颜色for (int i = 0; i < 20; i++) // 循环画棋盘{g.drawLine(70, 50 + i * 32, 678, 50 + i * 32); // 画棋盘的横线g.drawLine(70 + i * 32, 50, 70 + i * 32, 658); // 画棋盘的纵线}g.drawString("五子棋", 300, 30); // 在面板上输出"五子棋"wh_stop = 3; // 刷新后wh_stop由0变为3可以响应buttonfor (int i = 0; i < 20; i++) // 给二维数组赋值为0{for (int j = 0; j < 20; j++) {wh_array[i][j] = 0; // 赋值为0}}for (int i = 0; i < 400; i++) { // 给一维数组赋初始值0 wh_arr[i] = 0;}}public Dimension getPerferredSize() {return new Dimension(748, 728);}}public class draw extends JFrame { // 函数JTextField t;public draw() //{super("五子棋"); // 窗口名Container c = getContentPane(); // 返回当前内容窗值c.setLayout(null);fivechess wh = new fivechess();wh.setBounds(0, 0, 748, 728); // 设置panel大小JButton b = new JButton("重新开始"); // 定义按钮JButton exit = new JButton("退出"); // 定义按钮c.add(exit);c.add(b); // 添加按钮c.add(wh); // 添加panelb.setBounds(70, 20, 100, 20); // 设置按钮大小exit.setBounds(580, 20, 80, 20);b.addActionListener(new ActionListener() // 设置监听{public void actionPerformed(ActionEvent e) {repaint(); // 重画}});exit.addActionListener(new ActionListener() // 设置监听{public void actionPerformed(ActionEvent e) {System.exit(0);}});}public static void main(String args[]) // 主函数{draw app = new draw(); //app.setLocation(300, 0); // 设置窗口位置app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭框架行为属性app.setSize(748, 728); // 设置面板框架frame大小app.setVisible(true); // 设置可见app.setResizable(false);}}四、程序运行的结果分析1.如图二:进入游戏界面2.如图三:落子图三落子3.如图四:结束游戏图四游戏结束五、课程设计总结通过短短的一个学期java的学习,我们从一个对JAVA编程不懂的学生到现在可以试着用JAVA 进行简单程序的设计和编写,也更加了解了面向对象的思想。
五子棋JAVA实验报告 (1)
JA V A实验报告课程名称:JAVA程序设计教程实验题目:五子棋院系:公共管理学院信息管理系班级:信息管理与信息系统一班学号:2013190325姓名:谢巧婷五子棋JA V A实验报告一、实验目的和要求1、能够用编程语言实现一个简单的五子棋程序2、在实际系统中使用、实现人工智能的相关算法3、进一步加深对人工智能算法的理解二、五子棋的基本常识与原理1、五子棋的基本常识与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。
五子棋的开始阶段称为开局,或称布局。
其开局阶段是十分短暂的,大约在七着与十几着之间。
在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。
在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。
因此积极处理好开局和开局向中局的过渡十分重要。
五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。
2、五子棋比赛的相关规定(1)职业连珠规则a.黑方先下子,白后下,从天元开始相互顺序落子。
b.最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
c.黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“长连”。
即黑棋只能以“四三”取胜。
有关术语解释请见图示说明。
d.如分不出胜负,则定为平局。
对局中拔子、中途退场均判为负。
e.五连与禁手同时形成,判胜。
(2)比赛中的规定和特例a.对局开始前,双方猜子,大数减小数,单数交换,偶数不换。
b.白棋第一手(即盘面第二着棋)应在天元为界自己一侧布子,主要以示尊重对方,之后双方可任意行子。
c.对局中双方应遵守“职业连珠五子棋规则”,如出现争议,应由裁判判定。
d.对局中掉子(棋子掉落在棋盘上)的一方判负。
java+五子棋报告(完整版)
下面的源代码分为4个文件;(2)chessInterface.java:客户端的界面。
(3)chessPad.java:棋盘的绘制。
(4)chessServer.java:服务器端。
可同时容纳50个人同时在线下棋,聊天。
public void acceptMessage(String recMessage){if(recMessage.startsWith("/userlist ")){StringTokenizer userToken=new StringTokenizer(recMessage," ");int userNumber=0;erList.removeAll();erChoice.removeAll();erChoice.addItem("所有人");while(userToken.hasMoreT okens()){String user=(String)userToken.nextToken(" ");if(userNumber>0 && !user.startsWith("[inchess]")){erList.add(user);erChoice.addItem(user);}userNumber++;}erChoice.select("所有人");}else if(recMessage.startsWith("/yourname ")){chessclient.chessClientName=recMessage.substring(10);chessclient.setTitle("Java五子棋客户端"+"用户名:"+chessclient.chessClientName); }else if(recMessage.equals("/reject")){try{chessclient.chesspad.statusText.setText("不能加入游戏");chessclient.controlpad.cancelGameButton.setEnabled(false);chessclient.controlpad.joinGameButton.setEnabled(true);chessclient.controlpad.creatGameButton.setEnabled(true);catch(Exception ef){chessclient.chatpad.chatLineArea.setText("chessclient.chesspad.chessSocket.close无法关闭");}chessclient.controlpad.joinGameButton.setEnabled(true);}else if(recMessage.startsWith("/peer ")){chessclient.chesspad.chessPeerName=recMessage.substring(6);if(chessclient.isServer){chessclient.chesspad.chessColor=1;chessclient.chesspad.isMouseEnabled=true;chessclient.chesspad.statusText.setText("请黑棋下子");}else if(chessclient.isClient){chessclient.chesspad.chessColor=-1;chessclient.chesspad.statusText.setText("已加入游戏,等待对方下子...");}}else if(recMessage.equals("/youwin")){chessclient.isOnChess=false;chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor);chessclient.chesspad.statusText.setText("对方退出,请点放弃游戏退出连接"); chessclient.chesspad.isMouseEnabled=false;}else if(recMessage.equals("/OK")){chessclient.chesspad.statusText.setText("创建游戏成功,等待别人加入...");}else if(recMessage.equals("/error")){chessclient.chatpad.chatLineArea.append("传输错误:请退出程序,重新加入\n");}else{chessclient.chatpad.chatLineArea.append(recMessage+"\n");chessclient.chatpad.chatLineArea.setCaretPosition(chessclient.chatpad.chatLineArea.getT ext().length());}public void run(){String message="";try{while(true){message=chessclient.in.readUTF();acceptMessage(message);}}catch(IOException es){}}}public class chessClient extends Frame implements ActionListener,KeyListener {userPad userpad=new userPad();chatPad chatpad=new chatPad();controlPad controlpad=new controlPad();chessPad chesspad=new chessPad();inputPad inputpad=new inputPad();Socket chatSocket;DataInputStream in;DataOutputStream out;String chessClientName=null;String host=null;int port=4331;boolean isOnChat=false; //在聊天?boolean isOnChess=false; //在下棋?boolean isGameConnected=false; //下棋的客户端连接?boolean isServer=false; //如果是下棋的主机boolean isClient=false; //如果是下棋的客户端Panel southPanel=new Panel();Panel northPanel=new Panel();Panel centerPanel=new Panel();Panel westPanel=new Panel();Panel eastPanel=new Panel();chessClient(){super("Java五子棋客户端");setLayout(new BorderLayout());host=controlpad.inputIP.getText();westPanel.setLayout(new BorderLayout()); westPanel.add(userpad,BorderLayout.NORTH); westPanel.add(chatpad,BorderLayout.CENTER); westPanel.setBackground(Color.pink);inputpad.input word s.addKeyListener(this); chesspad.host=controlpad.inputIP.getText();centerPanel.add(chesspad,BorderLayout.CENTER); centerPanel.add(inputpad,BorderLayout.SOUTH); centerPanel.setBackground(Color.pink);controlpad.connectButton.addActionListener(this); controlpad.creatGameButton.addActionListener(this); controlpad.joinGameButton.addActionListener(this); controlpad.cancelGameButton.addActionListener(this); controlpad.exitGameButton.addActionListener(this);controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(false);southPanel.add(controlpad,BorderLayout.CENTER); southPanel.setBackground(Color.pink);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {if(isOnChat){try{chatSocket.close();}catch(Exception ed){}}if(isOnChess || isGameConnected){try{chesspad.chessSocket.close();}catch(Exception ee){}}System.exit(0);}public void windowActivated(WindowEvent ea) {}});add(westPanel,BorderLayout.WEST);add(centerPanel,BorderLayout.CENTER); add(southPanel,BorderLayout.SOUTH);pack();setSize(670,548);setVisible(true);setResizable(false);validate();}public boolean connectServer(String serverIP,int serverPort) throws Exception{try{chatSocket=new Socket(serverIP,serverPort);in=new DataInputStream(chatSocket.getInputStream());out=new DataOutputStream(chatSocket.getOutputStream());clientThread clientthread=new clientThread(this);clientthread.start();isOnChat=true;return true;}catch(IOException ex){chatpad.chatLineArea.setT ext("chessClient:connectServer:无法连接,建议重新启动程序\n");}return false;}public void actionPerformed(ActionEvent e){if(e.getSource()==controlpad.connectButton){host=chesspad.host=controlpad.inputIP.getText();try{if(connectServer(host,port)){chatpad.chatLineArea.setT ext("");controlpad.connectButton.setEnabled(false);controlpad.creatGameButton.setEnabled(true);controlpad.joinGameButton.setEnabled(true);chesspad.statusText.setText("连接成功,请创建游戏或加入游戏");}}catch(Exception ei){chatpad.chatLineArea.setT ext("controlpad.connectButton:无法连接,建议重新启动程序\n");}}if(e.getSource()==controlpad.exitGameButton){if(isOnChat){try{chatSocket.close();}catch(Exception ed){}}if(isOnChess || isGameConnected){try{chesspad.chessSocket.close();}catch(Exception ee){}}System.exit(0);}if(e.getSource()==controlpad.joinGameButton){String selectedUser=erList.getSelectedItem();if(selectedUser==null || selectedUser.startsWith("[inchess]") || selectedUser.equals(chessClientName)){chesspad.statusText.setText("必须先选定一个有效用户");}else{try{if(!isGameConnected){if(chesspad.connectServer(chesspad.host,chesspad.port)) {isGameConnected=true;isClient=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);chesspad.chessthread.sendMessage("/joingame "+erList.getSelectedItem()+" "+chessClientName);}}else{isOnChess=true;isClient=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);chesspad.chessthread.sendMessage("/joingame "+erList.getSelectedItem()+" "+chessClientName);}}catch(Exception ee){isGameConnected=false;isOnChess=false;isClient=false;controlpad.creatGameButton.setEnabled(true);controlpad.joinGameButton.setEnabled(true);controlpad.cancelGameButton.setEnabled(false);chatpad.chatLineArea.setT ext("chesspad.connectServer无法连接\n"+ee);}}}if(e.getSource()==controlpad.creatGameButton){try{if(!isGameConnected){if(chesspad.connectServer(chesspad.host,chesspad.port)){isGameConnected=true;isServer=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); }}else{isOnChess=true;isServer=true;controlpad.creatGameButton.setEnabled(false);controlpad.joinGameButton.setEnabled(false);controlpad.cancelGameButton.setEnabled(true);chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); }}catch(Exception ec){isGameConnected=false;isOnChess=false;isServer=false;controlpad.creatGameButton.setEnabled(true);controlpad.joinGameButton.setEnabled(true);controlpad.cancelGameButton.setEnabled(false);ec.printStackTrace();chatpad.chatLineArea.setT ext("chesspad.connectServer无法连接\n"+ec);}}if(e.getSource()==controlpad.cancelGameButton){if(isOnChess){chesspad.chessthread.sendMessage("/giveup "+chessClientName);chesspad.chessVictory(-1*chesspad.chessColor);controlpad.creatGameButton.setEnabled(true);controlpad.joinGameButton.setEnabled(true);controlpad.cancelGameButton.setEnabled(false);chesspad.statusText.setText("请建立游戏或者加入游戏");}if(!isOnChess){controlpad.creatGameButton.setEnabled(true);controlpad.joinGameButton.setEnabled(true);controlpad.cancelGameButton.setEnabled(false);chesspad.statusText.setText("请建立游戏或者加入游戏");}isClient=isServer=false;}}public void keyPressed(KeyEvent e){TextField inputWords=(TextField)e.getSource();if(e.getKeyCode()==KeyEvent.VK_ENTER){if(erChoice.getSelectedItem().equals("所有人")){try{out.writeUTF(inputWords.getText());inputWords.setText("");}catch(Exception ea){chatpad.chatLineArea.setT ext("chessClient:KeyPressed无法连接,建议重新连接\n"); erList.removeAll();erChoice.removeAll();inputWords.setText("");controlpad.connectButton.setEnabled(true);}}else{try{out.writeUTF("/"+erChoice.getSelectedItem()+" "+inputWords.getText()); inputWords.setText("");}catch(Exception ea){chatpad.chatLineArea.setT ext("chessClient:KeyPressed无法连接,建议重新连接\n"); erList.removeAll();erChoice.removeAll();inputWords.setText("");controlpad.connectButton.setEnabled(true);}}}}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}public static void main(String args[]){chessClient chessClient=new chessClient();}}/******************************************************************************************下面是:chessInteface.java******************************************************************************************/import java.awt.*;import java.awt.event.*;import java.io.*;import .*;class userPad extends Panel{List userList=new List(10);userPad(){setLayout(new BorderLayout());for(int i=0;i<50;i++){userList.add(i+"."+"没有用户");}add(userList,BorderLayout.CENTER);}}class chatPad extends Panel{TextArea chatLineArea=new TextArea("",18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);chatPad(){setLayout(new BorderLayout());add(chatLineArea,BorderLayout.CENTER);}}class controlPad extends Panel{Label IPlabel=new Label("IP",Label.LEFT);TextField inputIP=new TextField("localhost",10);Button connectButton=new Button("连接主机");Button creatGameButton=new Button("建立游戏");Button joinGameButton=new Button("加入游戏");Button cancelGameButton=new Button("放弃游戏");Button exitGameButton=new Button("关闭程序");controlPad(){setLayout(new FlowLayout(FlowLayout.LEFT));setBackground(Color.pink);add(IPlabel);add(inputIP);add(connectButton);add(creatGameButton);add(joinGameButton);add(cancelGameButton);add(exitGameButton);}}class inputPad extends Panel{TextField inputWords=new TextField("",40);Choice userChoice=new Choice();inputPad(){setLayout(new FlowLayout(FlowLayout.LEFT));for(int i=0;i<50;i++){userChoice.addItem(i+"."+"没有用户");}userChoice.setSize(60,24);add(userChoice);add(inputWords);}}/********************************************************************************************** 下面是:chessPad.java**********************************************************************************************/ import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import java.util.*;class chessThread extends Thread{chessPad chesspad;chessThread(chessPad chesspad){this.chesspad=chesspad;}public void sendMessage(String sndMessage){try{chesspad.outData.writeUTF(sndMessage);}catch(Exception ea){System.out.println("chessThread.sendMessage:"+ea);}}public void acceptMessage(String recMessage){if(recMessage.startsWith("/chess ")){StringTokenizer userToken=new StringTokenizer(recMessage," ");String chessToken;String[] chessOpt={"-1","-1","0"};int chessOptNum=0;while(userToken.hasMoreT okens()){chessToken=(String)userT oken.nextToken(" ");if(chessOptNum>=1 && chessOptNum<=3){chessOpt[chessOptNum-1]=chessToken;}chessOptNum++;}ChessPaint(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Inte ger.parseInt(chessOpt[2]));}else if(recMessage.startsWith("/yourname ")){chesspad.chessSelfName=recMessage.substring(10);}else if(recMessage.equals("/error")){chesspad.statusText.setText("错误:没有这个用户,请退出程序,重新加入"); }else{//System.out.println(recMessage);}}public void run(){String message="";try{while(true){message=chesspad.inData.readUTF();acceptMessage(message);}}catch(IOException es){}}}class chessPad extends Panel implements MouseListener,ActionListener {int chessPoint_x=-1,chessPoint_y=-1,chessColor=1;int chessBlack_x[]=new int[200];int chessBlack_y[]=new int[200];int chessWhite_x[]=new int[200];int chessWhite_y[]=new int[200];int chessBlackCount=0,chessWhiteCount=0;int chessBlackWin=0,chessWhiteWin=0;boolean isMouseEnabled=false,isWin=false,isInGame=false;TextField statusText=new TextField("请先连接服务器");Socket chessSocket;DataInputStream inData;DataOutputStream outData;String chessSelfName=null;String chessPeerName=null;String host=null;int port=4331;chessThread chessthread=new chessThread(this);chessPad(){setSize(440,440);setLayout(null);setBackground(Color.pink);addMouseListener(this);add(statusText);statusText.setBounds(40,5,360,24);statusText.setEditable(false);}public boolean connectServer(String ServerIP,int ServerPort) throws Exception {try{chessSocket=new Socket(ServerIP,ServerPort);inData=new DataInputStream(chessSocket.getInputStream());outData=new DataOutputStream(chessSocket.getOutputStream()); chessthread.start();return true;}catch(IOException ex){statusText.setText("chessPad:connectServer:无法连接\n");}return false;}public void chessVictory(int chessColorWin){this.removeAll();for(int i=0;i<=chessBlackCount;i++){chessBlack_x[i]=0;chessBlack_y[i]=0;}for(int i=0;i<=chessWhiteCount;i++){chessWhite_x[i]=0;chessWhite_y[i]=0;}chessBlackCount=0;chessWhiteCount=0;add(statusText);statusText.setBounds(40,5,360,24);if(chessColorWin==1){ chessBlackWin++;statusText.setText("黑棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待白棋下子...");}else if(chessColorWin==-1){chessWhiteWin++;statusText.setText("白棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待黑棋下子...");}}public void getLocation(int a,int b,int color){if(color==1){chessBlack_x[chessBlackCount]=a*20;chessBlack_y[chessBlackCount]=b*20;chessBlackCount++;}else if(color==-1){chessWhite_x[chessWhiteCount]=a*20;chessWhite_y[chessWhiteCount]=b*20;chessWhiteCount++;}}public boolean checkWin(int a,int b,int checkColor){int step=1,chessLink=1,chessLinkTest=1,chessCompare=0;if(checkColor==1){chessLink=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a+step)*20==chessBlack_x[chessCompare]) && ((b*20)==chessBlack_y[chessCompare])){chessLink=chessLink+1;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a-step)*20==chessBlack_x[chessCompare]) && (b*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if((a*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if((a*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a-step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a+step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++)for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a+step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++){if(((a-step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}}else if(checkColor==-1){chessLink=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++)if(((a+step)*20==chessWhite_x[chessCompare]) && (b*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if(((a-step)*20==chessWhite_x[chessCompare]) && (b*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if((a*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if((a*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if(((a-step)*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if(((a+step)*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}chessLink=1;chessLinkTest=1;for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if(((a+step)*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}for(step=1;step<=4;step++){for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++){if(((a-step)*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])){chessLink++;if(chessLink==5){return(true);}}}if(chessLink==(chessLinkTest+1))chessLinkTest++;elsebreak;}}return(false);}public void paint(Graphics g){for (int i=40;i<=380;i=i+20){g.drawLine(40,i,400,i);}g.drawLine(40,400,400,400);for(int j=40;j<=380;j=j+20){g.drawLine(j,40,j,400);}g.drawLine(400,40,400,400);g.fillOval(97,97,6,6);g.fillOval(337,97,6,6);g.fillOval(97,337,6,6);g.fillOval(337,337,6,6);g.fillOval(217,217,6,6);}public void chessPaint(int chessPoint_a,int chessPoint_b,int color){chessPoint_black chesspoint_black=new chessPoint_black(this);chessPoint_white chesspoint_white=new chessPoint_white(this);if(color==1 && isMouseEnabled){getLocation(chessPoint_a,chessPoint_b,color);isWin=checkWin(chessPoint_a,chessPoint_b,color);if(isWin==false){chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color);this.add(chesspoint_black);chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("黑(第"+chessBlackCount+"步)"+chessPoint_a+" "+chessPoint_b+",请白棋下子");isMouseEnabled=false;}else{chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color);this.add(chesspoint_black);chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(1);isMouseEnabled=false;}}else if(color==-1 && isMouseEnabled){getLocation(chessPoint_a,chessPoint_b,color);isWin=checkWin(chessPoint_a,chessPoint_b,color);if(isWin==false){chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color);this.add(chesspoint_white);chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("白(第"+chessWhiteCount+"步)"+chessPoint_a+" "+chessPoint_b+",请黑棋下子");isMouseEnabled=false;}else{chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color);this.add(chesspoint_white);chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(-1);isMouseEnabled=false;}}}public void netChessPaint(int chessPoint_a,int chessPoint_b,int color){chessPoint_black chesspoint_black=new chessPoint_black(this);chessPoint_white chesspoint_white=new chessPoint_white(this);getLocation(chessPoint_a,chessPoint_b,color);if(color==1){isWin=checkWin(chessPoint_a,chessPoint_b,color);if(isWin==false){this.add(chesspoint_black);chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("黑(第"+chessBlackCount+"步)"+chessPoint_a+" "+chessPoint_b+",请白棋下子");isMouseEnabled=true;}else{this.add(chesspoint_black);chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(1);isMouseEnabled=true;}}else if(color==-1){isWin=checkWin(chessPoint_a,chessPoint_b,color);if(isWin==false){this.add(chesspoint_white);chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("白(第"+chessWhiteCount+"步)"+chessPoint_a+" "+chessPoint_b+",请黑棋下子");isMouseEnabled=true;}else{chessthread.sendMessage("/"+chessPeerName+" /victory "+color);this.add(chesspoint_white);chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(-1);isMouseEnabled=true;}}}public void mousePressed(MouseEvent e){if (e.getModifiers()==InputEvent.BUTTON1_MASK){chessPoint_x=(int)e.getX();chessPoint_y=(int)e.getY();int a=(chessPoint_x+10)/20,b=(chessPoint_y+10)/20;if(chessPoint_x/20<2||chessPoint_y/20<2||chessPoint_x/20>19||chessPoint_y/20>19) {}else{chessPaint(a,b,chessColor);}}}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}public void actionPerformed(ActionEvent e){}}class chessPoint_black extends Canvas implements MouseListener {chessPad chesspad=null;chessPoint_black(chessPad p){setSize(20,20);chesspad=p;addMouseListener(this);}public void paint(Graphics g){g.setColor(Color.black);g.fillOval(0,0,14,14);}public void mousePressed(MouseEvent e){// if(e.getModifiers()==InputEvent.BUTTON3_MASK)// {// chesspad.remove(this);// chesspad.chessColor=1;// chesspad.text_2.setText("");// chesspad.text_1.setText("请黑棋下子");// }}public void mouseReleased(MouseEvent e){}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseClicked(MouseEvent e) {}}class chessPoint_white extends Canvas implements MouseListener {chessPad chesspad=null;chessPoint_white(chessPad p)。
JAVA程序设计五子棋制作实训
《JAVA程序设计》实训报告实训题目: 五子棋游戏制作专业:计算机网络班级: 14网络(1)班姓名:指导教师:2015 年 12 月 31日目录1.实训目的........................... 错误!未定义书签。
2.实训题目描述和要求................. 错误!未定义书签。
实训题目描述...................... 错误!未定义书签。
实训题目要求...................... 错误!未定义书签。
3.实训报告内容....................... 错误!未定义书签。
需求分析.......................... 错误!未定义书签。
概要设计.......................... 错误!未定义书签。
详细设计.......................... 错误!未定义书签。
编码.............................. 错误!未定义书签。
测试.............................. 错误!未定义书签。
4.总结............................... 错误!未定义书签。
实训指导教师评语................... 错误!未定义书签。
1.实训目的随着经济社会的迅速发展,人们生活水平有了很大的提高,人们的生活观念也发生了巨大的改变。
高品质的生活、现代化得生活方式成为人们共同追求的目标;休闲、娱乐性活动作为时尚生活中的一部分,而被大多数的人所追捧。
棋类项目作为一种智力型项目,可以益智健心、修身养性,也可以满足人们对于娱乐和休闲的新需求。
一些项目比如五子棋等等,由于项目本身互动的特点,一直被人们所喜爱,因此得以生存和发展,成为许多人喜爱的休闲娱乐性棋类项目。
而今,以网络技术为核心和计算机技术的现代网络技术已经在现实生活得到了十分的广泛的使用。
“Java程序设计”——“五子棋”综合实验报告
“Java程序设计”综合实验报告一、前言1、项目背景通过五子棋这个课程设计。
可以让我们更加熟悉Java程序设计这门课程,加强对Eclipse这个软件的使用,加深对Java语言的掌握,提高编程水平。
同时培养能力,为将来的工作打下坚实的基础。
2、目标和意义目标:锻炼我们的能力,提高组中每一个人对Java语言的认识,培养编程兴趣。
让每一个人都能参与进来,提高团队合作意识。
意义:通过编写综合类的程序,运用已经学过的知识,和自主学习一些新的知识,提高了学习能力,掌握了一些自主学习的方法。
3、开发分工及进度安排二、功能分析1、主要模块本项目主要分为3个大的模块,分别为整体布局;界面绘制;与对战的算法。
由于游戏规则的设置,这里的游戏模式分为人机对战和人人对战。
黑白双方依次落子,由黑子先下,当任意一方在棋盘上形成横向,竖向,斜向连续五个相同颜色的棋子的一方获胜。
主要功能①实现在2种模式下五子棋的游戏。
②实现通过鼠标的点击位置放置棋子,达到下棋的目的。
③实现游戏玩家对游戏模式的自主选择。
④实现对在每种游戏模式下的黑子先手下棋的规定,先达到5子即为胜利。
三、关键功能的设计与实现1、数据结构与算法数据结构:项目中主要数据结构为二维数组。
用于存储棋盘上棋子的信息,和保存棋型表。
主要算法:(一)iswin()函数:用来判断输赢,通过鼠标事件所得到的点或者电脑下的点的坐标,来扫描该点八个方向的相邻的相同棋子数,上下,左右,斜左上下,斜右上下为四组,任意一组等于5即为胜利,由于本程序没有考虑禁手原则,只考虑了民间规则,所以大于5也为胜利。
public int iswin1(int x, int y, int heqi) {int k, s1, s2, s3, s4, s5, s6, s7, s8;s1 = 0;s2 = 0;s3 = 0;s4 = 0;s5 = 0;s6 = 0;s7 = 0;s8 = 0;if (heqi == 256)return -1;for (k = 1; k < 5; k++) {if (y + k < 16 && qipanqizi[x][y + k] == qipanqizi[x][y])s1++;elsebreak;}for (k = 1; k < 5; k++) {if (y - k > -1 && qipanqizi[x][y - k] == qipanqizi[x][y])s2++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && y + k < 16&& qipanqizi[x + k][y + k] == qipanqizi[x][y]) s3++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && y - k > -1&& qipanqizi[x - k][y - k] == qipanqizi[x][y]) s4++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && qipanqizi[x + k][y] ==qipanqizi[x][y])s5++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && qipanqizi[x - k][y] ==qipanqizi[x][y])s6++;elsebreak;}for (k = 1; k < 5; k++) {if (x - k > -1 && y + k < 16&& qipanqizi[x - k][y + k] == qipanqizi[x][y]) s7++;elsebreak;}for (k = 1; k < 5; k++) {if (x + k < 16 && y - k > -1&& qipanqizi[x + k][y - k] == qipanqizi[x][y]) s8++;elsebreak;}if (s1 + s2 >= 4 || s3 + s4 >= 4 || s5 + s6 >= 4 || s7 + s8 >= 4) {return 1;} elsereturn 0;}(二)人机对战通过对整个棋盘上每一个点的扫描,获得了电脑和玩家的棋型表,表中数据为该点的权值。
五子棋Java实验报告
五子棋Java实验报告五子棋JAVA实验报告一、实验目的和要求1、能够用编程语言实现一个简单的五子棋程序2、在实际系统中使用、实现人工智能的相关算法3、进一步加深对人工智能算法的理解二、五子棋的基本常识与原理1、五子棋的起源五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”;是中国民间非常熟知的一个古老棋种。
相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。
亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
五子棋发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19X19,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
2、五子棋的基本常识与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。
五子棋的开始阶段称为开局,或称布局。
其开局阶段是十分短暂的,大约在七着与十几着之间。
在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。
在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。
因此积极处理好开局和开局向中局的过渡十分重要。
五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。
3、五子棋比赛的相关规定(1) 职业连珠规则a. 黑方先下子,白后下,从天元开始相互顺序落子。
b. 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
c. 黑棋禁手判负,白棋无禁手。
java课程设计五子棋实验报告
java课程设计五子棋实验报告Java课程设计五子棋实验报告一、实验目的本次实验主要目的是运用Java编程语言,设计并实现一个简单的五子棋游戏,通过实践掌握Java编程基础知识和面向对象编程思想。
二、实验内容本实验要求设计并实现一个五子棋游戏,主要功能包括:1. 实现双人对战功能,允许两个玩家交替下棋;2. 实现判断胜负功能,当某一方连成五子时,游戏结束,显示胜利者;3. 实现悔棋和重新开始的功能。
三、实验原理1. 界面设计界面设计采用Java Swing框架,主要包括棋盘和控制面板两部分。
棋盘使用JPanel实现,通过绘制线条和圆形实现棋盘和棋子的显示。
控制面板使用JPanel和JButton实现,提供重新开始和悔棋功能。
2. 游戏逻辑游戏逻辑主要包括下棋和判断胜负两个部分。
下棋功能通过记录当前玩家和棋子位置实现,判断胜负则通过遍历棋盘上的所有棋子,判断是否满足连成五子的条件。
3. 实现悔棋和重新开始的功能悔棋功能主要通过记录每一步棋的位置和玩家来实现,重新开始则需要清空棋盘和游戏记录。
四、实验步骤1. 设计并实现界面,包括棋盘和控制面板;2. 实现游戏逻辑,包括下棋和判断胜负;3. 实现悔棋和重新开始的功能;4. 进行代码测试和调试,确保程序能够正常运行。
五、实验结果经过测试,程序能够正常运行,实现了双人对战、判断胜负、悔棋和重新开始的功能。
六、实验总结本次实验通过设计并实现一个简单的五子棋游戏,巩固了Java编程基础知识和面向对象编程思想,同时也学习了Swing框架的使用。
在实现过程中也遇到了一些问题,如棋子位置的计算、胜负判断的实现等,通过查阅资料和调试最终得以解决。
总体来说,本次实验收获颇丰,对Java编程有了更深入的了解和认识。
五子棋实训报告(电子版)范文
《JA V A程序设计》实训报告课程名称:JA V A程序设计专业:计算机应用技术班级:11计算机应用班小组成员:巨敏石丽涛张娅雯李延尚文学董丁喜周致远指导老师:***目录一.实训目的 (1)二. 实训题目和要求2.1实训题目描述 (1)2.2实训要求 (1)三.实训报告内容3.1五子棋主框架 (1)3.2棋盘、棋子及说明信息 (1)3.3对弈算法相关问题设计 (1)四.实训中的部分代码 (2)五.五子棋源程序代码 (3)六. 总结 (17)一、实训目的本次实训,学生可以将理论知识与具体实践相结合,巩固对JA VA相关方法和概念的理解。
通过实训单机版五子棋游戏的编程,掌握JA V A语言编程的基础知识并能熟练运用,熟悉累声明与对象的使用,运用JA V Aswing编写单机版五子棋游戏,并实现其功能。
通过本次实训,可以开拓思维,增强编程思想,为深入学习JA VA打下良好的基础。
二、实训题目描述和要求2.1实训题目描述实训题目:JA V A五子棋单机版游戏。
描述:通过JA V A的swing组件,实现五子棋简单的双人对弈,并通过内部条件判断实现输赢的双方的下棋过程。
2.2实训要求(1)五子棋游戏的主窗口也就是游戏界面的实现(2)棋子黑白色的设置及判定(3)完成判断某一横行是否练成五子及所有方向是否练成五子的功能(4)几个简单按钮的实现,“重新开始”“悔棋”“退出”按钮(5)菜单栏的实现,“重新开始”“悔棋”“退出”菜单项三、实训报告内容3.1主框架编写一个startCheesJFrame类,主要用来显行主窗体界面,包括工具条面板、菜单栏项。
设置界面关闭事件。
并编写一个内部类MyItemListener来监听按钮和菜单栏的单机事件。
3.2棋盘、棋子(1)编写point类,包括棋子的X/Y索引,颜色。
定义构造函数和相应的get方法。
(2)编写ChessBoard类,设置棋盘背景颜色为橘黄色(3)在主框架类中创建ChessBoard对象,并添加到主框架中(4)编写mousePressed方法来进行绘制棋盘和棋子3.3对弈算法相关问题设计(1)编写mousePressed方法的内容,预定义isBlack表示下的是黑棋还是白棋。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五子棋JAVA实验报告一、实验目的和要求1、能够用编程语言实现一个简单的五子棋程序2、在实际系统中使用、实现人工智能的相关算法3、进一步加深对人工智能算法的理解二、五子棋的基本常识与原理1、五子棋的起源五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”;是中国民间非常熟知的一个古老棋种。
相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。
亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
五子棋发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19X19,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
2、五子棋的基本常识与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。
五子棋的开始阶段称为开局,或称布局。
其开局阶段是十分短暂的,大约在七着与十几着之间。
在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。
在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。
因此积极处理好开局和开局向中局的过渡十分重要。
五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。
3、五子棋比赛的相关规定(1) 职业连珠规则a. 黑方先下子,白后下,从天元开始相互顺序落子。
b. 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
c. 黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“长连”。
即黑棋只能以“四三”取胜。
有关术语解释请见图示说明。
d. 如分不出胜负,则定为平局。
对局中拔子、中途退场均判为负。
e. 五连与禁手同时形成,判胜。
(2) 比赛中的规定和特例a. 对局开始前,双方猜子,大数减小数,单数交换,偶数不换。
b. 白棋第一手(即盘面第二着棋)应在天元为界自己一侧布子,主要以示尊重对方,之后双方可任意行子。
c. 对局中双方应遵守“职业连珠五子棋规则”,如出现争议,应由裁判判定。
d. 对局中掉子(棋子掉落在棋盘上)的一方判负。
如遇推子或蹭子,以盘面第一落点为准。
用手将棋子扶正不算违规。
e. 对局中应礼貌行棋,防止不正常声音、动作影响对方思考。
f.. 比赛结束后,双方应将各自棋子放回原处。
g. 对局中如黑方出现禁手,白方应立即指出禁手点,黑方即负。
如白方在黑方出现禁手后,又下一步白子,黑棋禁手则不成立了。
h. 比赛对局时间,双方分别为15分钟、1小时、2小时、5小时四个等级标准,超时判负。
(3) 特殊规定职业五子棋虽然对黑棋采取了种种限制,但黑子先行的优势依然很大。
因此,在高段位的职业比赛中,又出现了三种特殊的规定。
a. 指定打法:是指比赛双方按照约定好的开局进行对弈,由白棋先行。
b. 三手可交换:是指黑棋下盘面第3手棋后,白方在下第四手之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。
c. 五手两打法:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中拿掉一粒棋子,然后再继续对弈。
一般说来,白棋肯定拿掉对白方不利的一点,而保留对黑方较为不利的那点让黑方行棋。
三、五子棋的系统设计1、系统用例模型设计五子棋系统应该具有选择玩家先落子还是电脑先落子的功能,应该具有开始游戏和重新开始的功能,当然了,必须具有在玩家指定位置落子的功能。
以上描述,用用例图在图1中做进一步描述。
这部分功能,主要通过界面与系统的交互来实现。
落子选择电脑先落子重新开始图1 五子棋系统的玩家用例图各个用例,简单描述如下:●选择电脑先落子:选择后,在游戏过程中,由电脑执黑子,先落子;玩家执白子,于电脑后落子;●选择玩家先落子:选择后,在游戏过程中,由玩家执黑子,先落子;电脑执白子,于玩家后落子;●落子:原则上说,只要不违反禁手规则,在玩家鼠标点击最近的落子点落子,但是在本系统中,简单起见,没有考虑禁手规则;●开始游戏:选择后,根据设定的电脑还是玩家先落子,开始游戏;●重新开始:在游戏途中,可以选择重新开始,中断游戏并重新开始游戏。
同时,五子棋系统本身应该具有棋盘绘制、棋势扫描、棋势排序、棋势评估、择位落子,以及胜负判定的功能,尤其是对于棋势排序、棋势评估和择位落子,这里是体现五子棋系统人工智能(AI)的关键之处。
以上描述,用用例图在图2中进一步描述。
棋势排序胜负判定图2 五子棋系统的系统用例图各个用例,简单描述如下:●棋盘绘制:绘制19*19的棋盘及相关按钮和选项,并负责电脑、玩家落子后棋子的具体绘制;●棋势扫描:扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势;●棋势排序:对获取的八个方向的棋势(实际上下合一,左右合一,左下右上合一,坐上右下合一,为四个方向),进行排序,便于进行棋势评估;●棋势评估:分别对电脑和玩家的棋势进行评估,量化棋势;●择位落子:比较电脑和玩家的棋势,若有利于玩家,则采取“守、堵”的策略,若有利于电脑,则采取“攻、走”的策略;胜负判定:每次电脑或是玩家落子后,判断胜负情况,若出现“五子连珠”,则“连珠”一方取胜,另一方失败,游戏结束。
2、系统界面设计为了实现玩家的用例所需要的功能,同时又便于使用,五子棋系统的界面设计得比较简单,如图3所示。
整体界面为一个19*19的棋盘,在f-06、f-14、j-10、n-06、n-14这五个位置画了一个小方块,以提醒玩家棋盘的中央位置,便于把握有利位置落子。
在棋盘的右侧是一些控制和提醒选项、按钮和对弈状态标签。
其中,选项有“我是老大我先来”和“让让电脑也无妨”两个。
选择前者,则玩家先落子;选择后者,则电脑先落子。
按钮有“人机对战,快冲啊”和“不行了?那重来吧”两个。
单击前者,则游戏开始;单击后者,则中断游戏,重新开始。
标签有“就不告诉你是谁赢了”和“就不告诉你这是第几步”两个。
前者是在游戏分出胜负后,显示是黑方取胜还是白方取胜;后者是在游戏过程中,不论是电脑落子还是玩家落子,都提示现在是第几步落子。
图3 五子棋系统界面3、系统模块设计为了实现五子棋系统本身具有的功能,将系统分为这几个模块:五子棋主模块、棋势扫描模块、棋势排序模块、棋势评估模块以及随机落子模块。
其中,五子棋主模块实现棋盘绘制、胜负判定的功能,以及对弈过程中对比双方棋势的择位落子模块。
棋势扫描模块、棋势排序模块、棋势评估模块分别实现棋势扫描、棋势排序、棋势评估的功能;而随机落子模块则实现在前两步棋势尚未形成时,电脑紧邻玩家落子位置随机择位落子的功能,是用例图中择位落子功能的一部分。
对应的,系统一共有五个类,分别对应五个模块;分别为:五子棋主模块Gobang类、棋势扫描StatusScan类、棋势排序StatusSort 类、棋势评估StatusEvaluation类,以及随机落子RandomPlay类。
类图如图4所示。
其中Gobang类中的属性和方法并没有完全列出,只列出了主要的属性和方法;其余类基本列出了所有的属性和方法。
具体细节将在第四部分“五子棋的实现与测试”一节讨论,这里不再赘述。
图4 五子棋系统的类图四、五子棋的实现与测试1、Gobang类的实现Gobang类是五子棋的核心类,棋盘绘制、棋子落子,响应事件的处理,游戏的控制和模式设置,胜负判定,以及对棋势扫描、排序、评估等的调用都在这里实现。
Gobang类的类图如图5所示。
图5 Gobang类类图其中棋盘的绘制,有paint()和init()来实现,棋子落子由setQizi()来实现,响应事件的处理也在这个类中添加监视器并处理,而游戏的控制和设置在Game_start()和Game_rastart()中实现,游戏胜负的判定由Judge()方法和四个判定不同方向上是否五子连珠的Game_win_*()函数来实现。
而最为重要的棋势扫描、排序和评估,则由其属性scanp、scanc、sort、evaluatep、evaluatec分别调用它们的方法来实现。
随机落子由属性randomPlay调用其方法实现。
2、StatusScan类的实现StatusScan类通过扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势。
StatusScan类的类图如图6所示。
图6 StatusScan 类类图其中三维数组shape 为一个20*20*5的数组,用来存储所获取的整个对弈双方的棋势。
当然了,在实际实现中,实例化了两个StatusScan 类的对象scanp 和scanc ,这两个对象分别用来存储玩家的棋势和电脑的棋势。
而statusScan()方法具体实现从棋盘上获取整个棋势的具体过程,参数chesspad 存储棋盘上的详细落子情况,参数colour 决定需要获取的是黑方的棋势还是白方的棋势。
具体扫描时,对于棋盘(i, j)处,有上下、左右、左下右上、坐上右下八个方向,但是统计时,将上下、左右、左下右上、左上右下分别合一,则一共有四个结果,分别存储在shape[i][j][0]、shape[i][j][1]、shape[i][j][2]、shape[i][j][3]中。
3、StatusSort 类的实现StatusSort 类对StatusScan 类扫描得到的棋势进行排序,以便于做进一步的棋势评估。
StatusSort 类的类图如图7所示。
图7 StatusSort 类类图其中,StatusSort 类只有一个方法statusSort(),参数shape 即为StatusScan 类扫描获取的棋势数据,该方法主要是对shape 中的棋势数据进行排序,使得shape 数组满足以下条件:[3]shap[i][j] >= [2]shap[i][j] >= [1]shap[i][j] >= [0]shap[i][j]19 to 1 = j i, from 排序后的结果仍然存储在shape 数组中。
4、StatusEvaluation类的实现StatusEvaluate类对StatusSort类排序过的棋势进行评估,为对弈时电脑择位落子提供依据。
StatusEvaluate类的类图如图8所示。
图8 StatusEvaluate类类图其中,StatusEvaluate类也只有一个方法statusEvaluate(),参数shape即为StatusSort类排序后的棋势,该方法主要是根据棋盘上每一个位置(i, j)的棋势数据shap[i][j][0]、shap[i][j][1]、shap[i][j][2]以及shap[i][j][3]的取值,计算该位置的棋势评估值,并保存在shap[i][j][4]中。