用java實現(xiàn)推箱子(sokoban)游戲_第1頁
用java實現(xiàn)推箱子(sokoban)游戲_第2頁
用java實現(xiàn)推箱子(sokoban)游戲_第3頁
用java實現(xiàn)推箱子(sokoban)游戲_第4頁
用java實現(xiàn)推箱子(sokoban)游戲_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、推箱子游戲一、功能描述: 可以通過面板上的按鈕或是鍵盤上的pageup,pagedown鍵選擇上下關(guān) 可以通過面板上按鈕或是鍵盤上的Backspace鍵后退,一直后退自己想要的位置,知道游戲開始時的位置。 可以通過面板上的按鈕或是鍵盤上的字母r重新開始當(dāng)前關(guān)卡游戲。 可以在復(fù)選框內(nèi)選擇想要玩的關(guān)卡。二、界面及運行截圖 三、源代碼(三部分)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流來讀取一個文件中的數(shù)據(jù)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();/將字符串轉(zhuǎn)換為字節(jié)數(shù)組for (int j = 0; j 15; j+) mapij = pointj - 48;/ 根據(jù)ASCall碼表要減掉30H(十進(jìn)制的48)if (mapij = 5 | mapij = 6 | mapij = 7| mapij = 8)manX = i;manY = j; cat

4、ch (FileNotFoundException e)e.printStackTrace();/深層次的輸出異常調(diào)用的流程 catch (IOException e)e.printStackTrace();/深層次的輸出異常調(diào)用的流程catch(NullPointerException e)e.printStackTrace();/深層次的輸出異常調(diào)用的流程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; /地圖上每個位置所對應(yīng)的圖片int map_restart=new int1515; /備用

7、圖片static int manX,manY; /人所處的位置 static int level=1; /所處關(guān)卡static int step=0;Image picture; /地圖上的所有圖片ImageIcon image=new ImageIcon10; Stack back_stack = new Stack(); /存儲所前行的路徑JButton next,previous,back,restart,exit; /按鈕:下一關(guān),上一關(guān),重新開始,退出 String current_level=第+level+關(guān); /當(dāng)前所處關(guān)卡(右上角顯示文本)String level_butto

8、n=new String13; /復(fù)選框的內(nèi)容JComboBox selectBox; /選關(guān)復(fù)選框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(上一關(guān)); next=new JButton(下一關(guān));restart=new JButton(重新開始);back=new JBut

9、ton(后退);exit=new JButton(退出游戲);for(int i=0;i13;i+)level_buttoni=第+Integer.toString(i+1)+關(guān);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( /監(jiān)聽復(fù)選框點擊事件new ItemListener()public void itemStateChanged(ItemEvent e)if(e.getStateChange()=e.SELECTED)step=0;back_stack.clear(); /每次重新

12、選關(guān)后都要清空路徑棧level=selectBox.getSelectedIndex()+1; /獲取所選的關(guān)卡map_level=new map(level); /重新獲取對應(yīng)關(guān)卡的地圖getmap(map); current_level=第+level+關(guān); /右上角提示所處關(guān)卡文本的更新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);/判斷是否通關(guān)(方法是,檢查地圖中是否還有箱子編號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;/獲取地圖上每個位置所對應(yīng)的圖片編號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); /這里是一個細(xì)節(jié),先將“DOWN”存入棧內(nèi)g.drawString(current_level,500,90);g.drawString(第+step+步,400,90);g.drawString(用鍵盤上的R重新開始,Q退出游戲,200,565);g.drawString(用鍵盤pageup,pagedown切換關(guān)卡,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, 恭喜你過關(guān)了!);/鍵盤事件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);/按鈕事件監(jiān)聽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) /下一關(guān)back_stack.clear();step=0;level+;if(level!=14)map_level=new map(level);getmap(map);current_

28、level=第+level+關(guān);repaint();else if(e.getSource()=previous) /上一關(guān)back_stack.clear();step=0;level-;if(level!=0)map_level=new map(level);getmap(map);current_level=第+level+關(guān);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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論