JAVA:贪吃蛇源代码

嘿嘿 新手来 表现了!!! 2019年结束

游戏截图:
在这里插入图片描述
在这里插入图片描述
文件布局:
在这里插入图片描述
代码分享

用到的一些全局变量

//全局变量
public class Global {public static final int RECT_WIDTH=20;//每个小方格的长宽public static final int WIDTH=30;//长    40个小方格public static final int HEIGHT=30;//宽   40个小方格public static int GRADE;//成绩public static long TIME;//时间public static File file;//文件夹
}

定义蛇类

public class Snake {private SnakeListener snakeListener;public static final int UP=1;public static final int DOWN=-1;public static final int LEFT=2;public static final int RIGHT=-2;//表示蛇运动的方向private int newdirction=RIGHT;private int olddirction=RIGHT;private Point tail;//存储蛇的尾巴public LinkedList<Point> body=new LinkedList<Point>();private Point p;//蛇的颜色private int x,y,z;private boolean suspendFlag = false;// 控制线程的执行private SnakeDriver sd=new SnakeDriver();public static boolean life=true;public Snake(){init();}//获取蛇的长度public int getlenght() {return body.size();}public void init() {int x=Global.WIDTH/2;int y=Global.HEIGHT/2;for(int i=0;i<3;i++) {p=new Point(x-i,y);//默认方向是向右的body.add(p);}}public void move() {
//		System.out.println("蛇在移动...");//去尾加头法实现蛇移动  首先要得到蛇头tail=body.removeLast();int x=getSnakehead().x;int y=getSnakehead().y;if(this.newdirction+this.olddirction!=0)this.olddirction=this.newdirction;    //控制方向不往反方向行走switch(olddirction) {case UP:y--;break;case DOWN:y++;break;case LEFT:x--;break;case RIGHT:x++;break;}body.addFirst(new Point(x,y));}//得到蛇头位置public Point getSnakehead() {return body.getFirst();}public void eatfood() {
//		System.out.println("蛇正在吃食物...");//怎么吃  就是将蛇的尾巴加回来  则用变量存储蛇的尾巴body.addLast(tail);}public void changedirction(int dirction) {this.newdirction=dirction;
//		System.out.println("正在改变方向...");}public boolean iseatself(Snake snake) {Point head=snake.getSnakehead();for(int i=1;i<body.size();i++){if(body.get(i).equals(head))return true;}return false;}public void drowMe(Graphics g) {
//		System.out.println("蛇正在画出自己...");//g.setColor(Color.blue);for(int i=0;i<body.size();i++) {x=(int) (Math.random()*256);y=(int) (Math.random()*256);z=(int) (Math.random()*256);Color color=new Color(x,y,z);g.setColor(color);g.fillRect(body.get(i).x*Global.RECT_WIDTH, body.get(i).y*Global.RECT_WIDTH, Global.RECT_WIDTH, Global.RECT_WIDTH);}}//增加了自定义的监听器public void addSnakeListener(SnakeListener snakeListener) {if(snakeListener!=null){this.snakeListener=snakeListener;}}public void start() {
//		new SnakeDriver().start();sd.start();}//得到线程对象public SnakeDriver getsd() {return sd;}//线程暂停public void suspend() {suspendFlag=true;}public class SnakeDriver extends Thread{//唤醒线程public synchronized void Rouse() {suspendFlag=false;notify();}@Overridepublic void run() {while(life){move();//每移动一次要判断是否吃到食物和墙snakeListener.snakeMove(Snake.this);//调用外部类的当前对象try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}synchronized(this) {while(suspendFlag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}}
}

定义食物类

