如何使用Java实现经典游戏推箱子

如何使用Java实现经典游戏推箱子

这篇文章将为大家详细讲解有关如何使用Java实现经典游戏推箱子,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    主要设计

    1、游戏面板生成显示

    2、地图生成算法

    3、人物移动算法

    4、播放背景音乐

    5、箱子移动算法

    6、全部箱子移动到指定位置,才算游戏过关

    功能截图

    游戏开始

    移动效果

    游戏过关

    代码实现

    核心类

    publicclassGameFrameextendsJFrameimplementsActionListener,MouseListener,KeyListener{//实现动作事件监听器、鼠标事件监听器、键盘事件监听器//当前的关卡数,默认为第一关,从1开始计数privateintgrade=1;//row,column记载人的位置,分别表示二维数组中的行号和列号,即map[row][column]确定人的位置privateintrow=7,column=7;//leftX,leftY记载左上角图片的位置,避免图片从(0,0)坐标开始,因为是图片填充,从(0,0)开始不行privateintleftX=50,leftY=50;//记载地图的总共有多少行、多少列privateintmapRow=0,mapColumn=0;//记载屏幕窗口的宽度和高度privateintwidth=0,height=0;privatebooleanacceptKey=true;//程序所需要用到的图片privateImagepics[]=null;//图片数据privatebyte[][]map=null;//地图数据privateArrayListlist=newArrayList();privateSoundPlayerUtilsoundPlayer;//播放声音工具类/*常量,即游戏中的资源*/privatefinalstaticintWALL=1;//墙privatefinalstaticintBOX=2;//箱子privatefinalstaticintBOX_ON_END=3;//放到目的地的箱子privatefinalstaticintEND=4;//目的地privatefinalstaticintMAN_DOWN=5;//向下的人privatefinalstaticintMAN_LEFT=6;//向左的人privatefinalstaticintMAN_RIGHT=7;//向右的人privatefinalstaticintMAN_UP=8;//向上的人privatefinalstaticintGRASS=9;//通道privatefinalstaticintMAN_DOWN_ON_END=10;//站在目的地向下的人privatefinalstaticintMAN_LEFT_ON_END=11;//站在目的地向左的人privatefinalstaticintMAN_RIGHT_ON_END=12;//站在目的地向右的人privatefinalstaticintMAN_UP_ON_END=13;//站在目的地向上的人privatefinalstaticintMOVE_PIXEL=30;//表示每次移动30像素/***在构造方法GameFrame0中,调用initMap()法来初始化本关grade游戏地图,清空悔棋信*息列表list,同时播放MIDI背景音乐。*/publicGameFrame(){//游戏窗口的一些基本设置setTitle("推箱子游戏");setSize(600,600);setVisible(true);setLocation(300,20);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ContainercontentPane=getContentPane();contentPane.setLayout(null);contentPane.setBackground(Color.black);//其他设置,初始化窗口的宽度和高度赋值给width和heightthis.width=getWidth();this.height=getHeight();//初始化图片资源getPics();//初始化地图数据initMap();//注册事件监听器setFocusable(true);addKeyListener(this);addMouseListener(this);//播放音乐initSound();}/***initMap()方法的作用是初始化本关grade游戏地图,清空悔棋信息列表list。调用*getMapSizeAndPosition(方法获取游戏区域大小及显示游戏的左上角位置(leftX,leftY)。*/publicvoidinitMap(){//获取当前关卡的地图数据map=MapFactory.getMap(grade);//清除上一关保存的回退地图数据,即清空list集合的内容list.clear();//初始化地图行列数和左上角起始坐标位置getMapSizeAndPosition();//获取角色的坐标位置getManPosition();}/***getManPosition()方法的作用是获取工人的当前位置(row,column)。*/publicvoidgetManPosition(){//即遍历地图数组map中存在那个值等于MANXXX(MAN_DOWN表示向下的人;MAN_UP表示向上的人)的情况,即表示该位置是人站立的位置,这个由地图数据扫描得出for(inti=0;i0){//如果要撤销,必须要走过//考虑用栈更合适MappriorMap=(Map)list.get(list.size()-1);this.map=priorMap.getMap();this.row=priorMap.getManX();this.column=priorMap.getManY();repaint();//重新画图list.remove(list.size()-1);}else{displayToast("不能再撤销了!");}}else{displayToast("此关已完成,不能撤销!");}}/***实现下一关的初始化,并且调用repaint()方法显示游戏界面*/publicvoidnextGrade(){//初始化下一关的数据if(grade>=MapFactory.getCount()){displayToast("恭喜你完成所有关卡!");acceptKey=false;}else{//关卡数加1grade++;//初始化下一关的地图数据initMap();//重新绘制画面repaint();acceptKey=true;}}/***实现上一关初始化并且调用repaint()发显示游戏界面*/publicvoidpriorGrade(){grade--;acceptKey=true;if(grade<0){grade=0;}initMap();repaint();}}

    声音播放类

    publicclassSoundPlayerUtil{publicFilefile;publicAudioInputStreamstream;publicAudioFormatformat;DataLine.Infoinfo;Clipclip;/***加载声音文件,支持wav、mp3等声音文件**@paramfilePath声音文件的路径*/publicvoidloadSound(StringfilePath){file=newFile(filePath);try{stream=AudioSystem.getAudioInputStream(file);}catch(UnsupportedAudioFileException|IOExceptione){e.printStackTrace();}format=stream.getFormat();}/***播放音乐**@paramisLoop表示是否循环播放音乐,如果传入的是true则表示循环播放*/publicvoidplaySound(booleanisLoop){info=newDataLine.Info(Clip.class,format);try{clip=(Clip)AudioSystem.getLine(info);clip.open(stream);}catch(LineUnavailableException|IOExceptione){e.printStackTrace();}if(isLoop){clip.loop(Clip.LOOP_CONTINUOUSLY);//添加该句代码可以循环播放}clip.start();}}

    关于“如何使用Java实现经典游戏推箱子”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    发布于 2022-02-15 20:43:00
    分享
    海报
    65
    上一篇:怎么为WPF框架Prism注册Nlog日志服务 下一篇:.NET Core如何使用Worker Service创建服务
    目录

      忘记密码?

      图形验证码