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


package com.dfun.blackjack; 
 
import javax.microedition.lcdui.*; 
import java.util.Vector; 
import com.nokia.mid.ui.FullCanvas; 
 
/************************************************* 
 * @author Beetle 
 * 类功能介绍:游戏主屏幕 
 **************************************************/ 
public class MainCanvas 
	extends FullCanvas 
	implements Runnable { 
	/******************************************************* 
	 * 定义公共变量 
	 *******************************************************/ 
	private int softOne = -6, softTwo = -7; //设置软按扭的键值 
	private int width, height; //屏幕宽高 
	private int bgWidth, bgHeight; //画布宽高 
	private Display display; //显示管理器 
	private Image bufferImg; //双缓存图片 
	private Graphics bg; //双缓存画布 
	private Thread refresh; //刷新线程 
	private Connection conn; //网络连接对象 
	private boolean isRefresh; //是否进行刷新 
	private Image img[]; //图片数组 
	private Main main; //主程序 
	private String[][] houseUserList; //用户列表 
	private int[][] dealList; //发牌列表 
	private String[][] jettonList; //筹码列表 
	private String[] messageList; //消息列表 
	private int cardsState[][] = { 
		{ 
		0, 0, 0} 
		, { 
		0, 0, 0} 
	}; //牌的状态(分牌:分数,张数,是否停牌) 
	private String houseName; //房间名称 
	private int showPageNumber; //显示第几页(第几个用户) 
	private int myPageNumber; //当前手机的在第几页 
	private int gameState; //游戏状态 
	private String message; //要在消息栏显示的消息 
	private int times; //计时器 
	private int currentUserId; //当前用户id 
	private boolean isSpread = false; //是否分牌 
	private boolean isShowMenu; //是否显示菜单 
	private String gameValue[]; //游戏结果 
	private int menuIndex; //标识当前选中的菜单项 
	/******************************************************* 
	 * 功能介绍:构造函数 
	 * 输入参数:初始化类别(0新游戏开始或1用户中途加入)显示管理,连接对 
	 *         象,手机号码,主程序 
	 *******************************************************/ 
	public MainCanvas(int type, Display display, Connection conn, Main main, String[][] houseUserList, String[][] jettonList, String houseName, int currentUserId) { 
		/******************************************************* 
		 * 初始化公共变量 
		 *******************************************************/ 
		this.main = main; 
		this.display = display; //初始化显示管理器 
		this.conn = conn; 
		this.houseUserList = houseUserList; //用户列表 
		this.jettonList = jettonList; //筹码列表 
		this.houseName = houseName; //房间名称 
		this.currentUserId = currentUserId; //当前用户id 
		isShowMenu = false; //默认不显示菜单 
		img = main.loadImg(2); 
		isRefresh = true; //默认持继刷新 
		bgWidth = 176; //画布宽 
		bgHeight = 208; //画布高 
		width = getWidth(); //初始化屏幕宽度 
		height = getHeight(); //初始化屏幕高度 
		menuIndex = 1; //菜单选项默认为1 
		bufferImg = Image.createImage(bgWidth, bgHeight); //创建双缓存图像 
		try { 
			bg = bufferImg.getGraphics(); //创建双缓存画布 
		} 
		catch (Exception e) { 
			System.out.println("load image error"); 
		} 
		bg.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL)); 
		getUserPage(); //取得当前手机用户所在的页码,把当前显示设为当前用户 
		if (type == 0) { //用户当前为普通用户 
			gameState = 1; 
			//message = "游戏开始请下注"; 
			message = "please chip in"; 
			times = 200; 
		} 
		else if (type == 1) { //用户当前为观众 
			gameState = 10; 
			//message = "您现在是观众请等待局开始"; 
			message = "please wait"; 
			times = 0; 
		} 
		refresh = new Thread(this); //进行持续刷新 
		refresh.start(); //启动刷新 
	} 
 
	public void paint(Graphics g) { 
		try { 
			if (isRefresh == true) { 
				showBack(); //显示背景 
				if (gameState != 1) { 
					showUserCards(); 
				} 
				if (gameState == 5) { //显示结果 
					showValue(); 
				} 
				//判断是否显示菜单 
				if (isShowMenu) { 
					showMenu(); 
				} 
 
				g.drawImage(bufferImg, width / 2, height / 2, Graphics.HCENTER | Graphics.VCENTER); //将双缓存图片绘到屏幕上 
			} 
		} 
		catch (Exception e) { 
			System.out.println("paint error " + e.getMessage()); 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:公用的线程方法,根据Thread.currentThread判别 
	 * 			用户调用的是哪个线程 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void run() { 
		if (Thread.currentThread() == refresh) { //刷新线程 
			try { 
				while (isRefresh) { 
					Thread.sleep(80); //按指定毫秒刷一次屏 
					if (times != 0) { 
						times--; 
					} 
					repaint(); 
				} 
			} 
			catch (Exception e) { 
			} 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:取得指定用户id的分数及牌数 
	 * 输入参数:用户id 
	 * 输出参数:用户分数数组(分牌1,分牌2),分牌的牌数 
	 *****************************************************/ 
	private int[][] getPoint(int userId) { 
		int oneCount = 0, twoCount = 0, oneCards = 0, twoCards = 0, oneA = 0, twoA = 0; 
		int userCars[][] = getUserCards(userId); //取得该用户所有的牌 
		if (userCars == null) { //如果该用户没牌则返回空 
			return null; 
		} 
		for (int i = 0; i < userCars.length; i++) { 
			int intTmp = userCars[i][0]; 
			//先将牌的值转成正常的数值 
			if (intTmp > 13 && intTmp <= 26) { //红桃 
				intTmp -= 13; 
			} 
			else if (intTmp > 26 && intTmp <= 39) { //草花 
				intTmp -= 26; 
			} 
			else if (intTmp > 39 && intTmp <= 52) { //方块 
				intTmp -= 39; 
			} 
			if (userCars[i][1] == 0) { 
				oneCards++; //统计分牌1的牌数 
				switch (intTmp) { //统计分牌1的分数 
					case 1: 
						oneCount += 11; 
						oneA++; 
						break; 
					case 11: 
						oneCount += 10; 
						break; 
					case 12: 
						oneCount += 10; 
						break; 
					case 13: 
						oneCount += 10; 
						break; 
					default: 
						oneCount += intTmp; 
						break; 
				} 
			} 
			else if (userCars[i][1] == 1) { 
				twoCards++; //分牌2的牌数 
				switch (intTmp) { //统计分牌2的分数 
					case 1: 
						twoCount += 11; 
						twoA++; 
						break; 
					case 11: 
						twoCount += 10; 
						break; 
					case 12: 
						twoCount += 10; 
						break; 
					case 13: 
						twoCount += 10; 
						break; 
					default: 
						twoCount += intTmp; 
						break; 
				} 
			} 
 
		} 
		//计算出分牌1和分牌2的最高分数 
		for (int i = 0; i < oneA; i++) { 
			if (oneCount > 21) { 
				oneCount -= 10; 
			} 
		} 
 
		for (int i = 0; i < twoA; i++) { 
			if (twoCount > 21) { 
				twoCount -= 10; 
			} 
		} 
		int[][] arrTmp = { 
			{ 
			0, 0} 
			, { 
			0, 0} 
		}; 
		arrTmp[0][0] = oneCount; 
		arrTmp[0][1] = oneCards; 
		arrTmp[1][0] = twoCount; 
		arrTmp[1][1] = twoCards; 
		return arrTmp; 
	} 
 
	/***************************************************** 
	 * 功能介绍:显示当前页用户的牌 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	private void showUserCards() { 
		//取得当前页的用户id 
		if (dealList == null) { 
			return; 
		} 
		int userId = Integer.parseInt(houseUserList[showPageNumber][0]); 
		int oneArea = 20, twoArea = 20; 
		//找出该用户所有的牌 
		int userCars[][] = getUserCards(userId); 
		if (userCars == null) { 
			return; 
		} 
		for (int i = 0; i < userCars.length; i++) { 
			if (userCars[i][1] == 0) { 
				showCard(userCars[i][0], oneArea, 51); 
				oneArea += 30; 
			} 
			else if (userCars[i][1] == 1) { 
				showCard(userCars[i][0], twoArea, 97); 
				twoArea += 30; 
			} 
		} 
		int arrTmp[][] = getPoint(userId); 
		if (arrTmp == null) { //如果该用户没牌则不显示 
			return; 
		} 
		bg.setColor(0x000000); 
		//画分牌1的值 
		bg.drawString(arrTmp[0][0] + "", 11, 69, Graphics.HCENTER | Graphics.TOP); 
		//如果有分牌2则画它的值 
		if (arrTmp[1][0] > 0) { 
			bg.drawString(arrTmp[1][0] + "", 11, 116, Graphics.HCENTER | Graphics.TOP); 
		} 
 
	} 
 
	/***************************************************** 
	 * 功能介绍:显示一张牌 
	 * 输入参数:要显示的牌,x轴,y轴 
	 * 输出参数:无 
	 *****************************************************/ 
	private void showCard(int i, int x, int y) { 
		if (i <= 13) { //黑桃 
			bg.setColor(0x000000); 
			bg.drawImage(img[1], x, y, Graphics.LEFT | Graphics.TOP); 
		} 
		else if (i <= 26) { //红桃 
			i -= 13; 
			bg.setColor(0xFF0000); 
			bg.drawImage(img[2], x, y, Graphics.LEFT | Graphics.TOP); 
		} 
		else if (i <= 39) { //草花 
			i -= 26; 
			bg.setColor(0x000000); 
			bg.drawImage(img[3], x, y, Graphics.LEFT | Graphics.TOP); 
		} 
		else if (i <= 52) { //方块 
			i -= 39; 
			bg.setColor(0xFF0000); 
			bg.drawImage(img[4], x, y, Graphics.LEFT | Graphics.TOP); 
		} 
 
		String strNumber = ""; 
		switch (i) { 
			case 1: 
				strNumber = "A"; 
				break; 
			case 11: 
				strNumber = "J"; 
				break; 
			case 12: 
				strNumber = "Q"; 
				break; 
			case 13: 
				strNumber = "K"; 
				break; 
			default: 
				strNumber = Integer.toString(i); 
				break; 
		} 
		bg.drawString(strNumber, x + 15, y + 5, Graphics.HCENTER | Graphics.TOP); //显示牌数 
	} 
 
	/***************************************************** 
	 * 功能介绍:显示背景 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	private void showBack() { 
		bg.setColor(0xffffff); 
		bg.fillRect(0, 0, getWidth(), getHeight()); 
		bg.setColor(0x000000); 
		bg.drawImage(img[0], 0, 0, Graphics.TOP | Graphics.LEFT); //显示背景 
		bg.drawString(houseName, bgWidth / 2, 6, Graphics.HCENTER | Graphics.TOP); 
		if (myPageNumber == showPageNumber) { //如果当前页属于用户则名字用其它颜色表示 
			bg.setColor(0x3AA23F); 
		} 
		else { 
			bg.setColor(0x000000); 
		} 
		bg.drawString(houseUserList[showPageNumber][1] + "-" + jettonList[showPageNumber][1] + "-" + jettonList[showPageNumber][2], bgWidth / 2, 23, Graphics.HCENTER | Graphics.TOP); 
		bg.setColor(0x000000); 
		switch (gameState) { 
			case 1: //下注 
				//下注 
				bg.drawString("chip in", 35, 192, Graphics.HCENTER | Graphics.TOP); 
				//开始 
				bg.drawString("begin", 140, 192, Graphics.HCENTER | Graphics.TOP); 
				if (times != 0) { 
					bg.drawString(times + "", bgWidth / 2, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				} 
				else { 
					if (gameState == 1) { 
						stopChipIn(); //停止下注 
					} 
				} 
				break; 
			case 2: //等待开牌 
				break; 
			case 3: 
 
				//要牌 
				bg.drawString("next", 35, 192, Graphics.HCENTER | Graphics.TOP); 
				//停牌 
				bg.drawString("stop", 140, 192, Graphics.HCENTER | Graphics.TOP); 
				//message = "双倍下注请按1"; 
				message = "double NO 1"; 
				break; 
			case 4: 
 
				//message = "正在等待其它玩家要完牌"; 
				message = "waiting deal over for other user"; 
				break; 
			case 5: 
				if (times != 0) { 
					bg.drawString(times + "", bgWidth / 2, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				} 
				else { 
					reBegin(); //游戏重新开始 
				} 
 
				//返回 
				bg.drawString("back", 35, 192, Graphics.HCENTER | Graphics.TOP); 
				//继续 
				bg.drawString("continue", 140, 192, Graphics.HCENTER | Graphics.TOP); 
				message = "game over please choice."; 
				//message = "游戏结束请选择."; 
				break; 
		} 
		bg.drawString(message, bgWidth / 2, 162, Graphics.HCENTER | Graphics.BOTTOM); 
	} 
 
	/***************************************************** 
	 * 功能介绍:刷新用户列表 
	 * 输入参数:用户列表 
	 * 输出参数:无 
	 *****************************************************/ 
	public void refreshHouseUserList(String[][] houseUserList) { 
		this.houseUserList = houseUserList; 
		getUserPage(); //重新定位当前用户的页 
	} 
 
	/***************************************************** 
	 * 功能介绍:刷新发牌列表 
	 * 输入参数:发牌列表 
	 * 输出参数:无 
	 *****************************************************/ 
	public void refreshDeal(int[][] dealList) { 
		this.dealList = dealList; 
		int arrTmp[][] = getPoint(currentUserId); //取得分数 
		//如果该用户没牌则不处理 
		if (arrTmp == null) { 
			return; 
		} 
		cardsState[0][0] = arrTmp[0][0]; 
		cardsState[0][1] = arrTmp[0][1]; 
		cardsState[1][0] = arrTmp[1][0]; 
		cardsState[1][1] = arrTmp[1][1]; 
		//如21点就停牌(分牌1) 
		if (cardsState[0][0] == 21) { 
			cardsState[0][2] = 2; 
		} 
		else if (cardsState[0][0] > 21) { 
			cardsState[0][2] = 4; 
		} 
		//如暴了或21点就停牌(分牌2) 
		if (cardsState[1][0] == 21 && isSpread) { 
			cardsState[1][2] = 2; 
		} 
		else if (cardsState[1][0] > 21 && isSpread) { 
			cardsState[1][2] = 4; 
		} 
 
		//发牌后检测游戏是否结束 
		if (cardsState[0][2] != 0) { 
			if (isSpread) { 
				//如果第一分牌结束第二分牌也结束则进入等待 
				if (cardsState[1][2] != 0) { 
					if (gameState != 4) { 
						conn.sendOneData("12"); 
					} 
					gameState = 4; 
				} 
			} 
			else { 
				//如果第一分牌结束没有第二分牌则进入等待 
				if (gameState != 4) { 
					conn.sendOneData("12"); 
				} 
				gameState = 4; 
			} 
		} 
 
		//如果原本处在押分后等待阶段则接到牌后改为3(要牌阶段) 
		if (gameState == 2) { 
			gameState = 3; 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:刷新筹码列表 
	 * 输入参数:筹码列表 
	 * 输出参数:无 
	 *****************************************************/ 
	public void refreshJetton(String[][] jettonList) { 
		this.jettonList = jettonList; 
	} 
 
	/***************************************************** 
	 * 功能介绍:刷新消息列表 
	 * 输入参数:消息列表 
	 * 输出参数:无 
	 *****************************************************/ 
	public void refreshMessage(String[] messageList) { 
		this.messageList = messageList; 
	} 
 
	/***************************************************** 
	 * 功能介绍:滚动屏幕查看其它玩家 
	 * 输入参数:方向 
	 * 输出参数:无 
	 *****************************************************/ 
	private void rollCanvas(int orientation) { 
		if (orientation == Canvas.UP) { 
			showPageNumber--; 
			if (showPageNumber < 0) { 
				showPageNumber = houseUserList.length - 1; 
			} 
		} 
		else if (orientation == Canvas.DOWN) { 
			showPageNumber++; 
			if (showPageNumber > houseUserList.length - 1) { 
				showPageNumber = 0; 
			} 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:下注 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	private void chipIn() { 
		int intTmpOne = Integer.parseInt(jettonList[myPageNumber][1]); 
		int intTmpTwo = Integer.parseInt(jettonList[myPageNumber][2]); 
		if (intTmpOne == 0) { 
			message = "您已没有筹码不能下注!"; 
			return; 
		} 
		intTmpOne = intTmpOne + intTmpTwo; 
		intTmpTwo = intTmpTwo + 10; 
		if (intTmpTwo > 100 || intTmpTwo > intTmpOne) { 
			intTmpTwo = 10; 
		} 
		intTmpOne = intTmpOne - intTmpTwo; 
		jettonList[myPageNumber][1] = Integer.toString(intTmpOne); 
		jettonList[myPageNumber][2] = Integer.toString(intTmpTwo); 
	} 
 
	/***************************************************** 
	 * 功能介绍:停止下注并把所下的注发往服务器 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	private void stopChipIn() { 
		times = 0; 
		gameState = 2; 
		//message = "正在等待其它闲家下注!"; 
		message = "waiting chip in over for other user!"; 
		conn.sendOneData("07" + jettonList[myPageNumber][2]); //下注 
	} 
 
	/***************************************************** 
	 * 功能介绍:要牌 
	 * 输入参数:第几分牌 
	 * 输出参数:无 
	 *****************************************************/ 
	private void getCard(int number) { 
		conn.sendOneData("09" + number); 
	} 
 
	/***************************************************** 
	 * 功能介绍:停牌 
	 * 输入参数:第几分牌 
	 * 输出参数:无 
	 *****************************************************/ 
	private void stand(int number) { 
		cardsState[number][2] = 1; 
		//停牌判断发牌是否结束(如果结束则进入等待状态) 
		if (cardsState[0][2] != 0 && !isSpread) { 
			gameState = 4; 
			conn.sendOneData("12"); 
		} 
		if (cardsState[1][2] != 0 && isSpread) { 
			gameState = 4; 
			conn.sendOneData("12"); 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:分牌 
	 * 输入参数:第几分牌 
	 * 输出参数:无 
	 *****************************************************/ 
	private void spread() { 
		int userCards[][] = getUserCards(currentUserId); 
		if (userCards == null) { 
			return; 
		} 
		//如果第一分牌的两张牌不相同则不能分牌 
		if (getCardNum(userCards[0][0]) != getCardNum(userCards[1][0])) { 
			return; 
		} 
		//只有在没有第二轮发牌,且没有分牌的情况下才可分牌 
		if (cardsState[0][1] == 2 && !isSpread) { 
			conn.sendOneData("10"); 
			isSpread = true; 
			gameState = 3; 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:加倍下注 
	 * 输入参数:第几分牌 
	 * 输出参数:无 
	 *****************************************************/ 
	private void doubleCard(int number) { 
		//双倍下注后该分牌就停止了 
		cardsState[number][2] = 1; 
		conn.sendOneData("11" + number); 
	} 
 
	/***************************************************** 
	 * 功能介绍:如数返回牌面的值 
	 * 输入参数:未处理的数 
	 * 输出参数:正常的牌面值 
	 *****************************************************/ 
	private int getCardNum(int num) { 
		if (num > 13 && num <= 26) { 
			num -= 13; 
		} 
		else if (num > 26 && num <= 39) { 
			num -= 26; 
		} 
		else if (num > 39 && num <= 52) { 
			num -= 39; 
		} 
		return num; 
	} 
 
	/***************************************************** 
	 * 功能介绍:取得指定用户牌的列表 
	 * 输入参数:用户id 
	 * 输出参数:用户牌的列表 
	 *****************************************************/ 
	private int[][] getUserCards(int userId) { 
		//先测出该用户有几条记录 
		int j = 0; 
		for (int i = 0; i < dealList.length; i++) { 
			if (dealList[i][0] == userId) { 
				j++; 
			} 
		} 
		if (j == 0) { 
			return null; 
		} 
		//定义一个相应记录数的临时数组(牌数,第几付牌,不包括用户id) 
		int userCars[][] = new int[j][2]; 
		int l = 0; 
		for (int i = 0; i < dealList.length; i++) { 
			if (dealList[i][0] == userId) { 
				userCars[l][0] = dealList[i][1]; 
				userCars[l][1] = dealList[i][2]; 
				l++; 
			} 
		} 
		return userCars; 
	} 
 
	/***************************************************** 
	 * 功能介绍:当用户按下中间键则弹出菜单 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void showMenu() { 
		int dfColor = bg.getColor(); 
		bg.drawImage(img[5], bgWidth / 2, bgHeight / 2 + 5, Graphics.HCENTER | Graphics.TOP); 
		bg.setColor(0xffffff); 
		bg.drawRect(65, 104 + 11 * menuIndex, 44, 11); 
		bg.setColor(dfColor); 
	} 
 
	/***************************************************** 
	 * 功能介绍:显示游戏结果 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void showValue() { 
		int tmp; 
		int dfColor = bg.getColor(); //默认颜色 
		int yellow = 0xE4F807; 
		int red = 0xF80729; 
		int green = 0x08B124; 
		if (gameValue == null) { //观众不必显示游戏结果 
			return; 
		} 
		if (times == 0) { 
			return; 
		} 
 
		bg.drawImage(img[7], bgWidth / 2, bgHeight / 2 - 27, Graphics.HCENTER | Graphics.TOP); 
		if (gameValue.length == 1) { //只有一个分牌 
			tmp = Integer.parseInt(gameValue[0]); 
			if (tmp > 0) { 
				bg.setColor(dfColor); 
				bg.drawString("win", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(yellow); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp < 0) { 
				bg.setColor(dfColor); 
				bg.drawString("lost", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(red); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp == 0) { 
				bg.setColor(dfColor); 
				bg.drawString("tie", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(green); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
		} 
		else if (gameValue.length == 2) { //两个分牌 
			tmp = Integer.parseInt(gameValue[0]); 
			if (tmp > 0) { 
				bg.setColor(dfColor); 
				bg.drawString("win", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(yellow); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp < 0) { 
				bg.setColor(dfColor); 
				bg.drawString("lost", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(red); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp == 0) { 
				bg.setColor(dfColor); 
				bg.drawString("tie", bgWidth / 2 - 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(green); 
				bg.drawString(gameValue[0], bgWidth / 2 + 10, bgHeight / 2, Graphics.HCENTER | Graphics.TOP); 
			} 
 
			tmp = Integer.parseInt(gameValue[1]); 
			if (tmp > 0) { 
				bg.setColor(dfColor); 
				bg.drawString("win", bgWidth / 2 - 10, bgHeight / 2 + 10, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(yellow); 
				bg.drawString(gameValue[1], bgWidth / 2 + 10, bgHeight / 2 + 10, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp < 0) { 
				bg.setColor(dfColor); 
				bg.drawString("lost", bgWidth / 2, bgHeight / 2 - 10, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(red); 
				bg.drawString(gameValue[1], bgWidth / 2, bgHeight / 2 + 10, Graphics.HCENTER | Graphics.TOP); 
			} 
			else if (tmp == 0) { 
				bg.setColor(dfColor); 
				bg.drawString("tie", bgWidth / 2, bgHeight / 2 - 10, Graphics.HCENTER | Graphics.TOP); 
				bg.setColor(green); 
				bg.drawString(gameValue[1], bgWidth / 2, bgHeight / 2 + 10, Graphics.HCENTER | Graphics.TOP); 
			} 
		} 
		bg.setColor(dfColor); 
	} 
 
	/***************************************************** 
	 * 功能介绍:游戏结束 
	 * 输入参数:分牌一的得分结果,分牌2的得分结果 
	 * 输出参数:无 
	 *****************************************************/ 
	public void gameOver(String inputStr) { 
		gameValue = main.split(inputStr, ","); 
		gameState = 5; //将游戏状态设置为游戏结束等待用户先择继续或退出 
		times = 200; //80秒显示游戏结果并让用户选择下一步 
	} 
 
	/***************************************************** 
	 * 功能介绍:游戏重新开始 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void reBegin() { 
		dealList = null; 
		cardsState[0][2] = 0; 
		cardsState[1][2] = 0; 
		times = 200; 
		gameState = 1; 
 
	} 
 
	/***************************************************** 
	 * 功能介绍:取得当前用户所在的页码 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void getUserPage() { 
		for (int i = 0; i < houseUserList.length; i++) { //把默认显示的页转到当前用户本身 
			String strTmp = String.valueOf(currentUserId); 
			if (houseUserList[i][0].equals(strTmp)) { 
				myPageNumber = i; 
				showPageNumber = myPageNumber; 
			} 
		} 
	} 
 
	/***************************************************** 
	 * 功能介绍:退出当前游戏 
	 * 输入参数:无 
	 * 输出参数:无 
	 *****************************************************/ 
	public void outGame() { 
		isRefresh=false; 
		main.house.outHouse(main.house.houseId); 
		System.gc(); //注消内存 
	} 
 
	public void keyPressed(int keyCode) { 
		if (getGameAction(keyCode) == Canvas.FIRE) { 
			if (isShowMenu == true) { 
				switch (menuIndex) { 
					case 1: //聊天 
						main.msg.showForm(); 
						break; 
					case 2: //返回 
						break; 
					case 3: //退出 
						outGame(); 
						break; 
					case 4: //帮助 
						break; 
				} 
				isShowMenu=false; 
			} 
			else { 
				isShowMenu = true; 
			} 
			return; 
		} 
		if (getGameAction(keyCode) == Canvas.UP) { //向上 
			if (isShowMenu) { 
				menuIndex--; 
				if (menuIndex < 1) { 
					menuIndex = 4; 
				} 
				return; 
			} 
			rollCanvas(Canvas.UP); //滚动屏幕 
			return; 
		} 
		else if (getGameAction(keyCode) == Canvas.DOWN) { //向下 
			if (isShowMenu) { //显示菜单时按了向下 
				menuIndex++; 
				if (menuIndex > 4) { 
					menuIndex = 1; 
				} 
				return; 
			} 
			rollCanvas(Canvas.DOWN); //滚动屏幕 
			return; 
		} 
		else if (getGameAction(keyCode) == Canvas.LEFT) { //向左 
			return; 
		} 
		else if (getGameAction(keyCode) == Canvas.RIGHT) { //向右 
			return; 
		} 
		if (myPageNumber != showPageNumber) { 
			message = "当前不是您所在的页!"; 
			return; 
		} 
		switch (gameState) { 
			case 1: //下注或开始 
				if (keyCode == softOne) { 
					chipIn(); //下注 
				} 
				else if (keyCode == softTwo) { 
					stopChipIn(); //停止下注 
				} 
				break; 
			case 2: //等待开牌 
				break; 
			case 3: //要牌或停牌(无分牌) 
				if (keyCode == softOne) { //按了要牌键 
					if (cardsState[0][2] == 0) { 
						getCard(0); 
					} 
					else if (cardsState[0][2] != 0 && cardsState[1][2] == 0 && isSpread) { 
						getCard(1); 
					} 
				} 
				else if (keyCode == softTwo) { //按了停牌键 
					if (cardsState[0][2] == 0) { 
						stand(0); 
					} 
					else if (cardsState[0][2] != 0 && cardsState[1][2] == 0 && isSpread) { 
						stand(1); 
					} 
				} 
				else if (keyCode == Canvas.KEY_NUM1) { //按了双倍下注键 
					if (cardsState[0][2] == 0) { 
						doubleCard(0); 
					} 
					else if (cardsState[0][2] != 0 && cardsState[1][2] == 0 && isSpread) { 
						doubleCard(1); ; 
					} 
				} 
				else if (keyCode == Canvas.KEY_NUM2) { //按了分牌键 
					//如果第一付牌现在是两张牌,而且还没分过牌就可以分牌 
					spread(); 
				} 
				break; 
			case 4: //要完牌(进入等待其它人) 
				break; 
			case 5: //显示发牌结果,并且让用户选择继续或离开 
				if (keyCode == softOne) { //返回大厅 
					outGame(); 
				} 
				else if (keyCode == softTwo) { //继续游戏 
					reBegin(); //游戏重新开始 
				} 
				break; 
		} 
	} 
}