Java实现简单的贪吃蛇游戏
更新时间:2021年7月12日 00:00 点击:1616
本文实例为大家分享了Java实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下
代码
启动类
package snake; import javax.swing.*; //游戏的主启动类 public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame("贪吃蛇"); frame.setBounds(10,10,900,720); frame.setResizable(false); //窗口不可调整 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //正常游戏界面都应该在面板上 frame.add(new GamePanel()); frame.setVisible(true); } }
游戏画板
package snake; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; //游戏面板 public class GamePanel extends JPanel implements KeyListener, ActionListener { int lenth; //蛇的长度 int [] snakeX = new int[600]; //定义蛇的坐标X int [] snakeY = new int[500]; //定义蛇的坐标Y String fx ;//定义方向R:右 L:左 U:上 D:下 boolean isStart = false; //游戏是否开始 Timer timer = new Timer(120,this);//定时器 //定义一个食物 int foodx; int foody; Random random = new Random(); //定义死亡判断 boolean isFail = false;//默认不失败 //积分系统 int score; //构造器 public GamePanel(){ init(); //获取键盘的监听事件 this.setFocusable(true); this.addKeyListener(this); timer.start(); } //初始化 public void init(){ lenth = 3; snakeX[0] = 100;snakeY[0] = 100;//头部坐标 snakeX[1] = 75;snakeY[1] = 100;//第一个身体坐标 snakeX[2] = 50;snakeY[2] = 100;//第二个身体坐标 fx = "R";//蛇头初始方向 //初始化食物 foodx = 25 + 25 * random.nextInt(34); foody = 75 + 25 * random.nextInt(24); score = 0; } //绘制面板,游戏中的所以东西都使用这个东西来画 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //清屏作用 //绘制静态的面板 this.setBackground(Color.white); Data.header.paintIcon(this,g,25,11); //放进头部广告 g.fillRect(25,75,850,600); //默认游戏界面 //画一条静态的小蛇 if (fx.equals("R")){ Data.right.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("L")){ Data.left.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("U")){ Data.up.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("D")){ Data.down.paintIcon(this,g,snakeX[0],snakeY[0]); } //蛇的身体长度通过length来控制 for (int i = 1;i < lenth;i++){ Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); } //画积分 g.setColor(Color.white); g.setFont(new Font("微软雅黑",Font.BOLD,20)); g.drawString("长度"+lenth,700,45); g.drawString("分数"+score,780,45); //画食物 Data.food.paintIcon(this,g,foodx,foody); //游戏提示:是否开始 if (isStart == false){ //画一个文字String来提示开始 g.setColor(Color.white); //定义颜色 g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体 g.drawString("按下空格开始游戏",300,300); } //失败提醒 if (isFail){ //画一个文字String来提示失败 g.setColor(Color.RED); //定义颜色 g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体 g.drawString("游戏失败,按下空格重新开始",200,300); } } //接收键盘的输入:监听事件 @Override//键盘按下,未释放 public void keyPressed(KeyEvent e) { //获取按下键盘的信息 int keyCode = e.getKeyCode(); if(keyCode==KeyEvent.VK_SPACE){//如果按下空格键 if (isFail){//游戏失败,重新开始 isFail = false; init();//重新初始化游戏 }else {//暂停游戏 isStart = !isStart; } repaint();//刷新界面,重置 } //键盘控制走向 if (keyCode==KeyEvent.VK_LEFT){ fx = "L"; }else if (keyCode==KeyEvent.VK_RIGHT){ fx = "R"; }else if (keyCode==KeyEvent.VK_UP) { fx = "U"; }else if (keyCode==KeyEvent.VK_DOWN) { fx = "D"; } } //定时器,监听时间,帧,执行定时操作 @Override public void actionPerformed(ActionEvent e) { //如果游戏处于开始状态,并且游戏没有失败 if (isStart && isFail == false){ //右移 for (int i = lenth-1 ;i > 0;i--){ //身体向前移动 snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //通过控制方向让头部移动 if (fx.equals("R")){ snakeX[0] = snakeX[0] + 25;//头部移动 if (snakeX[0]>850){ snakeX[0] = 25; }//右边界判断 }else if (fx.equals("L")){ snakeX[0] =snakeX[0] - 25;//头部移动 if (snakeX[0]<25){ snakeX[0] = 850;}//左边界判断 }else if (fx.equals("U")){ snakeY[0] =snakeY[0] - 25;//头部移动 if (snakeY[0]<75){ snakeY[0] = 650;}//上边界判断 }else if (fx.equals("D")){ snakeY[0] =snakeY[0] + 25;//头部移动 if (snakeY[0]>650){ snakeY[0] = 75;}//下边界判断 } //如果食物和蛇头坐标重合 if (snakeX[0]==foodx && snakeY[0]==foody){ lenth ++;//蛇的身体长度加一 score = score + 10; //重新生成食物 foodx = 25 +25 * random.nextInt(34); foody = 75 +25 * random.nextInt(24); } //结束判断 for (int i = 1; i<lenth;i++){ if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){ isFail = true; } } repaint();//刷新界面 } timer.start();//让时间动起来 } @Override//键盘按下,弹起 public void keyTyped(KeyEvent e) { } @Override//释放某个键 public void keyReleased(KeyEvent e) { } }
游戏数据(存放图片)
package snake; import javax.swing.*; import java.net.URL; //数据中心 public class Data { //相对路径 tx.jpg 绝对路径 /相当于当前的项目 //头部图片 URL 定位图片地址 public static URL headerURL = Data.class.getResource("/statics/header.png"); public static ImageIcon header = new ImageIcon(headerURL); //上下左右移动 public static URL upUrl = Data.class.getResource("/statics/up.png"); public static ImageIcon up = new ImageIcon(upUrl); public static URL downUrl = Data.class.getResource("/statics/down.png"); public static ImageIcon down = new ImageIcon(downUrl); public static URL leftUrl = Data.class.getResource("/statics/left.png"); public static ImageIcon left = new ImageIcon(leftUrl); public static URL rightUrl = Data.class.getResource("/statics/right.png"); public static ImageIcon right = new ImageIcon(rightUrl); //身体 public static URL bodyUrl = Data.class.getResource("/statics/body.png"); public static ImageIcon body = new ImageIcon(bodyUrl); //食物 public static URL foodUrl = Data.class.getResource("/statics/food.png"); public static ImageIcon food = new ImageIcon(foodUrl); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
- 在Java中,我们可以利用多线程来最大化地压榨CPU多核计算的能力,下面这篇文章主要给大家介绍了关于java中多线程与线程池基本使用的相关资料,需要的朋友可以参考下...2021-09-13