📄 boxpanel.java
字号:
package tuixiangzi;
/**
*
* @author Cheny
*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Stack;
import java.io.*;
class BoxPanel extends JPanel implements KeyListener, MouseListener, MouseMotionListener
//绘图的面板
{
int lastmap=10;//地图数
static int[][] nowmap;
int[][] bemap;
int mapX,mapY;
Image[] myImage;
Map Nmap;
Map Bmap;
int len=30;
public static int level=1;
Stack <Integer>mystack=new Stack<Integer>();
Stack Smaze=new Stack();
Stack mouseclick=new Stack();
public static Stack <Integer>Smovements=new Stack<Integer>();
public static int movements=0;
public static int score=0;
public static int backmovements=0;
BoxPanel(){
setBounds(0,0,410,380);
setBackground(Color.white);
addKeyListener(this);
addMouseMotionListener(this);
addMouseListener(this);
myImage=new Image[7]; //7张图片
for(int i=0; i<=6; i++){
myImage[i] = Toolkit.getDefaultToolkit().getImage("pic\\"+i+".gif");
}
setVisible(true);
}
public void play(int i) { //游戏
try {
Nmap=new Map(i);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
nowmap=Nmap.getmap();
mapX=Nmap.getX();
mapY=Nmap.getY();
if(i==0)
try {
Bmap=new Map(level);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
else
try {Bmap=new Map(i);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
bemap=Bmap.getmap();
if(i==0){
movements=Nmap.getmovements();
level=Nmap.getsavelevel();
score=Nmap.getscore();
backmovements=Nmap.getbackmovements();
}
Smovements.push( movements);
repaint();
}
public int maxlevel() { return lastmap; }
public void paint(Graphics page)//绘图
{
for(int i=0; i<16; i++)
for(int j=0; j<16; j++){
page.drawImage(myImage[nowmap[j][i]],i*len,j*len,this);
}
page.setColor( Color.blue);
page.setFont(new Font("楷体_2312",Font.BOLD,len));
page.drawString("STAGE:",40,40);
page.drawString(String.valueOf(level),160,40);
page.drawString("SCORE:",220,40);
page.drawString(String.valueOf(score),340,40);
}
public void keyPressed(KeyEvent e) { //键盘事件
if(e.getKeyCode()==KeyEvent.VK_UP){moveup();}
if(e.getKeyCode()==KeyEvent.VK_DOWN){movedown();}
if(e.getKeyCode()==KeyEvent.VK_LEFT){moveleft();}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){moveright();}
if(e.getKeyCode()==KeyEvent.VK_F1 ){
play(level);
requestFocus();
remove();
}
if( e.getKeyCode()==KeyEvent.VK_A){ //上一关
level--;
if(level<1){
level++;
JOptionPane.showMessageDialog(this,"本关是第一关");
requestFocus();
}
else {
play(level);
requestFocus();
Smovements.pop();
Smovements.pop();
movements=Smovements.peek();
}
remove();
}
if(e.getKeyCode()==KeyEvent.VK_S){ //下一关
level++;
if(level>lastmap){
JOptionPane.showMessageDialog(this,"本关已是最后一关");
level=1;
play(level);
requestFocus();
}
else {
play(level);
requestFocus();
}
remove();
}
if(e.getKeyCode()==KeyEvent.VK_D){ //选关
String lel=JOptionPane.showInputDialog(this,"请输入您要转到的关卡号:(1~10)");
level=Integer.parseInt(lel);
remove();
if(level<=1&&level<=10){
play(level);
requestFocus();
}
else{
JOptionPane.showMessageDialog(this, "没有这一关!!!");
requestFocus();
}
}
if(e.getKeyCode()==KeyEvent.VK_F2) { //悔一步
if(isMystackEmpty() && ismouseclickEmpty() )
JOptionPane.showMessageDialog(this, "您还未移动!!!");
else{
switch(back()){
case 10: upback(10); break;
case 11: upback(11); break;
case 20: downback(20); break;
case 21: downback(21); break;
case 30: leftback(30); break;
case 31: leftback(31); break;
case 40: rightback(40); break;
case 41: rightback(41); break;
case 1 : mouseclickback(); break;
}
}
backmovements++;
requestFocus();
}
if(pass()){
if(level==lastmap){ JOptionPane.showMessageDialog(this, "恭喜您通过最后一关!!!"); }
else{
score=score+1000*level/(movements*(backmovements+1));
movements=0;
backmovements=0;
level++;
play(level);
}
mystack.removeAllElements();
mouseclick.removeAllElements();
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
boolean isMystackEmpty(){
return mystack.isEmpty();
}//判断栈是否为空
boolean ismouseclickEmpty(){
return mouseclick.isEmpty();
}//判断鼠标点击栈是否为空
int back() {
return (Integer)mystack.pop();
} //返回栈顶
void remove(){
mystack.removeAllElements();
mouseclick.removeAllElements();
}//清空两个栈
void moveup(){ //上移
if(nowmap[mapY-1][mapX]==2||nowmap[mapY-1][mapX]==4){ //判断有无障碍
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY-1][mapX]=5;
repaint();
mapY--;
mystack.push(10);
}
else if(nowmap[mapY-1][mapX]==3) { //判断前面是否箱子
if(nowmap[mapY-2][mapX]==4) {
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY-1][mapX]=5;
nowmap[mapY-2][mapX]=6;
repaint();
mapY--;
movements++;
mystack.push(11);
}
else if(nowmap[mapY-2][mapX]==2){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY-1][mapX]=5;
nowmap[mapY-2][mapX]=3;
repaint();
mapY--;
movements++;
mystack.push(11);
}
else {
nowmap[mapY][mapX]=5;
repaint();
}
}
else if(nowmap[mapY-1][mapX]==6){ //是否在目的地的箱子
if(nowmap[mapY-2][mapX]==4){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY-1][mapX]=5;
nowmap[mapY-2][mapX]=6;
repaint();
mapY--;
movements++;
mystack.push(11);
}
else if(nowmap[mapY-2][mapX]==2){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY-1][mapX]=5;
nowmap[mapY-2][mapX]=3;
repaint();
mapY--;
movements++;
mystack.push(11);
}
else{
nowmap[mapY][mapX]=5;
repaint();
}
}
if(nowmap[mapY-1][mapX]==1){
nowmap[mapY][mapX]=5;
repaint();
}
}
void upback(int n){ //上方回退
if(n==10){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else nowmap[mapY][mapX]=2;
}
else if(n==11){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=6;
else nowmap[mapY][mapX]=3;
if(bemap[mapY-1][mapX]==4||bemap[mapY-1][mapX]==6)
nowmap[mapY-1][mapX]=4;
else nowmap[mapY-1][mapX]=2;
movements--;
}
nowmap[mapY+1][mapX]=5;
repaint(); mapY++;
}
void movedown(){
if(nowmap[mapY+1][mapX]==2||nowmap[mapY+1][mapX]==4){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY+1][mapX]=5;
repaint();
mapY++;
mystack.push(20);
}
else if(nowmap[mapY+1][mapX]==3){
if(nowmap[mapY+2][mapX]==4){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY+1][mapX]=5;
nowmap[mapY+2][mapX]=6;
repaint();
mapY++;
movements++;
mystack.push(21);
}
else if(nowmap[mapY+2][mapX]==2){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY+1][mapX]=5;
nowmap[mapY+2][mapX]=3;
repaint();
mapY++;
movements++;
mystack.push(21);
}
else {
nowmap[mapY][mapX]=5;
repaint();
}
}
else if(nowmap[mapY+1][mapX]==6){
if(nowmap[mapY+2][mapX]==4){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY+1][mapX]=5;
nowmap[mapY+2][mapX]=6;
repaint();
mapY++;
movements++;
mystack.push(21);
}
else if(nowmap[mapY+2][mapX]==2){
if(bemap[mapY][mapX]==4||bemap[mapY][mapX]==6)
nowmap[mapY][mapX]=4;
else
nowmap[mapY][mapX]=2;
nowmap[mapY+1][mapX]=5;
nowmap[mapY+2][mapX]=3;
repaint();
mapY++;
movements++;
mystack.push(21);
}
else {
nowmap[mapY][mapX]=5;
repaint();
}
}
else if(nowmap[mapY+1][mapX]==1){
nowmap[mapY][mapX]=5;
repaint();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -