java推箱子讲解.docx
《java推箱子讲解.docx》由会员分享,可在线阅读,更多相关《java推箱子讲解.docx(20页珍藏版)》请在冰豆网上搜索。
java推箱子讲解
总共四个包,因为不能上传图片所以在第2个包中,导入图片(图片可以去网上下载一些)或者高手帮我解决一下。
不用导入图片也能玩!
(求大神)
下面是整个游戏的代码:
1:
packagecom.sj.xzq;
classBackUpInfo{
privateint[][]map;
privateintmanX;
privateintmanY;
publicBackUpInfo(int[][]map,intmanX,intmanY){
this.map=map;
this.manX=manX;
this.manY=manY;
}
publicint[][]getMap(){
returnmap;
}
publicintgetManX(){
returnmanX;
}
publicintgetManY(){
returnmanY;
}
}
2:
packagecom.sj.xzq;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.util.Stack;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
publicclassGameextendsJPanel{
privateLoadMaplm;
privateintlevel;
privateintmanX,manY;
privateintlastImg=2;
privateint[][]map;//地图所对应的二维数组
privateint[][]backMap;//地图所对应的二维数组,这个数组用于保存上一步的地图信息
privatestaticfinalintLEN=30;//图片的长
privatestaticfinalintWIDTH=30;//图片的宽
privatestaticfinalintSPEED=30;//移动速度,每次移动一格
privatestaticToolkittk=Toolkit.getDefaultToolkit();
privatestaticImage[]imgs=null;
privateStackmyStack=newStack();
privateBackUpInfobp;
static{
imgs=newImage[]{
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/0.gif")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/1.gif")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/2.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/3.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/4.gif")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/5.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/6.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/7.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/8.GIF")),
tk.getImage(GameFrame.class.getClassLoader().getResource(
"imgs/9.GIF"))};
}
publicGame(intlevel){
this.setBounds(0,0,600,600);
this.setVisible(true);
lm=newLoadMap(level);
map=lm.getMap();
this.manX=lm.getManX();
this.manY=lm.getManY();
this.level=level;
}
publicvoidpaint(Graphicsg){
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
g.drawImage(imgs[map[i][j]],i*LEN,j*WIDTH,this);
}
}
g.setColor(Color.BLUE);
g.setFont(newFont("仿宋",Font.BOLD,18));
g.drawString("关卡:
"+level,50,50);
}
//响应键盘事件,松开键盘才响应
//上下左右四个键,实现人物的移动。
publicvoidkeyReleased(KeyEvente){
intkeycode=e.getKeyCode();
if(!
isPass()){
switch(keycode){
caseKeyEvent.VK_UP:
moveUp();
if(isPass()){
myStack.clear();
lm=newLoadMap(++level);
map=lm.getMap();
this.manX=lm.getManX();
this.manY=lm.getManY();
}
break;
caseKeyEvent.VK_DOWN:
moveDown();
if(isPass()){
myStack.clear();
lm=newLoadMap(++level);
map=lm.getMap();
this.manX=lm.getManX();
this.manY=lm.getManY();
}
break;
caseKeyEvent.VK_LEFT:
moveLeft();
if(isPass()){
myStack.clear();
lm=newLoadMap(++level);
map=lm.getMap();
this.manX=lm.getManX();
this.manY=lm.getManY();
}
break;
caseKeyEvent.VK_RIGHT:
moveRight();
if(isPass()){
myStack.clear();
lm=newLoadMap(++level);
map=lm.getMap();
this.manX=lm.getManX();
this.manY=lm.getManY();
}
break;
caseKeyEvent.VK_SPACE:
back();
break;
default:
break;
}
}
}
//实现人物的向上移动
privatevoidmoveUp(){
//如果下一步是目标或者是草地,则移动到下一步
if(map[manX][manY-1]==2||map[manX][manY-1]==4){
backMap=newint[20][20];
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息
}
}
bp=newBackUpInfo(backMap,manX,manY);
myStack.push(bp);
map[manX][manY]=lastImg;//先还原人物处的背景
lastImg=map[manX][manY-1];//保存人物下一步位置的背景
map[manX][manY-1]=8;//移动人物到下一步
manY--;
repaint();
}elseif(map[manX][manY-1]==3||map[manX][manY-1]==9){
backMap=newint[20][20];
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息
}
}
bp=newBackUpInfo(backMap,manX,manY);
myStack.push(bp);
//如果下一步是箱子
if(map[manX][manY-2]==2){
//箱子前面是草地
map[manX][manY-2]=3;
map[manX][manY]=lastImg;
if(map[manX][manY-1]==3){
lastImg=2;
}else{
lastImg=4;
}
map[manX][manY-1]=8;
manY--;
repaint();
}elseif(map[manX][manY-2]==4){
//箱子前面是目标
map[manX][manY-2]=9;//把箱子移动到目标,换成另一种颜色的箱子
map[manX][manY]=lastImg;
if(map[manX][manY-1]==3){
lastImg=2;
}else{
lastImg=4;
}
map[manX][manY-1]=8;
manY--;
repaint();
}
}
}
//实现人物的向下移动
privatevoidmoveDown(){
//如果下一步是目标或者是草地,则移动到下一步
backMap=newint[20][20];
if(map[manX][manY+1]==2||map[manX][manY+1]==4){
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息
}
}
bp=newBackUpInfo(backMap,manX,manY);
myStack.push(bp);
map[manX][manY]=lastImg;//先还原人物处的背景
lastImg=map[manX][manY+1];//保存人物下一步位置的背景
map[manX][manY+1]=5;//移动人物到下一步
manY++;
repaint();
}elseif(map[manX][manY+1]==3||map[manX][manY+1]==9){
backMap=newint[20][20];
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息
}
}
bp=newBackUpInfo(backMap,manX,manY);
myStack.push(bp);
//如果下一步是箱子
if(map[manX][manY+2]==2){
//箱子前面是草地
map[manX][manY+2]=3;
map[manX][manY]=lastImg;
if(map[manX][manY+1]==3){
lastImg=2;
}else{
lastImg=4;
}
map[manX][manY+1]=5;
manY++;
repaint();
}elseif(map[manX][manY+2]==4){
//箱子前面是目标
map[manX][manY+2]=9;//把箱子移动到目标,换成另一种颜色的箱子
map[manX][manY]=lastImg;
if(map[manX][manY+1]==3){
lastImg=2;
}else{
lastImg=4;
}
map[manX][manY+1]=5;
manY++;
repaint();
}
}
}
//实现人物的左移
privatevoidmoveLeft(){
//如果下一步是目标或者是草地,则移动到下一步
if(map[manX-1][manY]==2||map[manX-1][manY]==4){
backMap=newint[20][20];
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息
}
}
bp=newBackUpInfo(backMap,manX,manY);
myStack.push(bp);
map[manX][manY]=lastImg;//先还原人物处的背景
lastImg=map[manX-1][manY];//保存人物下一步位置的背景
map[manX-1][manY]=6;//移动人物到下一步
manX--;
repaint();
}elseif(map[manX-1][manY]==3||map[manX-1][manY]==9){
backMap=newint[20][20];
for(inti=0;i<20;i++){
for(intj=0;j<20;j++){
backMap[i][j]=map[i][j];//保存上一步的地图信息