packagepushbox;importjava.awt.Color;importjava.awt.Container;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.util.ArrayList;importjavax.swing.JFrame;importjavax.swing.JOptionPane;public class gameframe extends JFrame implementsActionListener,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;privateImage ibuffer;privateGraphics 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=newArrayList();
Sound sound;//在构造方法中初始化游戏地图,清空悔棋信息列表,同时播放MIDI背景音乐。
publicgameframe() {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=newSound();
sound.loadSound();
}public voidinitMap() {
mymap=getMap(grade);
list.clear();
getMapSizeAndPosition();
getManPosition();
}public voidgetManPosition() {for(int i=0;i
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 voidgetPic() {
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;
}returnresult;
}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 booleanisFinished() {for(int i=0;i
}return true;
}public void paint(Graphics g) {//绘制地图
for(int i=0;i
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
for(int j=0;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 voidupdate(Graphics g) {
paint(g);
}public intgetManX() {returnrow;
}public intgetManY() {returncolumn;
}public intgetGrade() {returngrade;
}public int[][] getMap(intgrade){returnmap.getMap(grade)
; }//显示提示信息对话框!!
public voidDisplayToast(String str ) {
JOptionPane.showMessageDialog(null, str,"提示",JOptionPane.ERROR_MESSAGE);
}//撤销移动操作
public voidundo() {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 voidnextGrade() {if(grade>=map.getCount()-1) {
DisplayToast("恭喜你完成了所有关卡!!!!");
sound.mystop();
acceptKey=false;
}else{
grade++;
initMap();
repaint();
acceptKey=true;
}
}//实现上一关初始化
public voidpriorGrade() {
grade--;
acceptKey=true;if(grade<0)
grade=0;
initMap();
repaint();
}//键盘相关事件
@Overridepublic voidkeyReleased(KeyEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidkeyTyped(KeyEvent arg0) {//TODO Auto-generated method stub
}public voidmouseClicked(MouseEvent e) {if(e.getButton()==MouseEvent.BUTTON3)
undo();
}
@Overridepublic voidmouseEntered(MouseEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidmouseExited(MouseEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidmousePressed(MouseEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidmouseReleased(MouseEvent arg0) {//TODO Auto-generated method stub
}
@Overridepublic voidkeyPressed(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();
}
}
}
}
@Overridepublic voidactionPerformed(ActionEvent e) {//TODO Auto-generated method stub
}public static voidmain(String args[]) {newgameframe();
}
}