




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
贪吃蛇源代码将Location、LocationRO、SnakeFrame、SnakeModel、SnakePanel放到命名为snake的文件夹里,主函数MainApp放到外面运行主函数即可实现。主函数package snake;import javax.swing.*;import snake.*;public class MainApp public static void main(String args) JFrame.setDefaultLookAndFeelDecorated(true);SnakeFrame frame=new SnakeFrame();frame.setSize(350,350);frame.setResizable(false);frame.setLocation(330,220);frame.setTitle(贪吃蛇);frame.setVisible(true);package snake;public class Location private int x;private int y;Location(int x,int y)this.x=x;this.y=y;int getX()return x; int getY()return y;void setX(int x)this.x=x;void setY(int y)this.y=y;public boolean equalOrRev(Location e)return (e.getX()=getX()&(e.getY()=getY()|(e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();public boolean equals(Location e)return(e.getX()=getX()&(e.getY()=getY();public boolean reverse(Location e)return (e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();package snake;public class LocationRO private int x;private int y;LocationRO(int x,int y)this.x=x;this.y=y;int getX()return x; int getY()return y;public boolean equalOrRev(LocationRO e)return (e.getX()=getX()&(e.getY()=getY()|(e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();public boolean equals(LocationRO e)return(e.getX()=getX()&(e.getY()=getY();public boolean reverse(LocationRO e)return (e.getX()=getX()&(e.getY()=-1*getY()|(e.getX()=-1*getX()&(e.getY()=getY();package snake;import java.awt.*;import java.awt.event.*;import javax.swing.*;class SnakeFrame extends JFrame implements ActionListenerfinal SnakePanel p=new SnakePanel(this);JMenuBar menubar=new JMenuBar();JMenu fileMenu=new JMenu(文件);JMenuItem newgameitem=new JMenuItem(开始);JMenuItem stopitem=new JMenuItem(暂停);JMenuItem runitem=new JMenuItem(继续);JMenuItem exititem=new JMenuItem(退出); /设置菜单JMenu optionMenu=new JMenu(设置); /等级选项 ButtonGroup groupDegree = new ButtonGroup(); JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem(初级); JRadioButtonMenuItem twoItem= new JRadioButtonMenuItem(中级); JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem(高级); JMenu degreeMenu=new JMenu(等级); JMenu helpMenu=new JMenu(帮助); JMenuItem helpitem=new JMenuItem(操作指南); final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem(显示网格); JLabel scorelabel; public JTextField scoreField; private long speedtime=200; private String helpstr = 游戏说明:n1 :方向键控制蛇移动的方向.+ n2 :单击菜单文件-开始开始游戏.+ n3 :单击菜单文件-暂停或者单击键盘空格键暂停游戏.+ n4 :单击菜单文件-继续继续游戏.+ n5 :单击菜单设置-等级可以设置难度等级.+ n6 :单击菜单设置-显示网格可以设置是否显示网格.+ n7 :红色为食物,吃一个得10分同时蛇身加长.+ n8 :蛇不可以出界或自身相交,否则结束游戏.; SnakeFrame() setJMenuBar(menubar); fileMenu.add(newgameitem); fileMenu.add(stopitem); fileMenu.add(runitem); fileMenu.add(exititem); menubar.add(fileMenu); oneItem.setSelected(true); groupDegree.add(oneItem); groupDegree.add(twoItem); groupDegree.add(threeItem); degreeMenu.add(oneItem); degreeMenu.add(twoItem); degreeMenu.add(threeItem); optionMenu.add(degreeMenu); / 风格选项 showGridItem.setSelected(true); optionMenu.add(showGridItem); menubar.add(optionMenu); helpMenu.add(helpitem); menubar.add(helpMenu);Container contentpane=getContentPane(); contentpane.setLayout(new FlowLayout();contentpane.add(p);scorelabel=new JLabel(得 分: );scoreField=new JTextField(0,15);scoreField.setEnabled(false);scoreField.setHorizontalAlignment(0);JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);oneItem.addActionListener(this); twoItem.addActionListener(this); threeItem.addActionListener(this); newgameitem.addActionListener(this); stopitem.addActionListener(this); runitem.addActionListener(this); exititem.addActionListener(this); helpitem.addActionListener(this); showGridItem.addActionListener(this);public void actionPerformed(ActionEvent e) try if(e.getSource()=helpitem) JOptionPane.showConfirmDialog(p,helpstr,操纵说明,JOptionPane.PLAIN_MESSAGE); else if(e.getSource()=exititem)System.exit(0); else if(e.getSource()=newgameitem)p.newGame(speedtime); else if(e.getSource()=stopitem)p.stopGame(); else if(e.getSource()=runitem)p.returnGame(); else if(e.getSource()=showGridItem)if(!showGridItem.isSelected()p.setBackground(Color.lightGray);elsep.setBackground(Color.darkGray); else if(e.getSource()=oneItem) speedtime=200; else if(e.getSource()=twoItem) speedtime=100; else if(e.getSource()=threeItem) speedtime=50; catch(Exception ee)ee.printStackTrace(); package snake;import java.util.*;import javax.swing.JOptionPane;public class SnakeModel private int rows,cols;/行列数private Location snakeHead,runingDiriction;/运行方向private LocationRO locRO;/LocationRO类数组private LinkedList snake,playBlocks;/蛇及其它区域块private LocationRO snakeFood;/目标食物private int gameScore=0; /分数private boolean AddScore=false;/加分 /获得蛇头public LocationRO getSnakeHead() return (LocationRO)(snake.getLast();/蛇尾public LocationRO getSnakeTail()return (LocationRO)(snake.getFirst();/运行路线public Location getRuningDiriction()return runingDiriction;/获得蛇实体区域public LinkedList getSnake()return snake;/其他区域public LinkedList getOthers()return playBlocks;/获得总分public int getScore()return gameScore;/获得增加分数public boolean getAddScore()return AddScore;/设置蛇头方向private void setSnakeHead(Location snakeHead)this.snakeHead=snakeHead; /获得目标食物public LocationRO getSnakeFood()return snakeFood;/随机设置目标食物private void setSnakeFood()snakeFood=(LocationRO)(playBlocks.get(int)(Math.random()*playBlocks.size();/移动private void moveTo(Object a,LinkedList fromlist,LinkedList tolist)fromlist.remove(a);tolist.add(a);/初始设置public void init()playBlocks.clear();snake.clear();gameScore=0; for(int i=0;irows;i+) for(int j=0;jcols;j+) playBlocks.add(locROij); /初始化蛇的形状 for(int i=4;i7;i+) moveTo(locRO4i,playBlocks,snake); /蛇头位置 snakeHead=new Location(4,6); /设置随机块 snakeFood=new LocationRO(0,0); setSnakeFood(); /初始化运动方向 runingDiriction=new Location(0,1); /Snake构造器public SnakeModel(int rows1,int cols1) rows=rows1; cols=cols1; locRO=new LocationROrowscols; snake=new LinkedList(); playBlocks=new LinkedList(); for(int i=0;irows;i+) for(int j=0;jcols;j+) locROij=new LocationRO(i,j); init(); /*定义布尔型move方法,如果运行成功则返回true,否则返回false*参数direction是Location类型,*direction 的值:(-1,0)表示向上;(1,0)表示向下;*(0,-1)表示向左;(0,1)表示向右;*/public boolean move(Location direction)/判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)snakeHead.setX(snakeHead.getX()+runingDiriction.getX();snakeHead.setY(snakeHead.getY()+runingDiriction.getY();elsesnakeHead.setX(snakeHead.getX()+direction.getX();snakeHead.setY(snakeHead.getY()+direction.getY();/如果蛇吃到了目标食物tryif (snakeHead.getX()=snakeFood.getX()&(snakeHead.getY()=snakeFood.getY()moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);setSnakeFood();gameScore+=10;AddScore=true;elseAddScore=false;/是否出界if(snakeHead.getX()rows)&(snakeHead.getY()=0&(snakeHead.getY()=0)/如果不出界,判断是否与自身相交if(snake.contains(locROsnakeHead.getX()snakeHead.getY()/如果相交,结束游戏JOptionPane.showMessageDialog(null, Game Over!, 游戏结束, JOptionPane.INFORMATION_MESSAGE);return false;else/如果不相交,就把snakeHead加到snake里面,并且把尾巴移出moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);else/出界,游戏结束JOptionPane.showMessageDialog(null, Game Over!, 游戏结束, JOptionPane.INFORMATION_MESSAGE);return false;catch(ArrayIndexOutOfBoundsException e)return false;/设置运行方向if (!(direction.reverse(runingDiriction)|direction.equals(runingDiriction)runingDiriction.setX(direction.getX();runingDiriction.setY(direction.getY();return true;package snake;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class SnakePanel extends JPanel implements Runnable,KeyListenerJFrame parent=new JFrame();private int row=20; /网格行数private int col=30; /列数private JPanel gridsPanel; /面板网格private Location direction;/方向定位private SnakeModel snake; /贪吃蛇private LinkedList snakeBody; /蛇的身体private LinkedList otherBlocks; /其他区域private LocationRO snakeHead; /蛇的头部private LocationRO snakeFood; /目标食物private Color bodyColor=Color.orange;/蛇的身体颜色private Color headColor=Color.black; /蛇的头部颜色private Color foodColor=Color.red; /目标食物颜色private Color othersColor=Color.lightGray;/其他区域颜色private int gameScore=0; /总分private long speed; /速度(难度设置)private boolean AddScore;/加分private Thread t; /线程private boolean isEnd; /暂停private static boolean notExit; /构造器,初始化操作public SnakePanel(SnakeFrame parent)this.parent=parent;gridsPanel=new JPanelrowcol;otherBlocks=new LinkedList();snakeBody=new LinkedList();snakeHead=new LocationRO(0,0);snakeFood=new LocationRO(0,0);direction=new Location(0,1); / 布局setLayout(new GridLayout(row,col,1,1);for(int i=0;irow;i+)for(int j=0;jcol;j+)gridsPanelij=new JPanel();gridsPanelij.setBackground(othersColor);add(gridsPanelij);addKeyListener(this); /开始游戏public void newGame(long speed)this.speed=speed;if (notExit) snake.init();elsesnake=new SnakeModel(row,col);notExit=true;t=new Thread(this);t.start();requestFocus();direction.setX(0);direction.setY(1);gameScore=0;updateTextFiled(+gameScore);isEnd=false; /暂停游戏public void stopGame()requestFocus();isEnd=true; /继续public void returnGame()requestFocus();isEnd=false; /获得总分public int getGameScore()return gameScore;/更新总分private void updateTextFiled(String str)(SnakeFrame)parent).scoreField.setText(str);/更新各相关单元颜色private void updateColors() / 设定蛇身颜色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()LocationRO t=(LocationRO)(i.next();gridsPanelt.getX()t.getY().setBackground(bodyColor);/设定蛇头颜色snakeHead=snake.getSnakeHead();gridsPanelsnakeHead.getX()snakeHead.getY().setBackground(headColor);/设定背景颜色otherBlocks=snake.getOther
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化教育职业技能鉴定考试综合练习及完整答案详解【有一套】
- 2024江苏省溧阳市中考数学复习提分资料附答案详解(达标题)
- 2025年海南省海口市美兰区白龙街道办事处关于招聘公益性岗位工作考前自测高频考点模拟试题及答案详解1套
- 计算机三级考前冲刺练习及答案详解(全优)
- 新能源汽车动力蓄电池与充电系统(微课版) 课件 任务4.1新能源汽车动力电池充电技术
- 2025年全国人大机关直属事业单位招聘18人笔试备考题库含答案详解
- 2023年吉林省图们市中考物理强化训练附答案详解【B卷】
- 子宫病变MR课件
- 2024-2025学年度国家电网招聘考试真题及参考答案详解(典型题)
- 2024-2025学年度自考专业(公共关系)能力检测试卷带答案详解(考试直接用)
- 2025房屋宅基地买卖合同
- 2025年浙江警务辅助人员招聘考试(写作)历年参考题库含答案详解
- 上饶市属国有企业2025年度第一批次公开招聘【105人】考试参考题库及答案解析
- (新版)《普速铁路工务安全规则》考试题库及答案(含各题型)
- 小儿腺病毒感染护理查房
- 毒品成瘾原因课件
- 2025年疾病预防控制中心招聘考试笔试试题含答案
- 金太阳福建省2025-2026学年高三上学期9月开学联考数学试卷
- 2025年甘肃政治高考试题及答案
- 三腔二囊管护理课件
- 商户维护与管理办法
评论
0/150
提交评论