⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 risk.java

📁 java 开源游戏源码 RISK 联机对战 战棋类
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
// 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 + -