package pushbox;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class gameframe extends JFrame implements ActionListener,MouseListener ,KeyListener{
//主面板类
final int WALL=1,BOX=2,BOXONEND=3,END=4,MANDOWN=5,MANLEFT=6,MANRIGHT=7,MANUP=8,GRASS=9,MANDOWNONEND=10,MANLEFTONEND=11,MANRIGHTONEND=12,
MANUPONEND=13;
private Image ibuffer;
private Graphics gbuffer;
private int grade=0;
private int row=7,column=7,leftX=0,leftY=0;
//记载人的行号列号 地图左上角的行列号
private int mapRow=0,mapColumn=0;
private int width=0,height=0;//记载屏幕的大小!!
private boolean acceptKey=true;
//程序用到的图片
private Image pic[]=null;
private int[][]mymap=null;
private ArrayList list=new ArrayList();
Sound sound;
//在构造方法中初始化游戏地图,清空悔棋信息列表,同时播放MIDI背景音乐。
public gameframe() {
super("推箱子");
setSize(600,600);
setResizable(false);
setLocation(300,20);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cont=getContentPane();
cont.setLayout(null);
cont.setBackground(Color.black);
//最初的13张图片
getPic();
width=this.getWidth();
height=this.getHeight();
initMap();//初始化grade地图,清空悔棋列表信息
this.addKeyListener( this);
this.addMouseListener(this);
this.setFocusable(true);
setVisible(true);
sound=new Sound();
sound.loadSound();
}
public void initMap() {
mymap=getMap(grade);
list.clear();
getMapSizeAndPosition();
getManPosition();
}
public void getManPosition() {
for(int i=0;i<mymap.length;i++) {
for(int j=0;j<mymap[0].length;j++)
if(mymap[i][j]==MANDOWN||mymap[i][j]==MANDOWNONEND
||mymap[i][j]==MANUP||mymap[i][j]==MANUPONEND
||mymap[i][j]==MANLEFT||mymap[i][j]==MANLEFTONEND
||mymap[i][j]==MANRIGHT||mymap[i][j]==MANRIGHTONEND) {
row=i;
column=j;
break;
}
}
}
private void getMapSizeAndPosition() {//获取游戏区域大小及显示游戏的左上角坐标位置
mapRow=mymap.length;
mapColumn=mymap[0].length;
leftX=(width-mymap[0].length*30)/2;
leftY=(height-mymap.length*30)/2;
}
public void getPic() {
pic=new Image[14];
for(int i=0;i<13;i++) {
pic[i]=Toolkit.getDefaultToolkit().getImage("D://test//photo//"+i+".jpg");
}
}
public int grassOrEnd(int man) {//判断人所在的位置是目的地还是通道
int result=GRASS;
if(man==MANDOWNONEND||man==MANLEFTONEND||man==MANRIGHTONEND||man==MANUPONEND) {
result=END;
}
return result;
}
private void moveUp() {//向上
//上一位是墙
if(mymap[row-1][column]==WALL)
return;
//上一位是box或boxonend,则需考虑上上一位
if(mymap[row-1][column]==BOX||mymap[row-1][column]==BOXONEND) {
//上上一位是目的地或通道
if(mymap[row-2][column]==END||mymap[row-2][column]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
int boxTemp=mymap[row-2][column]==END?BOXONEND:BOX;
int manTemp=mymap[row-1][column]==BOX?MANUP:MANUPONEND;
mymap[row-2][column]=boxTemp;
mymap[row-1][column]=manTemp;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row--;
}
}
if(mymap[row-1][column]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row-1][column]=MANUP;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row--;
}
if(mymap[row-1][column]==END) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row-1][column]=MANUPONEND;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row--;}
}private void moveDown() {//向下
//下一位是墙
if(mymap[row+1][column]==WALL)
return;
//下一位是box或boxonend,则需考虑下下一位
if(mymap[row+1][column]==BOX||mymap[row+1][column]==BOXONEND) {
//下下一位是目的地或通道
if(mymap[row+2][column]==END||mymap[row+2][column]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
int boxTemp=mymap[row+2][column]==END?BOXONEND:BOX;
int manTemp=mymap[row+1][column]==BOX?MANUP:MANUPONEND;
mymap[row+2][column]=boxTemp;
mymap[row+1][column]=manTemp;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row++;
}
}if(mymap[row+1][column]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row+1][column]=MANUP;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row++;
}
if(mymap[row+1][column]==END) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row+1][column]=MANUPONEND;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
row++;}
}private void moveLeft() {//向左
//上一位是墙
if(mymap[row][column-1]==WALL)
return;
//上一位是box或boxonend,则需考虑上上一位
if(mymap[row][column-1]==BOX||mymap[row][column-1]==BOXONEND) {
//上上一位是目的地或通道
if(mymap[row][column-2]==END||mymap[row][column-2]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
int boxTemp=mymap[row][column-2]==END?BOXONEND:BOX;
int manTemp=mymap[row][column-1]==BOX?MANUP:MANUPONEND;
mymap[row][column-2]=boxTemp;
mymap[row][column-1]=manTemp;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column--;
}
}if(mymap[row][column-1]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row][column-1]=MANUP;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column--;
}
if(mymap[row][column-1]==END) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row][column-1]=MANUPONEND;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column--;}
}private void moveRight() {//向右
//上一位是墙
if(mymap[row][column+1]==WALL)
return;
//上一位是box或boxonend,则需考虑上上一位
if(mymap[row][column+1]==BOX||mymap[row][column+1]==BOXONEND) {
//上上一位是目的地或通道
if(mymap[row][column+2]==END||mymap[row][column+2]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
int boxTemp=mymap[row][column+2]==END?BOXONEND:BOX;
int manTemp=mymap[row][column+1]==BOX?MANUP:MANUPONEND;
mymap[row][column+2]=boxTemp;
mymap[row][column+1]=manTemp;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column++;
}
}if(mymap[row][column+1]==GRASS) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row][column+1]=MANUP;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column++;
}
if(mymap[row][column+1]==END) {
map1 currMap=new map1(row,column,mymap);//保存当前全部游戏的地图信息到ArrayList的list中,方便撤销!!
list.add(currMap);
mymap[row][column+1]=MANUPONEND;
mymap[row][column]=grassOrEnd(mymap[row][column]);
//修改人离开后人的坐标
column++;}
}
public boolean isFinished() {
for(int i=0;i<mapRow;i++)
for(int j=0;j<mapColumn;j++)
if(mymap[i][j]==END||mymap[i][j]==MANDOWNONEND||mymap[i][j]==MANUPONEND||mymap[i][j]==MANLEFTONEND||mymap[i][j]==MANRIGHTONEND) {
return false;
}
return true;
}
public void paint(Graphics g) {//绘制地图
for(int i=0;i<mapRow;i++)
for(int j=0;j<mapColumn;j++) {
if(mymap[i][j]!=0)
g.drawImage(pic[mymap[i][j]],leftX+j*30,leftY+i*30,this);
g.setColor(Color.RED);
g.setFont(new Font("楷体_2312",Font.BOLD,30));
g.drawString("现在是第", 150, 140);
g.drawString(String.valueOf(grade+1), 310, 140);
g.drawString("关", 360, 140);
}}
/*public void paint1(Graphics g) {
if(ibuffer==null) {
ibuffer=createImage(this.getSize().width,this.getSize().height);
gbuffer=ibuffer.getGraphics();
}gbuffer.setColor(getBackground());
gbuffer.fillRect(0, 0, this.getSize().width, this.getSize().height);
for(int i=0;i<mapRow;i++)
for(int j=0;j<mapColumn;j++) {
if(mymap[i][j]!=0)
gbuffer.drawImage(pic[mymap[i][j]],leftX+j*30,leftY+i*30,this);
gbuffer.setColor(Color.RED);
gbuffer.setFont(new Font("楷体_2312",Font.BOLD,30));
gbuffer.drawString("现在是第", 150, 140);
gbuffer.drawString(String.valueOf(grade+1), 310, 140);
gbuffer.drawString("关", 360, 140);
g.drawImage(ibuffer, 0, 0, this);
}}*/
public void update(Graphics g) {
paint(g);
}
public int getManX() {
return row;
}
public int getManY() {
return column;
}
public int getGrade() {
return grade;
}
public int[][] getMap(int grade){
return map.getMap(grade)
; }
//显示提示信息对话框!!
public void DisplayToast(String str ) {
JOptionPane.showMessageDialog(null, str,"提示",JOptionPane.ERROR_MESSAGE);
}
//撤销移动操作
public void undo() {
if(list.size()>0) {
map1 priorMap=(map1)list.get(list.size()-1);
mymap=priorMap.getMap();
row=priorMap.getManX();
column=priorMap.getManY();
repaint();
list.remove(list.size()-1);
}
else {
DisplayToast("无法在撤退了!");
}
}
//实现下一关的初始化,
public void nextGrade() {
if(grade>=map.getCount()-1) {
DisplayToast("恭喜你完成了所有关卡!!!!");
sound.mystop();
acceptKey=false;
}else {
grade++;
initMap();
repaint();
acceptKey=true;
}
}
//实现上一关初始化
public void priorGrade() {
grade--;
acceptKey=true;
if(grade<0)
grade=0;
initMap();
repaint();
}
//键盘相关事件
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON3)
undo();
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
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();
}
repaint();
this.setFocusable(true);
if(isFinished()) {
//禁用按键
acceptKey=false;
if(grade==map.getCount())
JOptionPane.showMessageDialog(this,"恭喜通过最后一关");
else {
String msg="恭喜您通过第"+grade+"关!!!\n是否要进入下一关?";
int type=JOptionPane.YES_NO_OPTION;
String title="pass";
int choice=0;
choice=JOptionPane.showConfirmDialog(null, msg,title,type);
if(choice==1)
System.exit(0);
else if(choice==0) {
//进入下一关
acceptKey=true;
nextGrade();
}
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}public static void main(String args[]) {
new gameframe();
}
}
package pushbox;
import java.io.InputStream;
public class map {
static int mymap[][][]= {
{
{0,0,1,1,1,0,0,0},
{0,0,1,9,4,0,0,0},
{0,0,1,9,2,1,1,1},
{1,4,9,2,5,9,1,1},
{1,1,1,9,2,1,0,0},
{0,0,0,1,4,1,0,0},
{0,0,0,1,1,1,0,0}
},
{
{1,1,1,1,1,1,0,0,0},
{1,9,9,5,1,1,0,0,0},
{1,9,2,2,1,1,1,1,1},
{1,9,2,9,1,1,1,4,1},
{1,1,1,9,1,1,1,4,1},
{0,1,1,9,9,9,9,4,1},
{0,1,9,9,9,1,9,9,1},
{0,1,9,9,9,1,1,1,1},
{0,1,1,1,1,1,0,0,0}
}
};
static int count=mymap.length;
public static int[][] getMap(int grade){
int temp[][];
if(grade>=0&&grade<count)
temp=mymap[grade];
else
temp=mymap[0];
int row=temp.length;
int column=temp[0].length;
int[][] result=new int[row][column];
for(int i=0;i<row;i++) {
for(int j=0;j<column;j++) {
result[i][j]=temp[i][j];
}
}
return result;
}
public static int getCount() {
return count;
}
}
package pushbox;
public class map1 {
int manX=0;int manY=0; int mymap[][];
int grade;
//此方法用于撤销,撤销只需要人的位置和地图的当前状态!!!
public map1(int manX,int manY,int[][]mymap) {
this.manX=manX;
this.manY=manY;
int row=mymap.length;
int column=mymap[0].length;
int temp[][]=new int[row][column];
for(int i=0;i<row;i++)
for(int j=0;j<column;j++) {
temp[i][j]=mymap[i][j];
}
this.mymap=temp;
}//次构造方法用于保存操作!!
//回复地图是需要人的位置,地图的当前状态,和关卡数!!
public map1(int manX,int manY,int[][]mymap,int grade) {
this(manX,manY,mymap);
this.grade=grade;
}
public int getManX() {
return manX;
}
public int getManY() {
return manY;
}
public int[][] getMap(){
return mymap;
}
public int getGrade() {
return grade;
}
}
package pushbox;//播放背景音乐
import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class Sound {
String path=new String("D://test//music//");
String file=new String("starwars.mid");
Sequence seq;
boolean sign;
Sequencer midi;
void loadSound() {
try {
seq=MidiSystem.getSequence(new File(path+file));
midi=MidiSystem.getSequencer();
midi.open();
midi.setSequence(seq);
midi.start();
midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
} catch (Exception e) {
e.printStackTrace();
sign=true;}
}
void mystop() {
midi.stop();
midi.close();
sign=false;
}
boolean isplay() {
return sign;
}
void setMusic(String e) {
file=e;
}
}