this is the interface:



This is the source code:

/*** @(#)GreedSnake.java**现在还有两个问题没有结局,一个是加速问题,食物会消失,范围*吃到的食物没有有可能不会加到末端,原因在于吃到食物的一瞬间,必须迅速添加结点,否则,会偏移*这样一个有些的缺点是每个蛇结点都是一个线程,开销比较大* @author * @version 1.00 2019/4/4*/
package com.view.test;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;public class GreedSnake extends JFrame {public GreedSnake() {MyPanel mp=new MyPanel();Thread t=new Thread(mp);t.start();this.addKeyListener(mp);this.add(mp);this.setSize(600,400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public static void main(String[] args){GreedSnake gs=new GreedSnake();}public void actionPerformed(ActionEvent e){}}
class MyPanel extends JPanel implements KeyListener,Runnable{boolean gameOver=false;Food food=null;Snake snake=null;Node node=null;Thread t=null;Vector<Node> vn=new Vector<Node>();Vector<Snake> vs=new Vector<Snake>();public MyPanel(){//初始化产生一个食物food=new Food(60,60);//初始化产生十个蛇结点,便于调测蛇的移动snake=new Snake(200,100,3);Thread t=new Thread(snake);t.start();vs.add(snake);}public void paint(Graphics g){   super.paint(g);g.fillRect(0,0,600,400);g.setColor(Color.red);g.fillOval(food.getX(),food.getY(),20,20);g.setColor(Color.green);for(int i=0;i<600/20;i++)g.drawLine(i*20, 0, i*20, 400);for(int i=0;i<400/20;i++)g.drawLine(0, i*20, 600, i*20);g.setColor(Color.blue);for(int i=0;i<vs.size();i++)g.fillOval(vs.get(i).getX(), vs.get(i).getY(), 20, 20);if(gameOver=GameOver()){Font myFont=new Font("仿宋",Font.ITALIC,80);g.setFont(myFont);g.setColor(Color.yellow);g.drawString("游戏结束!", 200, 200);}}
public void eatFood(){System.out.println(food.getX()+""+food.getY());System.out.println(vs.get(0).getX());if((vs.get(0).getX()==food.getX())&& (vs.get(0).getY()==food.getY())){int x=(int)(Math.random()*580);x-=x%20+20;int y=(int)(Math.random()*380);y-=y%20+20;System.out.println("food location"+x+","+y);food=new Food(x,y);//根据蛇尾的方向,增加新的蛇结点,每个蛇节点都是一个线程,方向跟随蛇尾方向switch((vs.get(vs.size()-1)).getDirect()){case 1:snake=new Snake(vs.lastElement().getX(),vs.lastElement().getY()+20,1);t=new Thread(snake);t.start();vs.add(snake);break;case 2:snake=new Snake(vs.lastElement().getX(),vs.lastElement().getY()-20,2);t=new Thread(snake);t.start();vs.add(snake);break;case 3:snake=new Snake(vs.lastElement().getX()+20,vs.lastElement().getY(),3);t=new Thread(snake);t.start();vs.add(snake);break;case 4:snake=new Snake(vs.lastElement().getX()-20,vs.lastElement().getY(),4);t=new Thread(snake);t.start();vs.add(snake);break;}System.out.println("eatfood");}}
public void Move(){for(int i=0;i<vn.size();i++){for(int j=0;j<vs.size();j++){if(vs.get(j).getX()==vn.get(i).getX() && vs.get(j).getY()==vn.get(i).getY()){vs.get(j).setDirect(vn.get(i).getDirect());}}}//如果所有节点的方向一样,我就把所有转向点去除for(int i=0;i<vs.size();i++){if(vs.get(i).getDirect()==vs.get(0).getDirect()){continue;}else{return;}}vn.removeAllElements();System.out.println("vn.size:"+vn.size());}
public boolean GameOver(){boolean Gameover=false;for(int i=1;i<vs.size();i++){if(vs.get(i).getX()==vs.get(0).getX() && vs.get(i).getY()==vs.get(0).getY()){Gameover=true;}}if(vs.get(0).getX()>600 ||vs.get(0).getX()<0 ||vs.get(0).getY()>400 ||vs.get(0).getY()<0){Gameover=true;}return Gameover;}
public void keyReleased(KeyEvent e){}public void keyTyped(KeyEvent e){}public void keyPressed(KeyEvent e){   //按下方向键,设置蛇头方向//其实头的方向也没有必要设置,只要设置转向点就可以了//如果有不止一个蛇结点,就有必要在转向时设置转向点//其实也没有必要,只有一个结点的时候,增加了的转向点在后面的操作中会很快将其删除if(e.getKeyCode()==KeyEvent.VK_UP){    vs.get(0).setDirect(1);}else if(e.getKeyCode()==KeyEvent.VK_DOWN){vs.get(0).setDirect(2);}else if(e.getKeyCode()==KeyEvent.VK_LEFT){vs.get(0).setDirect(3);}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){vs.get(0).setDirect(4);}else if(e.getKeyCode()==KeyEvent.VK_A){snake.speed+=20;}node=new Node(vs.get(0).getX(),vs.get(0).getY(),vs.get(0).getDirect());vn.add(node);}
public void run(){while(true){try{Thread.sleep(200); }catch(Exception e){e.printStackTrace();}//面板线程只负责重绘,不参与吃和移动,吃和移动是蛇的属性this.repaint();eatFood();Move();}}
}
class Snake implements Runnable
{int x;int y;int speed=20;int direct;//规定:1向上 2向下 3向左 4向右public Snake(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}public int getX(){return x;}public void setX(int x){this.x=x;}public int getY(){return y;}public void setY(int y){this.y=y;}public int getSpeed(){return speed;}public void setSpeed(int speed){this.speed=speed;}public int getDirect(){return direct;}public void setDirect(int direct){this.direct=direct;}
public void run(){//蛇之所以能移动的关键在于此线程while(true){try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}switch(direct){case 1:y-=speed;break;case 2:y+=speed;break;case 3:x-=speed;break;case 4:x+=speed;break;}}}
}
class Node{int x;int y;int direct;public Node(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getDirect(){return direct;}public void setDirect(int direct){this.direct=direct;}}
class Food{int x;int y;public Food(int x,int y){this.x=x;this.y=y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}
}

Java Greedy Snake, need to be updated相关推荐

  1. Smzzl with Greedy Snake 模拟-贪心-阅读理解

    题意 : 给出n个食物及坐标,必须按顺序吃掉,且只有在吃掉一个后,才会出现下一个. 从(x, y)出发,沿着d方向,每次可以前进或者顺时针或者逆时针转90度,用时都为1,求构造用时最少的方案并记录方案 ...

  2. 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)Smzzl with Greedy Snake “小“模拟

  3. Java开发贪吃蛇小游戏

    Java开发贪吃蛇小游戏 文章目录 Java开发贪吃蛇小游戏 一.开发思路 二.具体开发过程 1.绘制静态游戏窗口 2.导入素材图标 3.绘制游戏面板 4.绘制一条静态的小蛇 5.让小蛇动起来 ①监听 ...

  4. JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--贪吃蛇

    作者:雷神 QQ:38929568 QQ群:28048051JAVA游戏编程(满) 28047782(将满) 与前一款扫雷比较,这个游戏多了一个 类,用来显示动画,也是蛇要吃的物品类, 也有了代码包, ...

  5. java自然排序_Java中的自然排序顺序字符串比较 - 是内置的吗?

    String实现了Comparable,这就是Java中的自然顺序(使用类似的接口进行比较).您可以将字符串放在TreeSet中,也可以使用Collections或Arrays类进行排序. 但是,在您 ...

  6. java 将依赖打包进lib_maven把依赖包拷贝到lib下

    标准web工程在eclipse中利用m2eclipse插件添加依赖管理后,在部署过程中没有将依赖的jar包自动拷贝到/WEB-INF/lib中. 参考了一些朋友的做法手动执行 mvn dependen ...

  7. Java 8功能教程– ULTIMATE指南(PDF下载)

    编者注:在本文中,我们提供了全面的Java 8功能教程. 自Java 8公开发布以来已经有一段时间了,所有迹象都表明这是一个非常重要的版本. 我们在Java Code Geeks处提供了大量教程,例如 ...

  8. c2java Greedy 之任务调度

    近期调试一个javaproject的时候,我遇到不是期望的输出结果时.是这么干的: A1凝视掉抛出的异常: A2加打印对照异常输入和正常输入. A3进一步加打印缩小范围. 事实上仅仅需:B1静下心来细 ...

  9. Java中的AtomicInteger

    Today we will look into AtomicInteger in Java. Atomic operations are performed in a single unit of t ...

  10. java 809 128 题_java 第809页

    三目条件运算公式为 x?y:z 其中x的运算结果为boolean类型,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值 例:String s=" ...

最新文章

  1. ROS kinetic安装、Kinect2驱动安装和配置
  2. 【洛谷 P4934】 礼物 (位运算+DP)
  3. oracle查询当前用户名下所有表
  4. eclipse的优化操作
  5. html网页设计插入音乐,背景音乐是如何插入的?-网页设计,HTML/CSS
  6. 为什么300多家创新企业都在建“物联网生态系统”?
  7. Firewald 防火墙使用手册
  8. wordpress 增加备案号
  9. 通过光纤收发器指示灯判断网络状态
  10. java获取中文首字母
  11. 华为智能家居app未能连接上远程云服务_华为智能家居APP上路由器离线怎么办_app无法管理路由器修复方法_全球下载...
  12. 原来小米手机电源键除了开关机,还隐藏这3大用法,真是厉害了
  13. 2549. 【NOIP2011模拟9.4】家庭作业 (Standard IO)
  14. layui 给table里面的添加图标_layui教程---table
  15. Android 应用进程保活APP常驻内存研究方案
  16. Win10电脑没有打开蓝牙的按钮怎么办?
  17. backface-visibility
  18. Adobe认证专访|003期:跨界摄影师,我眼中的世界与别人不一样
  19. 无法识别 移动固态硬盘_M.2固态硬盘不能识别怎么办 Bios开启CSM识别M.2固态硬盘方法...
  20. 鼠害对计算机硬件的影响,电脑机箱漏电对电脑硬件伤害大吗

热门文章

  1. 数据结构:邻接表法存储有向图
  2. python 操作MongoDB
  3. Deepin Linux 设置开机自动进入命令行模式
  4. 黑客们成功地在土豆上安装了Linux!
  5. 【转】进程死锁及解决方法
  6. 理解Netty中的Zero-copy
  7. linux终端黑绿字配色方案注意事项
  8. Linux.CommanlineTool.grep
  9. spring注解 annotation
  10. RedHat系统的Yum安装