public class Food {//定义两变量来存储food的位置private int x,y;public void drowMe(Graphics g) {
//		System.out.println("食物正在画出自己...");g.setColor(Color.red);g.fillRect(x*Global.RECT_WIDTH,y*Global.RECT_WIDTH, Global.RECT_WIDTH,Global.RECT_WIDTH);}public boolean iseatbysnake(Snake snake) {//怎么判断食物被蛇吃了  判断是否在同一位置Point head=snake.getSnakehead();Point p=new Point(x,y);if(p.equals(head))return true;return false;}//增加食物public void addFood(Point p) {x=p.x;y=p.y;}//设置food的位置public Point setloction() {int x=(int)(Math.random()*30)+1;int y=(int)(Math.random()*30)+1;return new Point(x,y);}
}

定义地图类

public class Map {private int[][] map=new int[Global.WIDTH+2][Global.HEIGHT+2];//存储边框的数据位置public Map() {for(int y=0;y<Global.HEIGHT+2;y++){for(int x=0;x<Global.WIDTH+2;x++){if(y==0||y==Global.HEIGHT+2-1)map[x][y]=1;if(x==0||x==Global.WIDTH+2-1)map[x][y]=1;}}}public void drowMe(Graphics g) {
//		System.out.println("正在画出地图...");SetRectangle(g);}public boolean iseatbysnake(Snake snake) {Point head=snake.getSnakehead();for(int k=0;k<Global.WIDTH+2;k++) {for(int m=0;m<Global.HEIGHT+2;m++) {if(map[k][m]==1&&head.x==k&&head.y==m)return true;}}return false;}private void SetRectangle(Graphics g){Graphics2D gp=(Graphics2D)g;Rectangle2D rect=new Rectangle2D.Double(20, 20, 600, 600);Stroke s=new BasicStroke(5);gp.setStroke(s);gp.draw(rect);}
}

//定义接口用来监听Snake是否碰撞

public interface SnakeListener {public void snakeMove(Snake snake);
}

GUI显示

public class GamePanel extends JPanel{private Snake snake=new Snake();private Food food;private Map map;private int x,y,z;private JLabel label;  private JLabel explain1;private JLabel explain2;private JLabel explain3;private JLabel explain4;private JLabel explain5;private JLabel grade;private JLabel time;private long endtime;//时间public static long TIME;//最终显示时间public static int GRADE;//最终显示分数private JLabel bgm_label;private BufferedImage img=null;private Font font=new Font("宋体",Font.PLAIN,20);public GamePanel() {setLayout(null);//加入说明Count() ;//加入图片addBgm();}public void dispaly(Snake snake,Food food,Map map) {
//		System.out.println("面板正在画出自己...");this.snake=snake;this.food=food;this.map=map;repaint();     //自动调用了paintComponent方法}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);SetLine(g);drawNum(g);if(food!=null)food.drowMe(g);if(map!=null)map.drowMe(g);if(snake!=null)snake.drowMe(g);}private void drawNum(Graphics g) {//分数g.setColor(Color.black);g.setFont(new Font("宋体",Font.PLAIN,36));Global.GRADE=(snake.getlenght()-3)*5;g.drawString(""+Global.GRADE+"", 720, 330);//时间endtime=System.currentTimeMillis();Global.TIME=(endtime-Controller.starttime)/1000;g.drawString(""+Global.TIME+""+"秒", 720, 390);}private void SetLine(Graphics g){Graphics2D gl=(Graphics2D)g;Stroke s=new BasicStroke();gl.setStroke(s);for(int i=1;i<30;i++){
//			x=(int) (Math.random()*256);
//			y=(int) (Math.random()*256);
//			z=(int) (Math.random()*256);
//			Color color=new Color(x,y,z);x=154;//222y=157;//225z=162;//230Color color=new Color(x,y,z);gl.setColor(color);Line2D Virtical_L=new Line2D.Double(Global.RECT_WIDTH*i+20, 20, Global.RECT_WIDTH*i+20, 620);gl.draw(Virtical_L);Line2D Level_L=new Line2D.Double(20, Global.RECT_WIDTH*i+20, 620, Global.RECT_WIDTH*i+20);gl.draw(Level_L);}}public void Count() {label=new JLabel("版权:12210");label.setLocation(630, 20);label.setSize(200, 50);label.setFont(font);add(label);//解释explain1=new JLabel("说明:↑ ↓ ← →键");explain2=new JLabel("控制方向");explain3=new JLabel("暂停:Space");explain4=new JLabel("继续:Enter");explain5=new JLabel("退出:Esc");explain1.setBounds(630, 90, 200,20);explain2.setBounds(630, 130, 200, 20);explain3.setBounds(630, 170, 200, 20);explain4.setBounds(630, 210, 200, 20);explain5.setBounds(630, 250, 200, 20);explain1.setFont(font);explain2.setFont(font);explain3.setFont(font);explain4.setFont(font);explain5.setFont(font);add(explain1);add(explain2);add(explain3);add(explain4);add(explain5);//分数grade=new JLabel("分数:");grade.setBounds(630, 300, 100, 30);grade.setFont(new Font("宋体",Font.PLAIN,30));add(grade);//时间time=new JLabel("时间:");time.setBounds(630, 360, 100, 30);time.setFont(new Font("宋体",Font.BOLD,30));add(time);}//加入图片public void addBgm() {try {img=ImageIO.read(new File("bgm.png"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}bgm_label=new JLabel(new ImageIcon(img));bgm_label.setBounds(630,400,img.getWidth(),img.getHeight());add(bgm_label);}
}

