第21页 共41页
}
catch( IOException ioe ) { try { ??
} catch( MissingResourceException e) { MapResb = null; } } }
public static String getTranslatedMapName(String strOriginal) {
if (MapResb == null) { return strOriginal; }
String strReturn; try {
strReturn = MapResb.getString( strOriginal); } catch(MissingResourceException e) { strReturn = strOriginal; }
return strReturn; }
public static void setCards(String INstrFile) {
String strName = INstrFile.substring( 0, INstrFile.lastIndexOf( '.')); String strFile = strName + \+ TranslationBundle.getBundle().getLocale().getLanguage() + \
try {
CardsResb = new PropertyResourceBundle( (new URL(king.engine.Risk.mapsdir,strFile)).openStream() );
} catch( IOException ioe ) {
if(INstrFile.endsWith(\
{
try {
CardsResb=ResourceBundle.getBundle(\
TranslationBundle.getBundle().getLocale());
} catch( MissingResourceException e) { CardsResb = null; } } } }
public static String getTranslatedMissionName(String strOriginal) {
if (CardsResb == null) { return null; }
String strReturn; try {
strReturn = CardsResb.getString( strOriginal); } catch(MissingResourceException e) { strReturn = null; }
第22页 共41页
}
return strReturn; }
4.3 网络包的设计
游戏中该包的设计主要是用来实现游戏的网络联机游戏的功能的包,其中主要是一组实现两台机子相互连接的类:ChatArea类,ChatDisplayThread类,ChatReader类以及ChatServerThread类。
实现网络连接主要是要用到两个类:java.net.Socket类和java.net.ServerSocket类以及多线程和输入输出等类。
java.net包主要是为实现网络应用程序提供类。
让我们先了解一下什么是套接字的概念,网络套接字非常像电器的插座。网络上各种不同的插头用一个标准形式的方式来传递他们的负载,任何能够理解标准协议的东西都可以“插入”套接字来进行通信。对于电源插座,他并不在乎你插入的是一个电灯还是一个烤面包机,只要他们需要的是60赫兹,115伏电压,他们就将正常的工作。想一想你的电费帐单是怎么产生的:在你的房子和其余的网络之间的某个地方有一个计量表,对于通过那个计量表的每一千瓦能量,你都要付费。所以,即使电能在能量网络中自由的流动,但你的房子里的所有的插座都有一个特定的地址。网络套接字使用了同样的思想,只不过我们讨论的是TCP/IP数据包和IP地址,而不是电器和街道的地址。IP协议是一个低级路由协议,他把数据分成小的数据包并通过网络把他们发送到一个地址,但是他并不保证发送者上述的包能否到达目的地。传输控制协议是一个高级协议,用于把这些包串起来,如果需要,排列后重新发送他们以传送数据。第三个协议,拥护数据报协议和TCP协议很相似,可以直接用来支持快速、无连接的、不可靠的数据抱传输。
Socket类是实现客户端套接字(也可以就叫―套接字‖)。套接字是两台机器之间的通信端点。套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
ServerSocket类此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
网络包的实现结构图如图4-6(见下页)所示:
第23页 共41页
图4-6 网络包的实现
具体的实现代码如下: ChatArea类:
public class ChatArea extends Thread {
??
public ChatArea(RiskController g) throws Exception { gui = g;
InetAddress iaddr = InetAddress.getLocalHost(); serverSocket = new ServerSocket(port);
gui.sendMessage(\
gui.sendMessage(\ start(); }
public void run() { ?? }
catch (IOException e) { }
gui.sendMessage(\ }
public synchronized void closeSocket() throws IOException { ?? }
第24页 共41页
synchronized void putString(int index, String s) { ??
try { serverSocket.close(); } catch (IOException e) { } }
synchronized String getStrings(int index) { ?? }
synchronized String waitForString(int index) { ?? } }
ChatdisplayThread类:
public class ChatDisplayThread extends Thread { ??
public ChatDisplayThread (Risk r, BufferedReader in) {
risk = r; inChat = in; }
public void run() { String str;
boolean badexit=true; try {
while ((str = inChat.readLine()) != null) {
if (str.length() > 0) {
risk.GameParser(str); } } }
catch (IOException e) { ?? }
if (badexit) { risk.kickedOff(); } } }
ChatReader类:
public class ChatReader extends Thread{
??
ChatReader(BufferedReader in, ChatArea cArea, int index) { super(\ mySocketInput = in; myIndex = index; myChatArea = cArea; }
public void run(){
第25页 共41页
String inputLine; try {
while ((inputLine = mySocketInput.readLine()) != null) myChatArea.putString(myIndex, inputLine); }
catch (IOException e) { } } }
ChatServerThread类:
public class ChatServerThread extends Thread {
??
public ChatServerThread(Socket socket, ChatArea cArea, int me) { super(\ this.socket = socket; myChatArea = cArea; myIndex= me; } public void run() {
String outputLine; try {
PrintWriter outChat = new PrintWriter( socket.getOutputStream(), true); BufferedReader inChat = new BufferedReader( new InputStreamReader(
socket.getInputStream()));
myReaderThread = new ChatReader(inChat, myChatArea, myIndex); myReaderThread.start(); do {
outputLine = myChatArea.waitForString(myIndex); if (outputLine != null)
outChat.println(outputLine); }while (outputLine != null); inChat.close(); outChat.close(); socket.close();
} catch (IOException e) {} } }
4.4 人工智能包的设计
该包主要是用来实现游戏中电脑玩家的人工智能,游戏的电脑玩家可以分为简单ai的玩家和具有复杂ai的玩家:
简单ai电脑玩家只能进行一些简单的判断,向哪个国家进攻和部署多少军队以及如何部署军队都是随机的,而具有复杂ai的电脑玩家能进行复杂的判断,能根据敌人军队的部署来选择放置军队的方式和数量,来选择进攻的方式以及防守的方式;
具体的一些属性和方法见以下类图: