下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 java语言贪吃蛇小游戏

java语言贪吃蛇小游戏.doc

java语言贪吃蛇小游戏

下一季陌上花开吧
2017-09-01 0人阅读 举报 0 0 暂无简介

简介:本文档为《java语言贪吃蛇小游戏doc》,可适用于综合领域

java语言贪吃蛇小游戏Java语言程序设计课程~年度第学期考核题目:贪吃蛇小游戏院系:计算机学院学号:,,,,,,姓名:叶文星任课教师:白明成绩评定:完成日期:年月日贪吃蛇设计思路:运用面向对象的思维把贪吃蛇分成两个主要的抽象类:蛇和地图蛇中又包含了蛇身蛇头蛇位置蛇运动蛇转向蛇吃食物蛇生长等类和对象。地图又包含了游戏界面食物刷新等类和对象。通过一一写出蛇和地图中每一个具体的对象然后调用这些类和对象以线程技术控制蛇和地图达到蛇在地图上可以运动觅食生长等效果~程序功能:次程序是个贪吃蛇小游戏实现的功能有生成一个地图界面生成一条由JButton组成会运动的蛇可以通过键盘updownleftright来控制蛇的运动方向可以在地图上随机生成食物蛇可以吞食食物来生长运用技术:javaxswingJButton(蛇身体的设计)蛇身由一个个JButton连续相连组成通过定义蛇身body为List<JButton>类型把JButton添加到body上形成类似蛇的身体。同时食物也是一个JButton当蛇吞食了JButton后只要把JButton也添加到body上就可以达到蛇生长的效果。如:publicShe(Mapmap){在地图中的蛇thismap=map蛇引入地图JButtonjl=newJButton()新建一个按钮jjlsetBounds(,,,)设置j的位置大小thisbodyadd(jl)蛇的身体添加按钮jthisadd()蛇身再添加j(下面操作一样共添加次j,让初始蛇身有个按钮的长度看起来像蛇)thisadd()thisadd()List接口中的add(Ee)方法:向列表的尾部添加指定的元素(非awt的方法)thisadd()}蛇身体publicList<JButton>body=newArrayList<JButton>()利用ArrayList类实例化List集合importjavaxswingJFrameJFramesetDefaultLookAndFeelDecorated(true)setDefaultCloseOperation(EXITONCLOSE)创建出一个图形化的有美丽边框的可关闭的图形化界面javaxswingJOptionPanejavaxswingJMenuBarjavaxswingJMenujavaxswingJMenuItemjavaxswingJRadioButtonMenuItemjavaxswingJCheckBoxMenuItem在JFrame框架的菜单栏上添加了菜单菜单项复选框单选框如:JMenuBarmenubar=newJMenuBar()新建菜单条thissetJMenuBar(menubar)往Map中添加菜单条menubarJMenumenu=newJMenu("帮助(A)")新建菜单menu并起标题名帮助(A)menusetMnemonic(KeyEventVKA)设置菜单menu热键menubaradd(menu)菜单条menubar中添加菜单menujavaawtPoint在地图界面上定位画出点的坐标(位置)食物的位置蛇的位置等javaawteventKeyEventjavaawteventKeyListenerjavaawteventActionEventjavaawteventActionListener监听键盘上的updownleftright键并通过动作事件来控制蛇的运动方向如:键盘监听classKeyEveimplementsKeyListener{publicvoidkeyPressed(KeyEvente){shegbFangXiang(e)}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){}javautilArrayListjavautilListjavautilRandom实现一种可以把JButton相连接想数组一样动态变化的类型多线程让蛇和地图实现Runnable接口构建两个线程类并为它们创建新线程tm和t实现两线程的交替控制如:publicvoidinit(){thissetFocusable(true)setFocusable(true)触键获焦点Shes=newShe(this)初始化蛇(新建蛇调用另一边蛇构造方法)this指地图thisshe=s把新建的蛇放在地图上吃食物Threadtm=newThread(this)新建属于this(地图)的名字为tm的线程tmstart()新建属于s(新建蛇)的名字为t的线程Threadt=newThread(s)tstart()}蛇的移动处理,首先确定移动的位置,在屏幕上清除当前蛇尾的显示,修改蛇尾为新的位置,并显示,把蛇尾作为新的蛇头这里还有一个需要注意处理的:根据按键处理移动时不可以反方向移动也就是说不可以直接后退如:(较长代码略)碰壁或者蛇头碰到蛇身处理方法墙壁可以随便使用表格线划出来蛇可移动的区域全部放空白。只要判断前面不是食物也不是空白,就算GameOver了。如:是否撞墙publicvoidiszq(){JButtontou=bodyget()if(tougetX()<||tougetX()>mapgetWidth()||tougetY()<||tougetY()>mapgetHeight()){mapgameover()return}else{for(inti=i<bodysize()i){intabs=Mathabs((tougetX()bodyget(i)getX()))intabs=Mathabs((tougetY()bodyget(i)getY()))if(abs<abs<){mapgameover()return}}}}完成情况:本程序在运行后能够正常的相应按键事件。利用键盘updownleftright键就可以实现操作。蛇前行的过程中可以任意向其左或右方向改变方向但按其前进方向和前进的反方向都没有反应。而蛇撞墙或碰到自己身体后都能实现正常gameover提示的死亡。地图上的食物可以正常随机刷新刷新后不会随着时间的过去而消失(除非被蛇吃了)蛇在吞食食物后也可以正常生长变长。运行结果如下图所示:图:正常运行图图:撞墙后死亡图源程序清单:略运行情况:如上图参考文献:Java程序设计与开发(张晓龙)源程序:mapjava贪吃蛇游戏应用程序importjavaawtColorimportjavaawtPointimportjavaawtevent**importjavaawteventKeyEventimportjavaawteventKeyListener*importjavaxswing**importjavaxswingJButtonimportjavaxswingJFrameimportjavaxswingJOptionPaneimportjavaxswingJMenuBarimportjavaxswingJMenuimportjavaxswingJMenuItemimportjavaxswingJRadioButtonMenuItemimportjavaxswingJCheckBoxMenuItem*importjavautilArrayListimportjavautilListimportjavautilRandom地图publicclassMapextendsJFrameimplementsRunnable{publicMap(){thissetLayout()Map布局为空thissetTitle("贪吃蛇游戏Makeby")thisaddKeyListener(newKeyEve())添加键盘监听器thissetBounds(,,,)thissetUndecorated(true)禁用或启用此窗体的装饰,只有在窗体不可显示时才调用此方法thissetVisible(true)JMenuBar横菜单条JMenu菜单JMenuItem菜单项JRadioButtonMenuItem单选框JCheckBoxMenuItem复选框JMenuBarmenubar=newJMenuBar()新建菜单条thissetJMenuBar(menubar)往Map中添加菜单条menubarJMenumenu=newJMenu("帮助(A)")新建菜单menu并起标题名帮助(A)menusetMnemonic(KeyEventVKA)设置菜单menu热键menubaradd(menu)菜单条menubar中添加菜单menu下面是菜单中的菜单项组JMenuItemmenuItem=newJMenuItem("菜单项one()",KeyEventVK)新建菜单项menuItem并起名字菜单项one()和设置热键menuItemsetAccelerator(KeyStrokegetKeyStroke(KeyEventVK,ActionEventCTRLMASK))设置菜单项menuItem快捷方式menuadd(menuItem)JMenuItemmenuItem=newJMenuItem("菜单项two()",KeyEventVK)新建菜单项menuItem并起名字菜单项two()和设置热键menuItemsetAccelerator(KeyStrokegetKeyStroke(KeyEventVK,ActionEventCTRLMASK))设置菜单项menuItem快捷方式menuadd(menuItem)menuaddSeparator()将默认大小的分隔符添加到工具栏的末尾JMenumenu=newJMenu("操作说明")新建菜单menu并起标题名操作说明menuadd(menu)菜单menu中添加菜单menuJMenuItemmenuItem=newJMenuItem("菜单项three()",KeyEventVK)新建菜单项menuItem并起名字菜单项three()和设置热键menuItemsetAccelerator(KeyStrokegetKeyStroke(KeyEventVK,ActionEventCTRLMASK))设置菜单项menuItem快捷方式menuadd(menuItem)下面是菜单中的菜单项组JMenumenu=newJMenu("单选框功能(B)")新建菜单menu并起标题名源代码(B)menusetMnemonic(KeyEventVKB)menubaradd(menu)ButtonGroupgroup=newButtonGroup()新建一个按钮组groupJRadioButtonMenuItemrbMenuItem声明一个单选按钮rbMenuItem(下面有函数重载)rbMenuItem=newJRadioButtonMenuItem("单选框")新建单选按钮rbMenuItem标题是单选框rbMenuItemsetSelected(true)初始化单选框为已选上groupadd(rbMenuItem)menuadd(rbMenuItem)rbMenuItem=newJRadioButtonMenuItem("单选框")groupadd(rbMenuItem)menuadd(rbMenuItem)下面是菜单中的菜单项组JMenumenu=newJMenu("复选框功能(C)")新建菜单menu并起标题名复选框功能(C)menusetMnemonic(KeyEventVKC)menubaradd(menu)JCheckBoxMenuItemcbMenuItem声明一个复选按钮cbMenuItem(下面有函数重载)cbMenuItem=newJCheckBoxMenuItem("复选框")menuadd(cbMenuItem)cbMenuItem=newJCheckBoxMenuItem("复选框")menuadd(cbMenuItem)下面是菜单中的菜单项组JMenumenu=newJMenu("源代码(D)")新建菜单menu并起标题名源代码(D)menusetMnemonic(KeyEventVKD)menubaradd(menu)}食物publicList<JButton>foods=newArrayList()生成食物坐标privatePointnewPoint(){Pointpoint=newPoint()Randomr=newRandom()pointx=(rnextInt(*))pointy=(rnextInt(*))returnpoint}创建食物publicvoidaddFood(){JButtonjl=newJButton()jlsetSize(,)设置大小jlsetLocation(newPoint())设置食物位置foodsadd(jl)}显示食物publicvoidshowFood(){for(inti=i<foodssize()i){thisgetContentPane()add(foodsget(i))JFrame方法getContentPane():返回此窗体的contentPane(内容面板)对象}}gameoverpublicvoidgameover(){thisfoods=thissetVisible(false)地图消失intr=JOptionPaneshowConfirmDialog(this,"是否继续")JOptionPane类中方法showConfirmDialog:询问一个确认问题如yesnocancelif(r==){Mapm=newMap()minit()}else{Systemexit()}}publicSheshepublicList<JButton>getFoods(){returnfoods}publicvoidsetFoods(List<JButton>foods){thisfoods=foods}键盘监听classKeyEveimplementsKeyListener{publicvoidkeyPressed(KeyEvente){shegbFangXiang(e)}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){}}publicvoidinit(){init(初始化)thissetFocusable(true)Component中setFocusable(booleanfocusable)的方法:将此Component的焦点状态设置为指定值View被显示时没有获得焦点就是说按键动作没有发送给View所以需要在构造函数中增加一句setFocusable(true)setFocusableInTouchMode(true)触屏获焦点setFocusable(true)触键获焦点Shes=newShe(this)初始化蛇(新建蛇调用另一边蛇构造方法)this指地图thisshe=s把新建的蛇放在地图上吃食物Threadtm=newThread(this)新建属于this(地图)的名字为tm的线程tmstart()Threadt=newThread(s)新建属于s(新建蛇)的名字为t的线程tstart()}publicvoidrun(){while(true){if(thisfoods==){return}try{addFood()showFood()thisupdate(thisgetGraphics())Threadsleep()}catch(InterruptedExceptione){TODOAutogeneratedcatchblockeprintStackTrace()}}}publicstaticvoidmain(Stringargs){主函数JFramesetDefaultLookAndFeelDecorated(true)生成一个十分漂亮的标题栏Mapm=newMap()minit()}}shejavaimportjavaawtPointimportjavaawteventKeyEventimportjavaawteventKeyListenerimportjavautilArrayListimportjavautilListimportjavaxswingJButton蛇publicclassSheimplementsRunnable{实现线程的Runnable接口publicShe(Mapmap){在地图中的蛇thismap=map蛇引入地图JButtonjl=newJButton()新建一个按钮jjlsetBounds(,,,)设置j的位置大小thisbodyadd(jl)蛇的身体添加按钮jthisadd()蛇身再添加j(下面操作一样共添加次j,让初始蛇身有个按钮的长度看起来像蛇)thisadd()thisadd()List接口中的add(Ee)方法:向列表的尾部添加指定的元素(非awt的方法)thisadd()}蛇身体publicList<JButton>body=newArrayList<JButton>()利用ArrayList类实例化List集合蛇方向privateStringfangXiang="右"定义蛇初始走的方向蛇当前位置privatePointtouWZ定义蛇当前位置类型为点蛇前一位置privatePointqianWZpublicbooleanbool=true定义一个布尔型bool赋初值为true前进publicvoidrun(){运行线程的固定写法里面是线程的运行内容while(bool){if(mapfoods==){return}qianWZ=newPoint()声明蛇头并赋初值JButtontou=bodyget()List接口中的get(intindex)方法:返回列表中指定位置的元素,get()是取得List的第一个对象得到当前位置touWZ=tougetLocation()publicPointgetLocation()方法:返回此点的位置存储前一位置qianWZx=touWZx蛇头位置赋给蛇头后面的蛇前一位置qianWZy=touWZy改变头的位置(GB改变)touGB(tou)调用改变头的位置函数身体其他部位跟上来for(inti=i<bodysize()i){List接口中的intsize()方法:返回列表中的元素数当前位置touWZ=bodyget(i)getLocation()List接口中的get(intindex)方法:返回列表中指定位置的元素放到前一位置bodyget(i)setLocation(qianWZ)还原前一位置qianWZx=touWZxqianWZy=touWZy}看看有没东西吃chi(lookFood())调用lookFood()函数add()iszq()调用是否撞墙函数iszq()try{run方法固定的trycatch格式Threadsleep()}catch(InterruptedExceptione){TODOAutogeneratedcatchblock这个是Eclipse自动生成的告诉你这个地方有东西可能需求处理,也可以当做标签来使用eprintStackTrace()}}}privateMapmap看看有没食物publicList<JButton>lookFood(){returnmapgetFoods()调用地图那边的getFoods()函数}改变头的位置publicvoidtouGB(JButtontou){if(fangXiangequals("上")){touWZy=touWZy正好是一个Button即j的长宽}elseif(fangXiangequals("下")){touWZy=touWZy}elseif(fangXiangequals("左")){List接口中的equals(Objecto)方法:比较指定的对象与列表是否相等touWZx=touWZx}elseif(fangXiangequals("右")){touWZx=touWZx}改变头的位置tousetLocation(touWZ)publicPointsetLocation()方法:设置此点的位置}改变头的方向publicvoidgbFangXiang(KeyEvente){参数是键盘监听所获得的事件eif(egetKeyCode()==(!fangXiangequals("上"))){如果监听得到的字符=(“下”的ASCII值)而且当前行走方向不等于“上”fangXiang="下"使头往下}if(egetKeyCode()==(!fangXiangequals("下"))){fangXiang="上"}if(egetKeyCode()==(!fangXiangequals("右"))){fangXiang="左"}if(egetKeyCode()==(!fangXiangequals("左"))){fangXiang="右"}}生长publicvoidadd(){JButtonmyjl=bodyget(bodysize())声明一个按钮myjl并赋初值JButtonjl=newJButton()jlsetBounds(myjlgetX(),myjlgetY(),myjlgetWidth(),myjlgetHeight())getX()是Point中方法bodyadd(jl)mapadd(jl)将新增的加入到map}吃东西publicvoidchi(List<JButton>foodList){if(foodList==){return}for(inti=i<foodListsize()i){JButtontou=bodyget()JButtonfood=foodListget(i)intabs=Mathabs(foodgetX()tougetX())intabs=Mathabs(foodgetY()tougetY())if(abs<abs<){add()foodListremove(food)remove(Objecto)List的方法foodsetVisible(false)}}}是否撞墙publicvoidiszq(){JButtontou=bodyget()if(tougetX()<||tougetX()>mapgetWidth()||tougetY()<||tougetY()>mapgetHeight()){mapgameover()return}else{for(inti=i<bodysize()i){intabs=Mathabs((tougetX()bodyget(i)getX()))intabs=Mathabs((tougetY()bodyget(i)getY()))if(abs<abs<){mapgameover()return}}}}}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/21

java语言贪吃蛇小游戏

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利