控制游戏

public class Controller extends KeyAdapter implements SnakeListener{private Snake snake;private Food food;private Map map;private GamePanel gamepanel;public static long starttime;//开始游戏时间public Controller(Snake snake, Food food, Map map, GamePanel gamepanel) {super();this.snake = snake;this.food = food;this.map = map;this.gamepanel = gamepanel;}@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);
//		System.out.println("改变方向...");switch(e.getKeyCode()) {case KeyEvent.VK_UP:snake.changedirction(Snake.UP);break;case KeyEvent.VK_DOWN:snake.changedirction(Snake.DOWN);break;case KeyEvent.VK_RIGHT:snake.changedirction(Snake.RIGHT);break;case KeyEvent.VK_LEFT:snake.changedirction(Snake.LEFT);break;case KeyEvent.VK_SPACE:snake.suspend();break;case KeyEvent.VK_ESCAPE:System.exit(0);break;default:snake.getsd().Rouse();break;}}@Overridepublic void snakeMove(Snake snake) {
//		System.out.println("判断是否迟到食物或墙...");if(food.iseatbysnake(snake)==true) {snake.eatfood();//增加新的食物位置food.addFood(food.setloction());}if(map.iseatbysnake(snake)) {JOptionPane.showMessageDialog(null, "傻瓜,撞到墙啦!");Snake.life=false;JOptionPane.showMessageDialog(null, "分数:"+""+Global.GRADE+""+"分"+"   "+"耗时:"+""+Global.TIME+""+"秒");System.exit(0);}if(snake.iseatself(snake)) {JOptionPane.showMessageDialog(null, "傻瓜,吃到自己啦!");Snake.life=false;JOptionPane.showMessageDialog(null, "分数:"+""+Global.GRADE+""+"分"+"   "+"耗时:"+""+Global.TIME+""+"秒");System.exit(0);}gamepanel.dispaly(snake, food, map);;}public void startGame() {starttime=System.currentTimeMillis();snake.start();food.addFood(food.setloction());}
}

主程序

class Window extends JFrame{private Snake snake=new Snake();private Food food=new Food();private Map map=new Map();private GamePanel gamepanel=new GamePanel();private Controller controller=new Controller(snake, food, map, gamepanel);//背景音乐的变量private URI uri;private URL url;//增加文字JLabel label;public Window(){this.setBounds(100, 100, 900, 680);this.setTitle("贪吃蛇 version2.0");this.setResizable(false);this.setDefaultCloseOperation(EXIT_ON_CLOSE);snake.addSnakeListener(controller);gamepanel.addKeyListener(controller);gamepanel.setFocusable(true);this.add(gamepanel);this.setVisible(true);music();controller.startGame();}//添加背景音乐public void music() {System.out.println("运行了!");try{File f=new File("周二珂 - 告白气球.wav");uri=f.toURI();url=uri.toURL();AudioClip auu=Applet.newAudioClip(url);auu.loop();}catch(Exception e) {e.printStackTrace();}}
}
class GameThread extends Thread{@Overridepublic void run() {new Window();}
}
public class Client{public static void main(String[] args) throws UnknownHostException, IOException {
//		Socket socket=new Socket("127.0.0.1",9999);new GameThread().start();
//		Operation ope=new Operation();
//		ope.Write(socket);
//		ope.Read();
//		socket.close();	}}

嘿嘿 新手 看视频学的 加油2020年
应该能执行成功的
源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AppiumForWin安装

尝试安装Windows版本的Appium参考&#xff1a;http://www.cnblogs.com/fnng/p/4540731.html第一步&#xff1a;安装nodehttps://nodejs.org/en/安装成功后使用&#xff1a;node -v&#xff0c;进行验证第二步&#xff1a;安装Appium下面的方法失败&#xff1a;原因下载不成功&a…

activiti5第一弹-----基本的activiti示例

建立一个普通的javaSE工程&#xff0c;工程的目录结构如下&#xff1a;需要的jar包如下&#xff1a; 在config文件夹下创建log4j.properties用来输入日志&#xff0c;内容如下&#xff1a; log4j.rootLoggerINFO, CA # ConsoleAppender log4j.appender.CAorg.apache.log4j.Cons…

activiti5第三弹-----------脚本任务

首先是流程定义图&#xff1a; 重点关注一下流程节点中 Script Task 节点的 properties中的Main config 这里可以选择不同的脚本语言&#xff0c;由于其他的部怎么会就用javascript来吧。 从图中可以看出只是定义了一个变量x&#xff0c;它的值为 a; 很多人都说这样定义了这个…

activiti5第四弹----serviceTask中的java服务任务

activiti.cfg.xml内容&#xff1a; <?xml version"1.0"?> <beans default-lazy-init"false"xsi:schemaLocation" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://ww…

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask

web service task是BPMN2.0中的一种任务类型&#xff0c;在activiti5中它并没有专门的标签表示&#xff0c;而是使用了service task 来表示。而且有很多要配置的内容是无法用图形化工具来完成的。要使用web service task&#xff0c;当然要先有web service。所以首先要编写一个…

activiti5第六弹 手动任务、接收任务、邮件任务

手动任务和接收任务几乎不在程序中做什么事情---只是在流程的历史中留下一点痕迹&#xff0c;表明流程是走过某些节点的。。。而且这两个任务是无法用taskservice查询到的 但是接收任务比手动任务多一个功能&#xff0c;就是确认功能。。。 activiti.cfg.xml配置 <?xml v…

手把手教你用原始方式上传项目至GitHub

小编GitHub&#xff1a;https://github.com/ds1889 首先你得注册一个自己的GitHub账号&#xff0c;注册网址&#xff1a;https://github.com/join 有了自己的账号以后&#xff0c;就可以进行登录&#xff0c;开始创建一个新的项目 创建一个新的项目&#xff0c;填写项目名称&am…

office如何快速删除重复数据

1、首先打开如下文档&#xff0c;在A列删除重复日期星期一&#xff0c;星期二&#xff1b; 2、选中编号栏&#xff0c;&#xff21;1-&#xff21;10&#xff0c;如下图: 3、点击数据——删除重复项&#xff1b;如下图红色剪头所指: 4、删除后&#xff0c;重复项就被删除成功。…

SQL中and和or的区别是?

今天有这样得一个需求&#xff0c;如果登陆人是客服的话&#xff0c;会查询订单是’该客服’以及还没有匹配客服的&#xff0c;刚开始想的是直接在sql语句上拼写 or assigned_id is null 的&#xff0c;测试了一下发现这样的话&#xff0c;前面的其他条件都没有用了 这样的话…

Java编程设计---数组Arrays

数组的的定义 数组是存放在连续存储空间的元素集合 数组定义的格式&#xff1a; int[] arrnew int[5]; int&#xff1a;数组元素的数据类型&#xff0c;可以是基本数据类型&#xff0c;也可以是引用 arr&#xff1a;数组名称 5&#xff1a;数组中元素个数 第一步&#xff1a;定…

SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】...

前言 最近LZ给项目框架升级&#xff0c; 从Spring1.x升级到Spring2.x, 在这里就不多赘述两个版本之间的区别以及升级的原因。 关于升级过程中踩的坑&#xff0c;在其他博文中会做比较详细的记录&#xff0c;以便给读者参考&#xff0c;不要掉进同样的坑里。 这里我们讨论一个关…

个人测试作业

作业所属课程&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340 作业目标&#xff1a;测试其他同学项目 姓名&#xff1a;潘云峰201731062423 所…

Activiti5第十一弹,流程监听器与任务监听器

首先创建流程监听器和任务监听器的实体类&#xff0c;个人比较喜欢使用Delegate Expression方式&#xff0c;其他两种方式也可以 流程监听器 package org.mpc.final_activiti;import java.io.Serializable;import org.activiti.engine.delegate.DelegateExecution; import org.…

ASCII码对照表

1、字母转换成ASCII码 1 string str "hello";2 byte[] array new byte[1]; 3 array System.Text.Encoding.ASCII.GetBytes(str); //把str的每个字符转换成ascii码4 5 int asciicode1 (short)(array[0]);//h 的…

平行四边形的特殊性质

定义平行四边形内角平分线围城的四边形为$\lambda$四边形$\lambda$四边形是矩形 $\lambda$四边形的中线为平行四边形中心$\lambda$四边形的对角线和平行四边形的边平行转载于:https://www.cnblogs.com/guoshaoyang/p/11011612.html

对象的深度复制

首先什么是深度复制&#xff1f;什么又是浅复制&#xff1f; 百度告诉我---------------> 浅复制&#xff1a;将一个对象复制后&#xff0c;基本类型都会重新创建&#xff0c;而引用类型指向的还是原对象所指的引用&#xff1b; 深复制&#xff1a;讲一个对象复制后&…

如何在idea中使用Mybatis-generator插件快速生成代码

代码下载地址&#xff1a;https://download.csdn.net/download/hua_faded/10671547 一、配置Maven pom.xml 文件 在pom.xml增加以下插件&#xff1a; <build><finalName>zsxt</finalName> <plugins> <plugin> <groupId>org.mybatis.genera…

django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

CBV加装饰器 第一种  method_decorator(装饰器&#xff09;  加在get上 第二种  method_decorator(login_auth,nameget)  加在类上 第三种  method_decorator(login_auth)  加在dispatch上  3.7的要return super().dispatch def login(request):if request.metho…

Dubbo理论知识

本文是作者根据官方文档以及自己平时的使用情况&#xff0c;对 Dubbo 所做的一个总结。如果不懂 Dubbo 的使用的话&#xff0c;可以参考我的这篇文章《超详细&#xff0c;新手都能看懂 &#xff01;使用SpringBootDubbo 搭建一个简单的分布式服务》 Dubbo 官网&#xff1a;http…

外观模式(facade)

外观模式是为了解决类与类之间的依赖关系的&#xff0c;像spring一样&#xff0c;可以将类和类之间的关系配置到配置文件中&#xff0c;而外观模式就是将他们的关系放在一个Facade类中&#xff0c;降低了类类之间的耦合度&#xff0c;该模式中没有涉及到接口&#xff0c;看下类…