贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
package game; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.LinkedList; import javax.swing.*; public class Snake extends JFrame { //食物 private Point point=new Point(); //蛇 private LinkedList<Point> list=new LinkedList<Point>(); private int key =37; //为食物和蛇的坐标进行初始化 public void init() { //默认食物输出化的位置 point.setLocation(100, 100); list.add(new Point(300,300)); list.add(new Point(310,300)); list.add(new Point(320,300)); list.add(new Point(330,300)); list.add(new Point(340,300)); list.add(new Point(350,300)); list.add(new Point(360,300)); //开始启用这个线程 new Thread(new MoveThread()).start(); } public void paint(Graphics g) { Image img=createImage(500,500); //用Graphics画笔类创建一个画笔来画出这个白布 Graphics g2=img.getGraphics(); //把游戏背景填充成白色 g2.setColor(Color.WHITE); //设置填充范围 g2.fillRect(0, 0, 500, 500); //把画笔移动到的位置 g2.translate(50, 50); //设置边框为红色(边框内为蛇能活动的范围) g2.setColor(Color.RED); g2.drawRect(0,0,400,400); //下面实现小蛇 g2.setColor(Color.GREEN); //蛇 获取List中的每一个点 for(int i=0;i<list.size();i++) { //下面来得到蛇的那些小点,后面两个参数是表示小方框的大小 //能在指定的位置画出蛇的位置 g2.fillRect(list.get(i).x,list.get(i).y, 10, 10); } //画食物 g2.setColor(Color.RED); g2.fillRect(point.x, point.y, 10, 10); g.drawImage(img, 0, 0, 500, 500, this); } public Snake() { //给游戏外边框添加标题(this就表示当前对象) this.setTitle("贪吃蛇"); //不能改变边框的大小 this.setResizable(false); //设施边框的大小 this.setSize(500, 500); //居中显示 this.setLocationRelativeTo(null); //当点击关闭时候程序停止 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置可见 this.setVisible(true); this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { //键盘的上下左右 if(e.getKeyCode()>=37&&e.getKeyCode()<=40) { if(Math.abs(key-e.getKeyCode())!=2) { key=e.getKeyCode(); } } } }); this.init(); } //内部类 实现线程 //写内部类是因为用线程的时候都都需要获取点的值来改变点的属性 class MoveThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(true) { try { Thread.sleep(150); }catch(InterruptedException e) { e.printStackTrace(); } //获取蛇的第一个点 Point p=list.getFirst().getLocation(); switch(key) {//37表示前行 case 37: p.x=p.x-10; break; case 38: p.y=p.y-10; break; case 39: p.x=p.x+10; break; case 40: p.y=p.y+10; break; } //判断游戏结束的两种方法 //1.蛇超出了边界 2.蛇头碰到蛇的身体 if(p.x<0||p.x>390||p.y<0||p.y>390||list.contains(p)) {//在上面的时候点就已经定位到50,50 JOptionPane.showMessageDialog(null, "游戏结束"); break; } list.addFirst(p); //当蛇吃掉食物后 马上生成新的食物 自身变长 if(p.equals(point)) { int x=(int)(Math.random()*40)*10; int y=(int)(Math.random()*40)*10; point.setLocation(x, y); }else { //删除最后一个点 list.removeLast(); } //调用画的方法 Snake.this.repaint(); } } } public static void main(String[] args) { // TODO Auto-generated method stub new Snake(); } }