1.如何用Java语言写一个贪吃蛇游戏
设计游戏,首先就要设计界面。
首先看一下我设计的一个界面。界面分为左边的游戏区与右边的控制区。
游戏区包含“得分信息”和贪吃蛇的游戏区,右边控制区有“开始”“暂停”“停止”按钮,等级选择单选框以及游戏排行榜。所以我们需要定义swing组件,并在类初始化时初始化这些组件,添加组件。
因为后面设计游戏的时候,我们要确切知道游戏区的大小,所以这里设置游戏区固定大小值。本来想用布局来更好的管理,但作者对布局也掌握不够,所以就先设置固定大小吧。
定义我们的游戏。贪吃蛇游戏其实就是包含很多细小网格,然后蛇在网格中移动。
蛇由一连串的网格组成,为了视觉效果,蛇身用蓝色标记,食物用红色标记,背景白色。如第一张图片所示。
所以,我们需要定义二维数组,保存网格信息,保存蛇身和食物的位置信息等。初始化时,还需要添加键盘事件控制上下左右移动。
食物的位置信息是二维的,所以我简单定义了一个类用来保存二维信息。接着就是实现游戏的功能了。
开始,暂停,停止按钮添加事件控制游戏开始。等级按钮定义游戏难度等。
开始游戏后,我们定义一个定时器。蛇身按照指定的方向移动,方向是通过初始化时添加的键盘事件,键盘的上下左右按钮来控制。
蛇身是连续的位置信息,保存到队列中,所以蛇身的移动就是队首增加一个位置,队尾减少位置,然后重新绘画游戏区就可以了。在蛇身移动时进一步做吃掉食物、撞墙、撞到自己的处理。
这是游戏的主要逻辑。最后,游戏结束我们弹出一个对话框提示是否保存游戏得分。
我们制作了排行榜信息,只保留前10名的游戏得分。首先定义了一个实现Comparable接口的游戏得分类,按得分高,时间最早来排序。
游戏结束时保存得分信息,看是否进入到排行榜中。而之前在初始化排行榜组件时就会加载游戏排行榜信息。
通过保存和读取排行榜信息,我们也熟悉一下文件读取操作,还有集合、排序算法的功能。
2.最简单的贪吃蛇代码
你要java的还是什么类型的 三个文件,楼主看好:运行可以,但是并不能鼓吹是一个具有好的风格的代码,。
//文件一 package greedysnake_cx; public class Node { int x=0; int y=0; int nodewidth; int nodeheight; Node(int x,int y){ this.x=x; this.y=y; } }//文件二 package greedysnake_cx;//定义snake的模型 import java.util.*; import javax.swing.*; public class SnakeModel implements Runnable { private GreedSnake gs;//给每一个矩阵点确立一个boolean值 boolean[][] matrix; private int maxX; private int maxY;//设置一个节点的列表;linkedList nodeArray = new linkedList(); Node food=null; int direction=UP; int score=0;//定义方向 public final static int LEFT=1; public final static int UP=2; public final static int RIGHT=3; public final static int DOWN=4; private int interval=200; //停顿时间的间隔 boolean pause=false; //定义暂停 private double speedRate=0.5; //定义速度的变更幅度 //constructor public SnakeModel(GreedSnake gs,int maxx,int maxy){ this.gs=gs; this.maxX=maxx; this.maxY=maxy; //this.matrix=null; //////////////////////////////////////////////////////////////////// //init matrix[][]; matrix=new boolean[maxX][]; / } //获取当前游戏得分 public int getScore(){ return this.score; }//加速 public void speedUp(){ interval*=speedRate; }//减速 public void speedDown(){ interval/=speedRate; }//设置暂停 public void chagePause(){ pause=!pause; }//设置方向 public void chageDirection(int newdirection){ if(direction % 2 != newdirection % 2){ direction=newdirection; } }//生成食物 private Node createFood() { Random random=new Random(); int foodx=random.nextInt(maxX); int foody=random.nextInt(maxY); Node food=new Node(foodx,foody); return food; } }//文件三 package greedysnake_cx; import javax.swing.*; import java.awt。
3.求高手现编一个JAVA贪食蛇
import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Collection;import java.util.Iterator;import java.util.linkedList;import java.util.Random;import java.util.Timer;import java.util.TimerTask;import javax.swing.JButton;import javax.swing.Jframe;import javax.swing.JPanel;public class SnakeGame extends Jframe { public SnakeGame(){ this.setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE); gamePanel=new MyPanel(); Dimension size=gamePanel.getPreferredSize(); this.setSize(size.width+6,size.height+56); this.add(gamePanel,BorderLayout.CENTER); newGame=new JButton("New Game"); newGame.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ gamePanel.newGame(); } }); newGame.addKeyListener(listener); this.add(newGame,BorderLayout.SOUTH); } public static void main(String[] args){ new SnakeGame().setVisible(true); } private JButton newGame; private MyPanel gamePanel; private KeyListener listener=new KeyListener(){ @Override public void keyPressed(KeyEvent e) { int code=e.getKeyCode(); if(code==KeyEvent.VK_UP){ gamePanel.move(Snake.up); } else if(code==KeyEvent.VK_RIGHT){ gamePanel.move(Snake.right); } else if(code==KeyEvent.VK_LEFT){ gamePanel.move(Snake.left); } else if(code==KeyEvent.VK_DOWN){ gamePanel.move(Snake.down); } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } };}class MyPanel extends JPanel { public MyPanel(){ food=this.getFoodPoint(snake.getBody()); } public void paintComponent() { Graphics g=this.getGraphics(); if(g==null) return; //clear g.clearRect(0, 0, this.getWidth(), this.getHeight()); //draw the border g.setColor(Color.BLACK); for(int i=0;iinkedList body=snake.getBody(); Point head=body.get(0); g.setColor(Color.ORANGE); g.fillRect(head.x*SIZE.width, head.y*SIZE.height, SIZE.width, SIZE.height); g.setColor(Color.GREEN); for(int i=1;i<body.size();i++){ Point p=body.get(i); g.fillRect(p.x*SIZE.width, p.y*SIZE.height, SIZE.width, SIZE.height); } //draw text if(gameOver){ g.setColor(Color.BLUE); Dimension size=this.getPreferredSize(); String s="Game Over"; Font f=new Font(g.getFont().getName(),Font.BOLD,32); g.setFont(f); FontMetrics fm=g.getFontMetrics(f); int length=fm.stringWidth(s); int height=fm.getHeight(); int x=(size.width-length)/2; int y=(size.height-height)/2; g.drawString(s, x, y); } } public Dimension getPreferredSize(){ return new Dimension((WIDTH+2)*SIZE.width,(HEIGHT+2)*SIZE.height); } public Point getFoodPoint(Collection except) { Random random = new Random(); int x = random.nextInt(30)+1; int y = random.nextInt(30)+1; Point result=new Point(x,y); boolean has=false; while(true){ Iterator iter=except.iterator(); while(iter.hasNext()){ if(iter.next().equals(result)){ has=true; break; } } if(!has) break; x = random.nextInt(30); y = random.nextInt(30); result=new Point(x,y); has=false; } return new Point(x, y); } public void newGame(){ if(timer!=null) timer.cancel(); gameOver=false; snake.setBody(new Point[] { new Point(10, 10), new Point(10, 11), new Point(10, 12), new Point(10, 13) }); snake.setTowards(Snake.up); food=this.getFoodPoint(snake.getBody()); timer=new Timer(); timer.schedule(new TimerTask(){ public void run(){ move(snake.getTowards()); } }, 500, 500); paintComponent(); } public void move(int towards){ if(gameOver) return; Boolean r=MyPanel.snake.move(towards,food); if(r==null) return; linkedList body=snake.getBody(); if(r) food=this.getFoodPoint(body); Point head=body.get(0); boolean over=false; for(int i=1;i<body.size();i++){ if(head.equals(body.get(i))){ System.out.println(head+""+i+body.get(i)); over=true; break; } } if(!over){ if(head.x<1||head.y<1||head.x>WIDTH||head.y>HEIGHT) over=true; } if(over){ gameOver=true; timer.cancel(); paintComponent(); return; } paintComponent(); } private static final int WIDTH = 30; private static fina。
4.求《贪食蛇》源代码 (Java编写的)
建三个类,放在同一个包里,三个类如下:第一个:public class Node { int x=0; int y=0; int nodewidth; int nodeheight; Node(int x,int y){ this.x=x; this.y=y; }}第二个:import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class GreedSnake implements KeyListener{ Canvas canvas; private JLabel jlabel; private JPanel jpanel; private Jframe jframe; SnakeModel snakemodel; private final static int canvaswidth=400; private final static int canvasheight=300; private final static int nodewidth=10; private final static int nodeheight=10; //construction GreedSnake(){ jframe=new Jframe("The Greed Sanke!"); jframe.setLayout(new BorderLayout()); Container cp=jframe.getContentPane(); jlabel=new JLabel("welcome"); jlabel.setText("Welcome my friend! Enjoy your self!"); cp.add(jlabel,BorderLayout.NORTH); canvas=new Canvas(); canvas.setSize(canvaswidth,canvasheight); canvas.addKeyListener(this); cp.add(canvas,BorderLayout.CENTER); jpanel=new JPanel(); jpanel.setLayout(new BorderLayout()); JLabel label=new JLabel("Pass enter or 'r' or 's' to start",JLabel.CENTER); jpanel.add(label,BorderLayout.NORTH); JLabel label2=new JLabel("Pass space to pause this game!",JLabel.CENTER); jpanel.add(label2,BorderLayout.CENTER); JLabel label3=new JLabel("Pass pageUp or pageDown to up or down the speed of the snake!",JLabel.CENTER); jpanel.add(label3,BorderLayout.SOUTH); cp.add(jpanel,BorderLayout.SOUTH); jframe.addKeyListener(this); jframe.pack(); jframe.setVisible(true); jframe.setResizable(false); jframe.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); begin(); }//end construction public void begin(){ snakemodel=new SnakeModel(this,canvaswidth/nodewidth,canvasheight/nodeheight); (new Thread(snakemodel)).start(); } void repaint(){ int score=snakemodel.getScore(); jlabel.setText("您的得分是:"+score); Graphics g=canvas.getGraphics();///pay attention! g.setColor(Color.white); g.fillRect(0, 0, canvaswidth, canvasheight); g.setColor(Color.blue); linkedList list=snakemodel.nodeArray; for(int i=0;iport java.util.*;import javax.swing.*;public class SnakeModel implements Runnable { private GreedSnake gs; //给每一个矩阵点确立一个boolean值 boolean[][] matrix; private int maxX; private int maxY; //设置一个节点的列表; linkedList nodeArray = new linkedList(); Node food=null; int direction=UP; int score=0; //定义方向 public final static int LEFT=1; public final static int UP=2; public final static int RIGHT=3; public final static int DOWN=4; private int interval=200; //停顿时间的间隔 boolean pause=false; //定义暂停 private double speedRate=0.5; //定义速度的变更幅度 //constructor public SnakeModel(GreedSnake gs,int maxx,int maxy){ this.gs=gs; this.maxX=maxx; this.maxY=maxy; //this.matrix=null; //////////////////////////////////////////////////////////////////// //init matrix[][]; matrix=new boolean[maxX][]; / public static void main(String[] args) { // TODO Auto-generated method stub new MyWindow(); } } class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口 { Button snake[]; //定义蛇按钮 int shu=0; //蛇的节数 int food[]; //食物数组 boolean result=true; //判定结果是输 还是赢 Thread thread; //定义线程 static int weix,weiy; //食物位置 boolean t=true; //判定游戏是否结束 int fangxiang=0; //蛇移动方向 int x=0,y=0; //蛇头位置 MyPanel() { setLayout(null); snake=new Button[20]; food=new int [20]; thread=new Thread(this); for(int j=0;j<20;j++) { food[j]=(int)(Math.random()*99);//定义20个随机食物 } weix=(int)(food[0]*0.1)*60; //十位*60为横坐标 weiy=(int)(food[0]%10)*40; //个位*40为纵坐标 for(int i=0;i<20;i++) { snake[i]=new Button(); } add(snake[0]); snake[0].setBackground(Color.black); snake[0].addKeyListener(this); //为蛇头添加键盘监视器 snake[0].setBounds(0,0,10,10); setBackground(Color.cyan); } public void run() //接收线程 { while(t) { if(fangxiang==0)//向右 { try { x+=10; snake[0].setLocation(x, y);//设置蛇头位置 if(x==weix&&y==weiy) //吃到食物 { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); //重绘下一个食物 add(snake[shu]); //增加蛇节数和位置 snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); //睡眠100ms } catch(Exception e){} } else if(fangxiang==1)//向左 { try { x-=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } else if(fangxiang==2)//向上 { try { y-=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } else if(fangxiang==3)//向下 { try { y+=10; snake[0].setLocation(x, y); if(x==weix&&y==weiy) { shu++; weix=(int)(food[shu]*0.1)*60; weiy=(int)(food[shu]%10)*40; repaint(); add(snake[shu]); snake[shu].setBounds(snake[shu-1].getBounds()); } thread.sleep(100); } catch(Exception e){} } int num1=shu; while(num1>1)//判断是否咬自己的尾巴 { if(snake[num1].getBounds().x==snake[0].getBounds().x&&snake[num1].getBounds().y==snake[0].getBounds().y) { t=false; result=false; repaint(); } num1--; } if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙 { t=false; result=false; repaint(); } int num=shu; while(num>0) //设置蛇节位置 { snake[num].setBounds(snake[num-1].getBounds()); num--; } if(shu==15) //如果蛇节数等于15则胜利 { t=false; result=true; repaint(); } } } public void keyPressed(KeyEvent e) //按下键盘方向键 { if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键 { if(fangxiang!=1)//如果先前方向不为左 fangxiang=0; } else if(e.getKeyCode()==KeyEvent.VK_LEFT) { if(fangxiang!=0) fangxiang=1; } else if(e.getKeyCode()==KeyEvent.VK_UP) { if(fangxiang!=3) fangxiang=2; } else if(e.getKeyCode()==KeyEvent.VK_DOWN) { if(fangxiang!=2) fangxiang=3; } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void paint(Graphics g) //在面板上绘图 { int x1=this.getWidth()-1; int y1=this.getHeight()-1; g.setColor(Color.red); g.fillOval(weix, weiy, 10, 10);//食物 g.drawRect(0, 0, x1, y1); //墙 if(t==false&&result==false) g.drawString("GAME OVER!", 250, 200);//输出游戏失败 else if(t==false&&result==true) g.drawString("YOU WIN!", 250, 200);//输出游戏成功 } } class MyWindow extends frame implements ActionListener//自定义窗口类 { MyPanel my; Button btn; Panel panel; MyWindow() { super("GreedSnake"); my=new MyPanel(); btn=new Button("begin"); panel=new Panel(); btn.addActionListener(this); panel.add(new Label("begin后请按Tab键选定蛇")); panel.add(btn); panel.add(new Label("按上下左右键控制蛇行动")); add(panel,BorderLayout.NORTH); add(my,BorderLayout.CENTER); setBounds(100,100,610,500); setVisible(true); validate(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e)//按下begin按钮 { if(e.getSource()==btn) { try { my.thread.start(); //开始线程 my.validate(); } catch(Exception ee){} } } }希望对你能有所帮助。