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

📄 maincanvas.java

📁 网络游戏21点源码 java版本 支持网络连接 如有问题
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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");
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -