用java实现推箱子(sokoban)游戏_第1页
用java实现推箱子(sokoban)游戏_第2页
用java实现推箱子(sokoban)游戏_第3页
用java实现推箱子(sokoban)游戏_第4页
用java实现推箱子(sokoban)游戏_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、推箱子游戏一、功能描述: 可以通过面板上的按钮或是键盘上的pageup,pagedown键选择上下关 可以通过面板上按钮或是键盘上的Backspace键后退,一直后退自己想要的位置,知道游戏开始时的位置。 可以通过面板上的按钮或是键盘上的字母r重新开始当前关卡游戏。 可以在复选框内选择想要玩的关卡。二、界面及运行截图 三、源代码(三部分)1、地图类package box;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;

2、/读取字符文件类FileReaderimport java.io.IOException;public class map int map=new int2020;int manX,manY;public map(int level)String filepath=mapc/+level+.txt;File file = new File(filepath);FileReader fr = null;/利用FileReader流来读取一个文件中的数据BufferedReader br = null;/字符读到缓存里try fr = new FileReader(file);br = new B

3、ufferedReader(fr);for (int i = 0; i 15; i+)String line = br.readLine();/以行为单位,一次读一行 利用BufferedReader的readLine,读取分行文本byte point = line.getBytes();/将字符串转换为字节数组for (int j = 0; j 15; j+) mapij = pointj - 48;/ 根据ASCall码表要减掉30H(十进制的48)if (mapij = 5 | mapij = 6 | mapij = 7| mapij = 8)manX = i;manY = j; cat

4、ch (FileNotFoundException e)e.printStackTrace();/深层次的输出异常调用的流程 catch (IOException e)e.printStackTrace();/深层次的输出异常调用的流程catch(NullPointerException e)e.printStackTrace();/深层次的输出异常调用的流程finally if (br = null)trybr.close(); catch (IOException e)e.printStackTrace();br = null;if (fr = null)try fr.close(); c

5、atch (IOException e)e.printStackTrace();fr = null;public int getMap() return map;public int getManX() return manX;public int getManY() return manY;2、游戏运行类package box;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.a

6、wt.event.ItemListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.*;import javax.swing.*;public class pushbox extends JFrame implements KeyListener,ActionListenermap map_level=new map(1); /首次获取地图int map=new int1515; /地图上每个位置所对应的图片int map_restart=new int1515; /备用

7、图片static int manX,manY; /人所处的位置 static int level=1; /所处关卡static int step=0;Image picture; /地图上的所有图片ImageIcon image=new ImageIcon10; Stack back_stack = new Stack(); /存储所前行的路径JButton next,previous,back,restart,exit; /按钮:下一关,上一关,重新开始,退出 String current_level=第+level+关; /当前所处关卡(右上角显示文本)String level_butto

8、n=new String13; /复选框的内容JComboBox selectBox; /选关复选框final int Up = 0;final int Down = 1;final int Left = 2;final int Right = 3;int dir_x = -1, 1, 0, 0;int dir_y = 0, 0, -1, 1;public pushbox()super(推箱子);getmap(map);previous=new JButton(上一关); next=new JButton(下一关);restart=new JButton(重新开始);back=new JBut

9、ton(后退);exit=new JButton(退出游戏);for(int i=0;i13;i+)level_buttoni=第+Integer.toString(i+1)+关;selectBox=new JComboBox(level_button);FlowLayout layout=new FlowLayout(); /布局模式Container c=getContentPane();c.setLayout(layout);layout.setAlignment(FlowLayout.CENTER); /控件在布局中的位置c.setBackground(Color.CYAN); /背景

10、色c.add(previous); c.add(next);c.add(back);c.add(restart);c.add(selectBox);c.add(exit);previous.addActionListener(ActionListener) this);previous.addKeyListener(this);next.addActionListener(ActionListener) this);next.addKeyListener(this);back.addActionListener(this);back.addKeyListener(this);restart.a

11、ddActionListener(ActionListener) this);restart.addKeyListener(this);exit.addActionListener(ActionListener) this);exit.addKeyListener(this);selectBox.addItemListener( /监听复选框点击事件new ItemListener()public void itemStateChanged(ItemEvent e)if(e.getStateChange()=e.SELECTED)step=0;back_stack.clear(); /每次重新

12、选关后都要清空路径栈level=selectBox.getSelectedIndex()+1; /获取所选的关卡map_level=new map(level); /重新获取对应关卡的地图getmap(map); current_level=第+level+关; /右上角提示所处关卡文本的更新repaint(); /重画地图requestFocus(); /重新获取焦点(因为按钮事件后键盘事件不起作用));for(int k=0;k10;k+)imagek=new ImageIcon(picture/+k+.png); /获取图片picture=new Imageimage0.getImage

13、(),image1.getImage(),image2.getImage(),image3.getImage(),image4.getImage(),image5.getImage(),image6.getImage(),image7.getImage(),image8.getImage(),image9.getImage();this.setFocusable(true);this.addKeyListener(KeyListener)this);setSize(640,640);setVisible(true);/判断是否通关(方法是,检查地图中是否还有箱子编号4)public Boole

14、an pass()int p=0;for(int i=0;i15;i+)for(int j=0;j15;j+)if(mapij=4) p+;if(p=0) return true;else return false;/获取地图上每个位置所对应的图片编号public void getmap(int map)for(int i=0;i15;i+)for(int j=0;j15;j+)mapij=map_level.mapij;manX=map_level.manX;manY=map_level.manY; public void paint(Graphics g)super.paint(g);/提

15、示信息back_stack.push(Down + 5); /这里是一个细节,先将“DOWN”存入栈内g.drawString(current_level,500,90);g.drawString(第+step+步,400,90);g.drawString(用键盘上的R重新开始,Q退出游戏,200,565);g.drawString(用键盘pageup,pagedown切换关卡,200,580);g.drawString(用键盘上的上下左右键控制人的移动,200,600);g.drawString(用键盘上的Backspace键后退,200,620); /在面板上画地图for (int i =

16、 0; i 15; i+)for (int j = 0; j 15; j+)g.drawImage(picturemapij,100+30*j,100+30*i, this);public void Step(Graphics g)g.setColor(Color.cyan);g.drawString(第+step+步,400,90);step+;g.setColor(Color.BLACK);g.drawString(第+step+步,400,90);public void move(int dir, Graphics g)int man = dir + 5;int dx = dir_xdi

17、r;int dy = dir_ydir;int x = manX;int y = manY;manX += dx;manY += dy;int origin_picture = mapmanXmanY;int next_picture = mapmanX + dxmanY + dy;if(mapmanXmanY=4|mapmanXmanY=3)&(mapmanX+dxmanY+dy=2|mapmanX+dxmanY+dy=4|mapmanX+dxmanY+dy=3) /上面是箱子,箱子上面是墙或箱子manX -= dx;manY -= dy;return ;if(mapmanXmanY=2)

18、/上面是墙manX -= dx;manY -= dy;return ;if(mapmanXmanY=1|mapmanXmanY=9) /人上面是草地或是目的地g.drawImage(pictureman,100+30*manY,manX*30+100,this); /人的朝向变化if(mapxy=9) /原来位置是目的地g.drawImage(picture9,100+30*y,100+30*x,this);else /原来位置是草地g.drawImage(picture1,100+30*y,x*30+100,this);mapxy=1;Step(g);if(mapmanXmanY=4|map

19、manXmanY=3)&mapmanX+dxmanY+dy=1) /上面是箱子,箱子上面是草地g.drawImage(pictureman,100+30*manY,manX*30+100,this); /人的朝向变化if(mapmanXmanY=3) /若是移动一大目的地的箱子,原箱子位置值为9mapmanXmanY=9;if(mapxy=9) /原来位置是目的地g.drawImage(picture9,100+30*y,100+30*x,this);else /原来位置是草地g.drawImage(picture1,100+30*y,x*30+100,this);mapxy=1;g.draw

20、Image(picture4,100+30*(manY+dy),(manX+dx)*30+100,this); /草地位置变箱子mapmanX+dxmanY+dy=4;Step(g);if(mapmanXmanY=4|mapmanXmanY=3)&mapmanX+dxmanY+dy=9) /上面是箱子,箱子上面是目的地g.drawImage(pictureman,100+30*manY,manX*30+100,this); /人的朝向变化if(mapmanXmanY=3) /若是移动一大目的地的箱子,原箱子位置值为9mapmanXmanY=9;else mapmanXmanY=0;if(map

21、xy=9) /原来位置是目的地g.drawImage(picture9,100+30*y,100+30*x,this);else /原来位置是草地g.drawImage(picture1,100+30*y,x*30+100,this);mapxy=1;g.drawImage(picture3,100+30*(manY+dy),(manX+dx)*30+100,this); /目的地位置变箱子mapmanX+dxmanY+dy=3;Step(g);back_stack.push(next_picture);back_stack.push(origin_picture);back_stack.pu

22、sh(manY);back_stack.push(manX);back_stack.push(man);if(pass()JOptionPane.showMessageDialog(null, 恭喜你过关了!);/键盘事件public void keyPressed(KeyEvent e) Graphics g=getGraphics();int dir ;switch(e.getKeyCode()case KeyEvent.VK_UP:dir = Up;move(dir, g); break;case KeyEvent.VK_DOWN :dir = Down;move(dir, g); br

23、eak;case KeyEvent.VK_LEFT:dir = Left;move(dir, g);break;case KeyEvent.VK_RIGHT:dir = Right;move(dir, g); break;case KeyEvent.VK_BACK_SPACE:back.doClick(); break;case KeyEvent.VK_PAGE_DOWN :next.doClick(); break;case KeyEvent.VK_PAGE_UP:previous.doClick(); break;case KeyEvent.VK_R:restart.doClick();

24、break;case KeyEvent.VK_Q :exit.doClick(); break;public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) /悔步后退public void step_back(Graphics g)g.setColor(Color.cyan);g.drawString(第+step+步,400,90);step-;g.setColor(Color.BLACK);g.drawString(第+step+步,400,90);public void Back()if(back_stack.

25、size()=2) return;int dir=back_stack.pop() - 5; /获取上一步的方向int s = back_stack.pop();int t = back_stack.pop();int origin_picture = back_stack.pop();int netx_picture = back_stack.pop();int pre_dir = back_stack.lastElement();Graphics g=getGraphics();int dx = dir_xdir;int dy = dir_ydir;g.drawImage(pictureo

26、rigin_picture,100+30*t,100+30*s,this);g.drawImage(picturenetx_picture,100+30*(t+dy),100+30*(s+dx),this); g.drawImage(picturepre_dir,100+30*(t-dy),100+30*(s-dx),this); manX = s - dx; manY = t - dy; mapst = origin_picture; maps+dxt+dy = netx_picture; maps-dxt-dy = pre_dir; step_back(g);/按钮事件监听public v

27、oid actionPerformed(ActionEvent e) if(e.getSource()=restart) /重新开始back_stack.clear(); /清空路径栈step=0;getmap(map);repaint();else if(e.getSource()=exit) /退出游戏this.setVisible(false);else if(e.getSource()=next) /下一关back_stack.clear();step=0;level+;if(level!=14)map_level=new map(level);getmap(map);current_

28、level=第+level+关;repaint();else if(e.getSource()=previous) /上一关back_stack.clear();step=0;level-;if(level!=0)map_level=new map(level);getmap(map);current_level=第+level+关;repaint();else if(e.getSource()=back)Back(); requestFocus();3、开始界面package box;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Game extends JFrame implements Acti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论