1、第 1 页 共 11 页目 录前言 31 剪刀石头布游戏设计思路阐述 .42 程序概要设计 .52.1 功能需求分析 52.2 性能需求分析 52.3 程序框图 52.4 Java 类及自定义类相互继承的层次关系 62.4.1 Java 类及自定义类的说明 .62.4.2 类中成员及作用 .73 程序详细设计 .83.1 包的加载 .83.2 自定义类创建服务器端和客户端 83.3 创建程序线程 94 测试运行 .95 源代码清单 .106 总结 .137 致谢 .13参考文献 13第 2 页 共 11 页基于 JAVA 的剪刀石头布游戏设计摘要:本课程设计使用 Java 语言,运用 java
2、.io 包和 包及getInputStream()、getOutputStream()等方法,编写出一个能在 dos 环境中显示出剪刀石头布游戏界面,启动服务器端线程,运行客户端线程,提示玩家出拳,然后,程序把玩家输入的数据传入到服务器端,通过服务器端线程的函数得出结果,然后再把结果传输到界面上。关键字:方法;网络编程;多线程;输入输出流第 3 页 共 11 页前言Java,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台的总称。用 Java 实现的 HotJava 浏览器(支持 Java applet)显示了 Java 的
3、魅力:跨平台、动态的 Web、Internet 计算。从此,Java 被广泛接受并推动了 Web 的迅速发展,常用的浏览器现在均支持 Java applet。在面向对象程序设计中,通过继承可以简化类的定义。继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类,而原始类称为新类的超类。派生类可以从它的基类那里继承方法和变量, 并且类可以修改或增加新的方法使之更适合特殊的需要。在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“
4、多线程处理” 。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable接口,因此,任何一个线程均有它的 run 方法,而 run
5、方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制。通过一个学期的学习,对 Java 有了一定的了解,为了巩固所学知识,编写一个剪刀石头布游戏。1 剪刀石头布游戏设计思路阐述在设计游戏时,我们要充分考虑到剪刀石头布游戏的特性,以及多种技术的实现:构造创建服务器端和客户端创建输入输出流编写服务器端处理数据的线程方法绘制游戏界面绘制界面上的提示采用此方法设计使程序简洁明了,使绘制游戏界面时简单化,更加易于游戏的实现,程序也更易于读懂。第 4 页 共 11 页如 java 中得到输入输出流的方法:/调用客户端的 getInp
6、utStream()方法Inputs=newBufferedReader(new InputStreamReader(client.getInputStream();通过调用此方法获取从服务器得到的数据调用客户端的 getOutputStream()方法,通过此方法把客户端的数据传输给服务器。2 程序概要设计2.1 功能需求分析一个剪刀石头布游戏,根据一般的常识,首先要有两个人,两个人同时出,然后,根据双方的出拳,决定谁是赢者,虽然想起来这个游戏很简单,但如何实现 ,还是有一定难度的。实现这个时针时涉及到几个技术问题:1. 双方如何出拳2. 如何同时出拳3. 如何判断哪方赢了4. 如何显示结果
7、剪刀石头布游戏,都是通过两个人同时出拳,然后根据双方出的拳,判定哪方是赢家。2.2 性能需求分析准确性:在实现此的过程中,我们要考虑到,双方是否能同时地出拳,还要就是如何去判断,准确地知道哪方是赢家.简洁性:在实现此的过程中,我们要考虑到,怎样使游戏界面更简单,让人更容易明白它怎样去玩。2.3 程序框图游戏程序框图如图 1 所示:图 1 游戏程序框图第 5 页 共 11 页2.4 JAVA 类及自定义类相互继承的层次关系2.4.1 Java 类及自定义类的说明自定义类:类名:SocketServer作用:服务器类继承的父类:Thread 类实现的接口:无类名:Service作用: 服务器类,它
8、是判定胜负的类继承的父类:Thread 类类中成员: String data; BufferedReader inputs; PrintStream outputs; Socket client;实现的接口:无类名:Client作用:客户端类类中的成员: getInputStream();getOutputStream();InputStreamReader ();readLine();实现的接口:无自定义类中子类和其父类的继承关系如图 2 如所示:ThreadServicegetInputStreamStart Run RandomgetOutputStreamReadline图 2 子类及
9、其父类继承关系图第 6 页 共 11 页2.4.2 类中成员及作用Service 类成员:String data; /接收数据BufferedReader inputs;/ 读取数据PrintStream outputs;/输出数据Socket client;/定义套接字Client 类成员:String data;/接收数据Socket client = null;/定义套接字 BufferedReader inputs = null;/ 读取数据BufferedReader key = null;/ 缓冲数据PrintStream outputs = null;/输出数据3 程序详细设计3
10、.1 类获包的加载加载剪刀石头布游戏设计中用到的类和包,用于运行主程序:import java.io.*; import .*; 3.2 自定义类创建服务器端使用自定义类 ServerSocket 继承父类 Thread 使用 run 等方法,构造函数创建一个服务器端。程序代码如下:public class SocketServer extends Thread ServerSocket server; public SocketServer() try server = new ServerSocket(8080); catch(IOException e) System.exit(0);
11、this.start(); public void run() try while(true) Socket client = server.accept();Service ss = new Service(client); catch(IOException e) 第 7 页 共 11 页System.exit(1); public static void main(String args) new SocketServer(); 3.3 创建数据处理类创建一个用于数据处理类使服务器能准确处理数据,获取数据,并使用方法 run()实现数据处理。实现代码如下:/创建数据储存变量inputs
12、= new BufferedReader(new InputStreamReader(client.getInputStream();outputs = new PrintStream(client.getOutputStream(); /创建一个 Run 方法public void run() 3.4 创建客户端类创建一个用于客户端接收玩家输入的数据的类,程序实现代码如下:/接收客户端的数据public class Client public static void main(String args) String data; Socket client = null; BufferedRe
13、ader inputs = null; BufferedReader key = null; PrintStream outputs = null; try client = new Socket(InetAddress.getLocalHost(),8080); inputs=new BufferedReader(new InputStreamReader(client.getInputStream();outputs = new PrintStream(client.getOutputStream();key = new BufferedReader(new InputStreamRead
14、er(System.in); catch(IOException e) System.out.println(“CAN NOT CONN WITH SERVER“); try while(true) System.out.println(“-“); System.out.print(“请出拳:石头/剪刀/布 “); data = key.readLine();outputs.println(data);System.out.println(“ECHO: “ + inputs.readLine(); catch(IOException e) System.out.println(“ERROR I
15、O“); 第 8 页 共 11 页 try client.close(); catch(IOException e) System.out.println(“can not close it“); 4 测试运行程序编写好后,用 MyEclipse 软件运行,检测程序设计结果,执行目标程序后得到如图 4 所示的窗体:图 4 程序测试图“空格+石头、剪刀或布 ”经检测程序运行正常。5 源代码清单import java.io.*; import .*; public class SocketServer extends Thread ServerSocket server; public Socke
16、tServer() try server = new ServerSocket(8080); catch(IOException e) System.exit(0); this.start(); public void run() try 第 9 页 共 11 页while(true) Socket client = server.accept();Service ss = new Service(client); catch(IOException e) System.exit(1); public static void main(String args) new SocketServer
17、(); public class Service extends Thread String data; BufferedReader inputs; PrintStream outputs; Socket client; public Service(Socket socket) client = socket; try inputs=new BufferedReader(new InputStreamReader(client.getInputStream();outputs = new PrintStream(client.getOutputStream();catch (IOExcep
18、tion e) e.printStackTrace(); this.start(); public void run() try while (true) data = inputs.readLine();int res = (int) (Math.random() * 3); if (data = null) break; else if (res = 0 else if (res = 0 else if (res = 0 else if (res = 1 else if (res = 1 else if (res = 1 第 10 页 共 11 页 else if (res = 2 els
19、e if (res = 2 else if (res = 2 else data = “电脑不认识你出的拳“; outputs.println(data); catch (IOException e) e.printStackTrace(); try client.close(); catch (IOException e) e.printStackTrace(); public class Client public static void main(String args) String data; Socket client = null; BufferedReader inputs =
20、 null; BufferedReader key = null; PrintStream outputs = null; try client = new Socket(“localhost“,8080); inputs = new BufferedReader(new InputStreamReader(client.getInputStream();outputs = new PrintStream(client.getOutputStream();key = new BufferedReader(new InputStreamReader(System.in); catch(IOExc
21、eption e) System.out.println(“CAN NOT CONN WITH SERVER“); try while(true) System.out.println(“-“); System.out.print(“请出拳:石头/剪刀/布 “); data = key.readLine();outputs.println(data);System.out.println(“ECHO: “ + inputs.readLine(); catch(IOException e) System.out.println(“ERROR IO“); 第 11 页 共 11 页try clie
22、nt.close(); catch(IOException e) System.out.println(“can not close it“); 6 总结通过此次的课程设计,让我们了解和学会了许多 Java 的基础知识。从课程设计中学会了 Java 中类的作用及其方法的调用,知道了类的父类和子类的的继承关系及自定义类的作用,还使我们了解到服务器和客户端的特点和作用,我们需要学习的东西还很多。通过此次的课程设计,让我了解到自己以往学习中的不足之处,认识到自己还有哪一些知识没有掌握,让我们有了学习的重点和方向,更有利于今后的学习。在实践中发现问题,分析问题,解决问题,在每一个问题中,吸取知识和经验,最终掌握知识和技巧。通过课程剪刀石头布游戏,让我们体会到了付出劳动才能有所收获的喜悦感,让我们明白了只有真正通过实践才能更好的融汇和掌握所学的理论知识。这次课程设计,让我今后有了更好的学习方向,给了我们更多的学习动力,对我们的帮助很大。参考文献1 张岚,张志伟. 浅谈面向对象的程序设计J.内蒙古科技与经济, 2009,(05)2 危锋.论 JAVA 继承机制中父类与子类的关系J.福建电脑, 2010, (06)3 清华大学计算机与信息管理中心主编. Java 语言程序设计M.4 时雷;虎晓红;席磊; 张浩.Java 程序设计课程教学分析J.