📄 miningcanvas.java
字号:
}
}
}
}
}
}
public void paintSelected(Graphics g){
g.setColor(0x00FF0000);//画出选择框,注意其与总雷区和能在屏幕上显示出的区域间的关系
g.drawRoundRect(miningMapX+(selectedX-paintX)*miningGridLength-1,
miningMapY+(selectedY-paintY)*miningGridLength-1,
miningGridLength+1,miningGridLength+1,2,2);
}
private void paintHelpScreen(Graphics g){
g.setColor(0x00FFFFFF);
g.fillRect(0,0,canvasW,canvasH);
g.setFont(lowFont);
g.setColor(0x00000000);
for(int i=0;i<strGamehelp.length;i++){
g.drawString(strGamehelp[i],5,5+(lowFont.getHeight()+3)*i,Graphics.TOP|Graphics.LEFT);
}
}
private void paintMenuScreen(Graphics g){
for(int i=0;i < mainMenu.length;i++){
if(i==menuIdx){
g.setColor(highBGColor);
g.fillRect(0,startHeight+i*(lowFont.getHeight()+spacing)-(highFont.getHeight()
-lowFont.getHeight())/2,canvasW,highFont.getHeight());
g.setFont(highFont);
g.setColor(highColor);
g.drawString(mainMenu[i],(canvasW-highFont.stringWidth(mainMenu[i]))/2,
startHeight+i*(lowFont.getHeight()+spacing)-(highFont.getHeight()-lowFont.getHeight())/2,
Graphics.TOP|Graphics.LEFT);
} else {
g.setFont(lowFont);
g.setColor(lowColor);
g.drawString(mainMenu[i],(canvasW - lowFont.stringWidth(mainMenu[i])) / 2,
startHeight + i*(lowFont.getHeight() + spacing),Graphics.TOP|Graphics.LEFT);
}
}
}
private void paintSplashScreen(Graphics g) {
g.setColor(0x00000000);
g.drawImage(splashImage, getWidth() / 2, getHeight() / 2 - 5,
Graphics.HCENTER | Graphics.VCENTER);
}
public void run() {
try {
Thread.sleep(splashDelayTime);
} catch (InterruptedException e) {
}
gamestate = GAMESTATE_MENU;// 在启动动画停留3秒后,改变游戏状态变量值,跳转到主菜单状态
repaint();
}
protected void paint(Graphics g) {
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, canvasW, canvasH);
switch (gamestate) {
case GAMESTATE_SPLASH:
paintSplashScreen(g);// 绘制游戏启动界面
break;
case GAMESTATE_MENU:
paintMenuScreen(g);// 绘制游戏主菜单
break;
case GAMESTATE_HELP:
paintHelpScreen(g);// 绘制帮助界面
break;
case GAMESTATE_GAMEING:
paintGameScreen(g);// 绘制游戏界面
break;
case GAMESTATE_GAMEMENU:
paintGameMenuScreen(g);// 绘制游戏时菜单界面
break;
default:
paintMenuScreen(g);// 绘制游戏主菜单
break;
}
}
public void gameInit(){
sbWon=false;
bombInit();
player1Found=0;player2Found=0;
selectedX=miningMapGrid/4;selectedY=miningMapGrid/4;
bombLeft=bombNum;
System.gc();//手动进行垃圾回收
}
public void bombInit(){
int bombindex=0;
int x=0,y=0;
Random random=new Random();
for(int i=0;i<miningMapGrid+2;i++){
for(int j=0;j<miningMapGrid+2;j++){
bombs[i][j]=new Bomb();
}
}
while(bombindex<bombNum){
x=Math.abs(random.nextInt()%16+1);
y=Math.abs(random.nextInt()%16+1);
if(!bombs[x][y].isBomb && x<=16 && x>=1 && y<=16 && y>=1){
try{
bombs[x][y].isBomb=true;
bombindex++;
bombs[x-1][y].bombaround++;
bombs[x-1][y-1].bombaround++;
bombs[x][y-1].bombaround++;
bombs[x+1][y-1].bombaround++;
bombs[x+1][y].bombaround++;
bombs[x+1][y+1].bombaround++;
bombs[x][y+1].bombaround++;
bombs[x-1][y+1].bombaround++;
}catch(ArrayIndexOutOfBoundsException e){}
}
}
}
public void bombOut(int x,int y){
if(bombs[x][y].hasFound==false && x>=1 && y>=1 &&
x<=MiningCanvas.miningMapGrid && y<=MiningCanvas.miningMapGrid){
bombs[x][y].hasFound=true;
if(bombs[x][y].bombaround==0){
this.bombOut(x-1,y);
this.bombOut(x-1,y-1);
this.bombOut(x,y-1);
this.bombOut(x+1,y-1);
this.bombOut(x+1,y);
this.bombOut(x+1,y+1);
this.bombOut(x,y+1);
this.bombOut(x-1,y+1);
}
}
}
public void checkWin(){
if(player1Found>26){
winString="Player1 has won!";
sbWon=true;
}
if(player2Found>26){
winString="Player2 has won!";
sbWon=true;
}
if(sbWon){
winAlert=new Alert("",winString+"\nPlayer1 "+player1Found
+" : "+player2Found+" player2",null,AlertType.INFO);
gameInit();
winAlert.setTimeout(Alert.FOREVER);
MiningMIDlet.display.setCurrent(winAlert);
}
}
protected synchronized void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch (gamestate) {
case GAMESTATE_MENU:
{
if (getGameAction(keyCode) == FullCanvas.UP && menuIdx - 1 >= 0) {
menuIdx--;
}
else if (getGameAction(keyCode) == FullCanvas.DOWN && menuIdx + 1 < mainMenu.length) {
menuIdx++;
}
else if (getGameAction(keyCode) == FullCanvas.FIRE) {
switch(menuIdx) {//选中后,按照选项值改变游戏状态值,跳转到相应的状态
case MAIN_NEW_GAME:
gamestate=GAMESTATE_GAMEING;
break;
case MAIN_SETTINGS:
gamestate=GAMESTATE_SETTING;
break;
case MAIN_HELP:
gamestate=GAMESTATE_HELP;
break;
case MAIN_ABOUT:
gamestate=GAMESTATE_ABOUT;
break;
case MAIN_EXIT:
miningMIDlet.destroyApp(false);
break;
}
}
break;
}
case GAMESTATE_HELP://如果游戏现在的状态为帮助状态,那个不管玩家按哪个键都会跳转到主菜单状态
gamestate=GAMESTATE_MENU;
break;
case GAMESTATE_GAMEING:
{
if(keyCode==FullCanvas.KEY_SOFTKEY1){
gamestate=GAMESTATE_GAMEMENU;
}
else if (action == FullCanvas.LEFT ) {
selectedX=(--selectedX+miningMapGrid)%(miningMapGrid);
}
else if (action == FullCanvas.RIGHT) {
selectedX=(++selectedX)%(miningMapGrid);
}
else if (action == FullCanvas.UP) {
selectedY=(--selectedY+miningMapGrid)%(miningMapGrid);
}
else if (action == FullCanvas.DOWN) {
selectedY=(++selectedY)%(miningMapGrid);
}
else if (action == FullCanvas.FIRE) {
if(!bombs[selectedY+1][selectedX+1].hasFound){
if(bombs[selectedY+1][selectedX+1].isBomb){
bombs[selectedY+1][selectedX+1].hasFound=true;
bombs[selectedY+1][selectedX+1].isPlayer1=this.isPlayer1;
if(isPlayer1)
player1Found++;
else
player2Found++;
bombLeft--;
checkWin();//每次有玩家挖到了雷就监测其是否胜出
}
else{
bombOut(selectedY+1,selectedX+1);
//如果此雷位及周围都无雷,打开所有与其相连的相同情况的雷位及此区域周边一圈雷位
isPlayer1=!isPlayer1;
}
}
}
//以下几行代码是调整显示在屏幕上的区域的坐标,以免选择框跑出屏幕范围
if((selectedX-paintX)<0)
paintX=selectedX;
else if((selectedX-paintX)>=bombMapW)
paintX=selectedX-bombMapW+1;
if((selectedY-paintY)<0)
paintY=selectedY;
else if((selectedY-paintY)>=bombMapH)
paintY=selectedY-bombMapH+1;
break;
}
case GAMESTATE_GAMEMENU:
{
if (getGameAction(keyCode) == FullCanvas.UP && gamemenuIdx - 1 >= 0) {
gamemenuIdx--;
}
else if (getGameAction(keyCode) == FullCanvas.DOWN && gamemenuIdx + 1 < gameMenu.length) {
gamemenuIdx++;
}
else if (getGameAction(keyCode) == FullCanvas.FIRE) {
switch(gamemenuIdx) {
case GAME_RETURN:
gamestate=GAMESTATE_GAMEING;
break;
case GAME_RESTART:
gameInit();
gamestate=GAMESTATE_GAMEING;
break;
case GAME_HELP:
gamestate=GAMESTATE_HELP;
break;
case GAME_MENU:
gamestate=GAMESTATE_MENU;
break;
case GAME_EXIT:
miningMIDlet.destroyApp(false);
break;
}
}
break;
}
default:
gamestate=GAMESTATE_MENU;
}
repaint();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -