📄 risk.java
字号:
// Yura Mamyrin, Group D
package risk.engine;
import risk.engine.core.*;
import risk.engine.guishared.*;
import risk.engine.ai.AIPlayer;
import java.util.StringTokenizer;
import java.awt.Color;
import java.util.Vector;
import java.io.*;
import java.net.*;
import java.util.Random;
import java.util.ResourceBundle;
import java.awt.Toolkit;
import javax.crypto.SealedObject;
import javax.crypto.NullCipher;
import java.util.Enumeration;
import java.applet.Applet;
import javax.swing.JFileChooser;
import java.awt.Frame;
import javax.swing.JOptionPane;
import javax.swing.JComboBox;
import java.awt.Container;
import java.util.Properties;
import java.awt.Dimension;
import javax.swing.UIManager;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* <p> Main Risk Class </p>
* @author Yura Mamyrin
*/
public class Risk extends Thread {
public final static String RISK_VERSION="1.0.9.7";
private StringTokenizer StringT;
protected RiskController controller;
protected RiskGame game;
//private String message;
private PrintWriter outChat = null;
private BufferedReader inChat = null;
private ChatArea chatter = null;
private Socket chatSocket = null;
private ChatDisplayThread myReader = null;
private int port;
protected String myAddress;
// crashes on a mac too much
//private SealedObject Undo;
private ByteArrayOutputStream Undo = new ByteArrayOutputStream();
protected boolean unlimitedLocalMode;
private boolean autoplaceall;
private boolean battle;
private boolean replay;
protected Vector inbox;
protected ResourceBundle resb;
protected Properties riskconfig;
public Risk(Applet a, String b,String c) {
this(a);
RiskGame.setDefaultMapAndCards(b,c);
}
public Risk(Applet a) {
super(RiskUtil.getGameName()+"-GAME-THREAD");
resb = risk.engine.translation.TranslationBundle.getBundle();
setupMapsDir(a);
String strUsername = RiskUtil.getGameName()+"Player";
if (RiskUtil.checkForNoSandbox()) {
strUsername = System.getProperty("user.name");
}
riskconfig = new Properties();
riskconfig.setProperty("default.port","4444");
riskconfig.setProperty("default.host","localhost");
riskconfig.setProperty("default.map", RiskUtil.getDefaultMap() );
riskconfig.setProperty("default.cards", "risk.cards" );
riskconfig.setProperty("default.player1.type","human");
riskconfig.setProperty("default.player1.color","green");
riskconfig.setProperty("default.player1.name", strUsername );
riskconfig.setProperty("default.player2.type","ai easy");
riskconfig.setProperty("default.player2.color","blue");
riskconfig.setProperty("default.player2.name","bob");
riskconfig.setProperty("default.player3.type","ai easy");
riskconfig.setProperty("default.player3.color","red");
riskconfig.setProperty("default.player3.name","fred");
riskconfig.setProperty("default.player4.type","ai easy");
riskconfig.setProperty("default.player4.color","cyan");
riskconfig.setProperty("default.player4.name","ted");
riskconfig.setProperty("default.player5.type","ai hard");
riskconfig.setProperty("default.player5.color","magenta");
riskconfig.setProperty("default.player5.name","yura");
riskconfig.setProperty("default.player6.type","ai hard");
riskconfig.setProperty("default.player6.color","yellow");
riskconfig.setProperty("default.player6.name","lala");
try {
riskconfig.load( RiskUtil.openStream("risk.ini") );
}
catch (Exception ex) {
// can not find file, no problem
}
String randomString = "#"+String.valueOf( Math.round(Math.random()*Long.MAX_VALUE) );
try {
if (RiskUtil.checkForNoSandbox()) {
myAddress = InetAddress.getLocalHost().getHostName() + randomString;
}
else {
myAddress = "sandbox" + randomString;
}
/*
//InetAddress localAddr = InetAddress.getLocalHost();
//myAddress = localAddr.getHostAddress();
myAddress=null;
Enumeration ifaces = NetworkInterface.getNetworkInterfaces();
search:
while (ifaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface)ifaces.nextElement();
//System.out.println(ni.getName() + ":");
Enumeration addrs = ni.getInetAddresses();
while (addrs.hasMoreElements()) {
InetAddress ia = (InetAddress)addrs.nextElement();
//System.out.println(" " + ia.getHostAddress());
String tmpAddr = ia.getHostAddress();
if (!tmpAddr.equals("127.0.0.1")) {
myAddress = tmpAddr;
break search;
}
}
}
if (myAddress==null) {
throw new Exception("no IP found");
}
*/
}
catch (Exception e) { // if network has not been setup
myAddress = "nonet" + randomString;
}
RiskGame.setDefaultMapAndCards( riskconfig.getProperty("default.map") , riskconfig.getProperty("default.cards") );
port = Integer.parseInt( riskconfig.getProperty("default.port") );
battle = false;
replay = false;
controller = new RiskController();
inbox = new Vector();
this.start();
}
public void setupMapsDir(Applet a) {
RiskUtil.setupMapsDir(a);
}
/**
* This gets the next token of the string tokenizer
* @return String Returns the next token as a string
*/
public String GetNext() {
return StringT.nextToken();
}
public String getRiskConfig(String a) {
return riskconfig.getProperty(a);
}
public void addRiskListener(RiskListener o) {
controller.addListener(o);
setHelp();
}
public void deleteRiskListener(RiskListener o) {
controller.deleteListener(o);
}
/**
* This parses the string, calls the relavant method and displays the correct error messages
* @param m The string needed for parsing
*/
public void parser(String m) {
//System.out.print("GOT: "+m+"\n");
synchronized(inbox) {
inbox.add(m);
inbox.notify();
}
}
public void run() {
String message;
try {
while (true) {
synchronized(inbox) {
if( inbox.isEmpty() ) {
try { inbox.wait(); }
catch(InterruptedException e) {
System.err.println("InterruptedException in "+getName());
}
}
try {
message = (String)inbox.remove(0);
}
catch (ArrayIndexOutOfBoundsException ex) {
// this should never happen but it does
continue;
}
}
//System.out.print("PROCESSING: "+message+"\n");
String input;
String output;
StringT = new StringTokenizer( message );
if (StringT.hasMoreTokens() == false) {
controller.sendMessage(">", false, false );
getInput();
continue; // used to be return; when this was not a thread
}
else {
input=GetNext();
output="";
}
// Show version
if (message.equals("ver")) {
controller.sendMessage(">" + message, false, false );
controller.sendMessage(RiskUtil.getGameName()+" Game Engine [Version " + RISK_VERSION + "]", false, false );
getInput();
}
// take no action
else if (input.equals("rem")) {
controller.sendMessage(">" + message, false, false );
//controller.sendMessage("no action", false, false );
getInput();
}
// out of game commands
else if (game==null) { // if no game
controller.sendMessage(">" + message, false, false );
// NEW GAME
if (input.equals("newgame")) {
if (StringT.hasMoreTokens()==false) {
// already checked
//if (game == null) {
try {
// CREATE A GAME
game = new RiskGame();
// NO SERVER OR CLIENT IS STARTED
unlimitedLocalMode = true;
controller.newGame(true);
setupPreview();
controller.showCardsFile( game.getCardsFile() , true);
output=resb.getString( "core.newgame.created");
}
catch (Exception e) {
output=resb.getString( "core.newgame.error") + " " + e.getMessage();
}
//}
//else {
// output=resb.getString( "core.newgame.alreadyloaded");
//}
}
else { output=resb.getString( "core.error.syntax").replaceAll( "\\{0\\}", "newgame"); }
}
// LOAD GAME
else if (input.equals("loadgame")) {
if (StringT.countTokens() >= 1) {
// this is not needed here as u can only get into this bit of code if game == null
//if (game == null) {
String filename = GetNext();
while ( StringT.hasMoreElements() ) {
filename = filename + " " + GetNext();
}
try {
game = RiskGame.loadGame( filename );
if (game == null) {
throw new Exception("no game");
}
unlimitedLocalMode = true;
if (game.getState()==RiskGame.STATE_NEW_GAME) { controller.newGame(true); }
else { controller.startGame(unlimitedLocalMode); }
output=resb.getString( "core.loadgame.loaded");
Player player = game.getCurrentPlayer();
if ( player != null ) {
// the game is saved
saveGameToUndoObject();
output=output+ System.getProperty("line.separator") + resb.getString( "core.loadgame.currentplayer") + " " + player.getName();
}
}
catch (Exception ex) {
output=resb.getString( "core.loadgame.error.load")+" "+ex.toString();
controller.showMessageDialog(output);
}
//}
//else {
// output=resb.getString( "core.newgame.alreadyloaded");
//}
}
else { output=resb.getString( "core.error.syntax").replaceAll( "\\{0\\}", "loadgame filename"); }
}
else if (input.equals("join")) {
if (StringT.countTokens() == 1) {
// already checked
//if (game == null) {
// CREATE A CLIENT
try {
chatSocket = new Socket( GetNext() , port);
// Create a PrintWriter object for socket output
outChat = new PrintWriter(
chatSocket.getOutputStream(), true);
// Create a BufferedReader object for socket input
inChat = new BufferedReader(
new InputStreamReader(
chatSocket.getInputStream()));
myReader = new ChatDisplayThread(this, inChat);
myReader.start();
// CREATE A GAME
game = new RiskGame();
unlimitedLocalMode = false;
controller.newGame(false);
setupPreview();
controller.showCardsFile( game.getCardsFile() , true);
output=resb.getString( "core.join.created");
//if ( chatSocket==null ) { controller.closeGame(); throw new ConnectException("conection refused"); }
outChat.println( RiskGame.SAVE_VERSION );
}
catch (UnknownHostException e) {
game = null;
output=resb.getString( "core.join.error.unknownhost");
}
catch (ConnectException e) {
game = null;
output=resb.getString( "core.join.error.connect");
}
catch (IllegalArgumentException e) {
game = null;
output=resb.getString( "core.join.error.nothostname");
}
catch (IOException e) {
game = null;
output=resb.getString( "core.join.error.002");
}
catch (java.security.AccessControlException e) {
game = null;
output="AccessControlException:\n"+resb.getString( "core.error.applet");
}
catch (Exception e) { // catch not being able to make a new game, so game is null
output=resb.getString( "core.join.error.create")+" "+e.toString();
}
if (game==null) {
controller.showMessageDialog(output);
}
//}
//else {
// output=resb.getString( "core.join.error.001");
//}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -