📄 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");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -