基于JAVA的剪刀石头布游戏设计

基于JAVA的剪刀石头布游戏设计
基于JAVA的剪刀石头布游戏设计

目录

前言 (3)

1剪刀石头布游戏设计思路阐述 (3)

2程序概要设计 (4)

2.1功能需求分析 (4)

2.2性能需求分析 (4)

2.3程序框图 (4)

2.4 Java类及自定义类相互继承的层次关系 (4)

2.4.1 Java类及自定义类的说明 (5)

2.4.2类中成员及作用 (5)

3程序详细设计 (6)

3.1 包的加载 (6)

3.2自定义类创建服务器端和客户端 (6)

3.3创建程序线程 (7)

4测试运行 (9)

5源代码清单 (10)

6总结 (13)

7致谢 (13)

参考文献 (13)

基于JAVA的剪刀石头布游戏设计

摘要:本课程设计使用Java语言,运用java.io包和https://www.360docs.net/doc/1417568302.html,包及getInputStream()、getOutputStream()等方法,编写出一个能在dos环境中显示出剪刀石头布游戏界面,启动服务器端线程,运行客户端线程,提示玩家出拳,然后,程序把玩家输入的数据传入到服务器端,通过服务器端线程的函数得出结果,然后再把结果传输到界面上。

关键字:方法;网络编程;多线程;输入输出流

前言

Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。

在面向对象程序设计中,通过继承可以简化类的定义。继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类,而原始类称为新类的超类。派生类可以从它的基类那里继承方法和变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java语言支持多个线程的同时执行,并提供多线程之间的同步机制。

通过一个学期的学习,对Java有了一定的了解,为了巩固所学知识,编写一个剪刀石头布游戏。

1剪刀石头布游戏设计思路阐述

在设计游戏时,我们要充分考虑到剪刀石头布游戏的特性,以及多种技术的实现:

⑴构造创建服务器端和客户端

⑵创建输入输出流

⑶编写服务器端处理数据的线程方法

⑷绘制游戏界面

⑸绘制界面上的提示

采用此方法设计使程序简洁明了,使绘制游戏界面时简单化,更加易于游戏的实现,程序也更易于读懂。

如java中得到输入输出流的方法:

//调用客户端的getInputStream()方法

Inputs=newBufferedReader(new InputStreamReader(client.getInputStream()));

通过调用此方法获取从服务器得到的数据

调用客户端的getOutputStream()方法,通过此方法把客户端的数据传输给服务器。2程序概要设计

2.1功能需求分析

一个剪刀石头布游戏,根据一般的常识,首先要有两个人,两个人同时出,然后,根据双方的出拳,决定谁是赢者,虽然想起来这个游戏很简单,但如何实现,还是有一定难度的。实现这个时针时涉及到几个技术问题:

1.双方如何出拳

2.如何同时出拳

3.如何判断哪方赢了

4.如何显示结果

剪刀石头布游戏,都是通过两个人同时出拳,然后根据双方出的拳,判定哪方是赢家。

2.2性能需求分析

准确性:在实现此的过程中,我们要考虑到,双方是否能同时地出拳,还要就是如何去判断,准确地知道哪方是赢家.

简洁性:在实现此的过程中,我们要考虑到,怎样使游戏界面更简单,让人更容易明白它怎样去玩。

2.3程序框图

游戏程序框图如图1所示:

图1 游戏程序框图

2.4 JAVA类及自定义类相互继承的层次关系

2.4.1 Java类及自定义类的说明

自定义类:

类名:SocketServer

作用:服务器类

继承的父类:Thread类

实现的接口:无

类名:Service

作用: 服务器类,它是判定胜负的类

继承的父类:Thread类

类中成员: String data;

BufferedReader inputs;

PrintStream outputs;

Socket client;

实现的接口:无

类名:Client

作用:客户端类

类中的成员: getInputStream();

getOutputStream();

InputStreamReader ();

readLine();

实现的接口:无

自定义类中子类和其父类的继承关系如图2如所示:

图2 子类及其父类继承关系图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.1类获包的加载

加载剪刀石头布游戏设计中用到的类和包,用于运行主程序:import java.io.*;

import https://www.360docs.net/doc/1417568302.html,.*;

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);

}

this.start();

}

public void run() {

try {

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();

}

}

3.3创建数据处理类

创建一个用于数据处理类使服务器能准确处理数据,获取数据,并使用方法run()实现数据处理。实现代码如下:

//创建数据储存变量

inputs = 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;

BufferedReader 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 InputStreamReader(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 IO");

}

try {

client.close();

}

catch(IOException e) {

System.out.println("can not close it");

}

}

}

4测试运行

程序编写好后,用MyEclipse软件运行,检测程序设计结果,执行目标程序后得到如图4所示的窗体:

图4 程序测试图

“空格+石头、剪刀或布”

经检测程序运行正常。

5源代码清单

import java.io.*;

import https://www.360docs.net/doc/1417568302.html,.*;

public class SocketServer extends Thread {

ServerSocket server;

public SocketServer() {

try {

server = new ServerSocket(8080);

}

catch(IOException e) {

System.exit(0);

}

this.start();

}

public void run() {

try {

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();

}

}

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 (IOException 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 && "石头".equals(data)) {

data = "电脑也是石头,打平了!!";

} else if (res == 0 && "剪刀".equals(data)) {

data = "电脑是石头,电脑赢了!!";

} else if (res == 0 && "布".equals(data)) {

data = "电脑是石头,恭喜,你赢了!!";

} else if (res == 1 && "石头".equals(data)) {

data = "电脑是剪刀,恭喜,你赢了!!";

} else if (res == 1 && "剪刀".equals(data)) {

data = "电脑也是剪刀,打平了!!";

} else if (res == 1 && "布".equals(data)) {

data = "电脑是剪刀,电脑赢了!!";

} else if (res == 2 && "石头".equals(data)) {

data = "电脑是布,电脑赢了!!";

} else if (res == 2 && "剪刀".equals(data)) {

data = "电脑是布,恭喜,你赢了!!";

} else if (res == 2 && "布".equals(data)) {

data = "电脑也是布,打平了!!";

} 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 = 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(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 IO");

}

try {

client.close();

相关主题
相关文档
最新文档