www.pudn.com > 手机网游源码.rar > Main.java


 package com.dfun.blackjack; 
 
import javax.microedition.lcdui.*; 
import javax.microedition.midlet.MIDlet; 
import javax.microedition.midlet.MIDletStateChangeException; 
import javax.microedition.rms.RecordStore; 
import java.util.*; 
import java.io.*; 
 
/************************************************** 
 * @author Beetle 
 * 类功能介绍:主控类,用于控制调用各个模块 
 **************************************************/ 
public class Main 
	extends MIDlet 
	implements CommandListener, Runnable { 
	private Display display; 
	private TextField phoneNumber; 
	private TextField password; 
	private TextField userName; 
	private Command cmdOk; 
	private Command cmdHelp; 
	private String url; //连接地址 
	private Connection conn; //连接对象 
	private MainCanvas mainCanvas; //游戏主界面 
	//刷新状态,0为刷新大厅,1为刷新房间用户列表第一次接到房间用户列表时将状态值改为1 
	//并且建立房间,状态值为1后只刷新房间列表不建立,2为刷新mainCanvas 的用户列表 
	public int refreshState; 
	public Hall hall; //游戏大厅 
	public House house; 
	public Form register; 
	public String strPhoneNumber; //用户手机号 
	public String strPassword; //用户密码 
	public String strUserName; //用户昵称 
	public long userId; //当次游戏用户的唯一id 
	public int userCount; //用户总分 
	public Msg msg; 
	public Thread getTwoData; 
	public String[][] jettonList; //筹码列表 
 
	/******************************************************* 
	 * 功能介绍:构造函数 
	 * 输入参数:无 
	 *******************************************************/ 
	public Main() { 
		phoneNumber = new TextField("请输入您的手机号码它将用于兑奖,请保证正确无误!", "", 11, TextField.NUMERIC); 
		password = new TextField("登陆密码", "", 6, TextField.PASSWORD); 
		userName = new TextField("用户昵称", "", 10, TextField.ANY); 
		cmdOk = new Command("注册", Command.OK, Command.OK); 
		cmdHelp = new Command("帮助", Command.OK, Command.HELP); 
		register = new Form("注册"); 
		register.addCommand(cmdOk); 
		register.addCommand(cmdHelp); 
		register.append(phoneNumber); 
		register.append(password); 
		register.append(userName); 
		register.setCommandListener(this); 
		refreshState = 0; //默认为刷新房间列表 
	} 
 
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException { 
	} 
 
	protected void pauseApp() { 
	} 
 
	protected void startApp() throws MIDletStateChangeException { 
		display = Display.getDisplay(this); 
		conn = new Connection(this); // 初始化网络 
		msg = new Msg(this, display, conn); // 初始化聊天室 
		getTwoData = new Thread(this); 
		hall = new Hall(display, conn, strPhoneNumber, this); 
		house = new House(display, conn, strPhoneNumber, this, hall); 
		if (getUserInfo()) { //检测是否注册 
			display.setCurrent(new Welcom(display, conn, this)); 
		} 
		else { 
			showRegister(); 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:取得手机号码 
	 * 输入参数:无 
	 * 输出参数:手机号码 
	 *****************************************************/ 
	public boolean getUserInfo() { 
		RecordStore rs; 
		byte[] data1, data2, data3; 
		try { 
			rs = RecordStore.openRecordStore("userInfo", false); 
			if (rs.getNumRecords() == 0) { 
				return false; 
			} 
			else { 
				data1 = rs.getRecord(1); 
				data2 = rs.getRecord(2); 
				data3 = rs.getRecord(3); 
			} 
			rs.closeRecordStore(); 
			strPhoneNumber = new String(data1); 
			strPassword = new String(data2); 
			ByteArrayInputStream bis = new ByteArrayInputStream(data3); 
			DataInputStream is = new DataInputStream(bis); 
			strUserName = is.readUTF(); 
			return true; 
		} 
		catch (Exception e) { 
			System.out.println(e.getMessage()); 
			return false; 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:设置手机号码 
	 * 输入参数:手机号码 
	 * 输出参数:无 
	 *****************************************************/ 
	public void setUserInfo(String phoneNumber, String password, String userName) { 
		try { 
			this.strPhoneNumber = phoneNumber; 
			this.strPassword = password; 
			this.strUserName = userName; 
			RecordStore rs = null; 
			byte data1[] = phoneNumber.getBytes(); 
			byte data2[] = password.getBytes(); 
			ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
			DataOutputStream dos = new DataOutputStream(bos); 
			dos.writeUTF(userName); 
			byte data3[] = bos.toByteArray(); 
			rs = RecordStore.openRecordStore("userInfo", true); 
			for (int i = 1; i <= rs.getNumRecords(); i++) { 
				rs.deleteRecord(1); 
			} 
			if (rs.getNumRecords() == 0) { 
				rs.addRecord(data1, 0, data1.length); 
				rs.addRecord(data2, 0, data2.length); 
				rs.addRecord(data3, 0, data3.length); 
			} 
			rs.closeRecordStore(); 
 
		} 
		catch (Exception e) { 
			System.out.println(e.toString()); 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:装入指定的图片 
	 * 输入参数:无 
	 * 输出参数:无 
	 ****************************************************/ 
	public Image[] loadImg(int gameType) { 
		Image img[]; 
		if (gameType == 1) { //欢迎图片 
			try { 
				img = new Image[2]; 
				img[0] = Image.createImage("/welcomone.png"); 
				img[1] = Image.createImage("/welcomtwo.png"); 
				return img; 
			} 
			catch (Exception e) { 
				System.out.println("load image error"); 
				return null; 
			} 
		} 
		else if (gameType == 2) { 
			try { 
				img = new Image[8]; 
				img[0] = Image.createImage("/backdrop.png"); 
				img[1] = Image.createImage("/heitao.png"); 
				img[2] = Image.createImage("/hongxin.png"); 
				img[3] = Image.createImage("/caohua.png"); 
				img[4] = Image.createImage("/fangkuai.png"); 
				img[5] = Image.createImage("/caidan.png"); 
				img[6] = Image.createImage("/message.png"); 
				img[7] = Image.createImage("/gameover.png"); 
				return img; 
			} 
			catch (Exception e) { 
				System.out.println("load image error"); 
				return null; 
			} 
		} 
		else if (gameType == 3) { 
			try { 
				img = new Image[5]; 
				img[0] = Image.createImage("/fangjian.png"); 
				return img; 
			} 
			catch (Exception e) { 
				System.out.println("load image error"); 
				return null; 
			} 
 
		} 
		else if (gameType == 4) { 
			try { 
				img = new Image[5]; 
				img[0] = Image.createImage("/renwu.png"); 
				return img; 
			} 
			catch (Exception e) { 
				System.out.println("load image error"); 
				return null; 
			} 
 
		} 
 
		return null; 
	} 
 
	public void showMainCanvas(int type) { 
		mainCanvas = new MainCanvas(type, display, conn, this, house.houseUserList, jettonList, hall.houseList[hall.choHouseList.getSelectedIndex()][1], (int) userId); 
		refreshState = 2; 
		display.setCurrent(mainCanvas); 
 
	} 
 
	public void showRegister() { 
		display.setCurrent(register); 
		return; 
	} 
 
	public void showHall() { 
		getTwoData.start(); 
		hall.showHall(); 
	} 
 
	/***************************************************** 
	 * 功能介绍:退出整个程序 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void exit() { 
		try { 
			destroyApp(false); 
			notifyDestroyed(); 
		} 
		catch (Exception e) { 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:根据间隔字符将一字符串切成数组 
	 * 输入参数:要切的字符串,间隔字符 
	 * 输出参数:字符串数组 
	 *****************************************************/ 
	public String[] split(String str, String pre) { 
		Vector veTmp = new Vector(); 
		while (str.indexOf(pre) != -1) { 
			veTmp.addElement(str.substring(0, str.indexOf(pre))); 
			str = str.substring(str.indexOf(pre) + 1, str.length()); 
		} 
		if (veTmp.size() == 0) { 
			return null; 
		} 
		String arrTmp[] = new String[veTmp.size()]; 
		for (int i = 0; i < arrTmp.length; i++) { 
			arrTmp[i] = (String) veTmp.elementAt(i); 
		} 
		veTmp = null; 
		return arrTmp; 
	} 
 
	/***************************************************** 
	 * 功能介绍:根据间隔字符将一字符串切成数组 
	 * 输入参数:要切的字符串,间隔字符 
	 * 输出参数:字符串数组 
	 *****************************************************/ 
	public String[][] split(String str, String pre, int col) { 
		Vector veTmp = new Vector(); 
		while (str.indexOf(pre) != -1) { 
			veTmp.addElement(str.substring(0, str.indexOf(pre))); 
			str = str.substring(str.indexOf(pre) + 1, str.length()); 
		} 
 
		if (veTmp.size() == 0) { 
			return null; 
		} 
 
		String arrTmp[][] = new String[veTmp.size() / col][col]; 
		int n = 0; 
		for (int i = 0; i < arrTmp.length; i++) { 
			for (int j = 0; j < col; j++) { 
				arrTmp[i][j] = (String) veTmp.elementAt(n); 
				n++; 
			} 
		} 
		veTmp = null; 
		return arrTmp; 
	} 
 
	/***************************************************** 
	 * 功能介绍:刷新用户牌公共方法 
	 * 输入参数:服务端发下的筹码数据 
	 * 输出参数:无 
	 *****************************************************/ 
	private void refreshCards(String inputStr) { 
		String cardsTmp[][] = split(inputStr, ",", 3); 
		if (cardsTmp==null){ 
			return; 
		} 
		int cards[][] = new int[cardsTmp.length][3]; 
		for (int i = 0; i < cardsTmp.length; i++) { 
			cards[i][0] = Integer.parseInt(cardsTmp[i][0]); 
			cards[i][1] = Integer.parseInt(cardsTmp[i][1]); 
			cards[i][2] = Integer.parseInt(cardsTmp[i][2]); 
		} 
		mainCanvas.refreshDeal(cards); 
	} 
 
	public void run() { 
		String inputStr; 
		int order; 
		while (true) { 
			inputStr = conn.getTwoData(); 
			order = Integer.parseInt(inputStr.substring(0, 2)); 
			inputStr = inputStr.substring(2, inputStr.length()); 
			switch (order) { 
				case 5: //如果用户列表有变动则主动将它发下来 
					if (inputStr.equals("full")) { 
						display.setCurrent(new Alert("系统提示", "房间人数已满或游戏已开始", null, AlertType.INFO)); 
					} 
					else { 
						house.refreshUserList(inputStr); 
					} 
					break; 
				case 7: //游戏开始 
					String arrTmp[] = split(inputStr, "*"); 
					house.refreshUserList(arrTmp[0]); 
					this.jettonList = split(arrTmp[1], ",", 3); 
					showMainCanvas(0); 
					break; 
				case 8: //所有玩家下注完毕后发牌 
					refreshCards(inputStr); //刷新发牌列表 
					break; 
				case 9: 
					String arrJetton[][] = split(inputStr, ",", 3); 
					mainCanvas.refreshJetton(arrJetton); //刷新筹码列表 
					break; 
				case 10: 
					refreshCards(inputStr); //刷新发牌列表 
					break; 
				case 11: 
					refreshCards(inputStr); //刷新发牌列表 
					break; 
				case 12: //该用户要牌完毕 
					refreshCards(inputStr); //刷新发牌列表 
					break; 
				case 13: // 聊天消息 
					msg.addMsg(inputStr); 
					if (display.getCurrent() == house.houseForm || display.getCurrent() == mainCanvas) { 
						msg.showForm(); 
					} 
					break; 
				case 14: //游戏结束显示游戏结果 
					mainCanvas.gameOver(inputStr); 
					break; 
				case 15: //新用户加入刷新 
					String arrAddUser[] = split(inputStr, "*"); 
					house.refreshUserList(arrAddUser[0]); 
					String t0[][] = split(arrAddUser[0], ",", 3); 
					String t1[][] = split(arrAddUser[1], ",", 3); 
					mainCanvas.refreshHouseUserList(t0); //刷新用户列表 
					mainCanvas.refreshJetton(t1); //刷新筹码列表 
					break; 
				case 16: //加入已开始的游戏 
					String arr[] = split(inputStr, "*"); 
					house.refreshUserList(arr[0]); 
					this.jettonList = split(arr[1], ",", 3); 
					showMainCanvas(1); 
					refreshCards(arr[2]); 
					break; 
				case 17: //刷新用户列表 
					house.refreshUserList(inputStr); 
					String houseUserList[][] = split(inputStr, ",", 3); 
					mainCanvas.refreshHouseUserList(houseUserList); 
					break; 
				case 18:  //刷新大厅 
					hall.refreshHall(inputStr); 
					break; 
			} 
		} 
	} 
 
	public void commandAction(Command c, Displayable d) { 
		if (d == register && c == cmdOk) { 
			strPhoneNumber = phoneNumber.getString(); 
			strUserName = userName.getString(); 
			strPassword = password.getString(); 
			if (strPhoneNumber.length() < 11) { 
				display.setCurrent(new Alert("系统提示", "手机号码长度必须是11位!", null, AlertType.ERROR)); 
				return; 
			} 
			if (strPassword.length() <= 0) { 
				display.setCurrent(new Alert("系统提示", "您还未填写登陆密码!", null, AlertType.ERROR)); 
				return; 
			} 
			if (strUserName.length() <= 0) { 
				display.setCurrent(new Alert("系统提示", "您还未填写昵称!", null, AlertType.ERROR)); 
				return; 
			} 
 
			setUserInfo(strPhoneNumber, strPassword, strUserName); 
			display.setCurrent(new Welcom(display, conn, this)); 
		} 
	} 
}