java实现简易贪吃蛇游戏

 更新时间:2020年12月30日 18:07:55   作者:啊哈灬  
这篇文章主要为大家详细介绍了java实现简易贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储

import java.awt.*;

public class Node {
 private int x;
 private int y;

 public Node(int x, int y) {
  this.x = x;
  this.y = y;
 }

 public Node(){
 }

 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 void drawNode(int i, Graphics g){
  if(i==0){//头绘制成圆
   g.fillOval(this.x,this.y,20-1,20-1);
  }else{//身体绘制成矩形
   g.fillRect(this.x,this.y,20-1,20-1);
  }
 }
}

2.主类

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class Snake extends Frame implements KeyListener , ActionListener {
 //初始蛇移动方向
  String fx="right";
  //碰撞判断
  boolean is_attack=false;

 private ArrayList<Node> body=new ArrayList<Node>();
 {
  body.add(new Node(160, 60));
  body.add(new Node(140, 60));
  body.add(new Node(120, 60));
  int x=(int)(Math.random()*580);
  int y=(int)(Math.random()*580);
  body.add(new Node(x-x%20,y-y%20));
 }

 /**
  * 贪吃蛇
  * 1、窗体
  * 位置(坐标) * 标题 * 大小 * 背景颜色 * 窗体的大小不可变 * 可见
  * 2、绘制蛇
  */
 public Snake(){
 //窗体标题
  super.setTitle("贪吃蛇游戏");
  //窗体位置
  super.setLocation(100,100);
  //窗体大小
  super.setSize(600,600);
  //背景颜色
  super.setBackground(new Color(252,255, 208));
  //设置窗体可见
  super.setVisible(true);
  // 窗体大小不可变
  super.setResizable(false);
  //给关闭按钮添加事件
  super.addWindowListener(new WindowAdapter() {
   @Override
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  //获取聚焦
  super.setFocusable(true);
  //添加键盘监听
  super.addKeyListener(this);
  start();
 }

 public void start(){
  while(!is_attack){
   try{
    Thread.sleep(200);
   }catch (Exception e){
    e.printStackTrace();
   }
   //碰撞检测
   attack_check();
   //刷新窗体,调用paint方法
   repaint();
  }

 }
 //碰撞检测
 public void attack_check(){
  //撞到身体检测
  for(int i=1;i<body.size()-1;i++){
   if (body.get(0).getX()==body.get(i).getX()&&body.get(0).getY()==body.get(i).getY()){
    is_attack=true;
   }
  }
  //撞到边界
  if(body.get(0).getX()==0||body.get(0).getX()==600||body.get(0).getY()==0||body.get(0).getY()==600){
   is_attack=true;
  }
 }
 //移动贪吃蛇
 public void move(){
  //吃到食物判断,头结点坐标和食物坐标相等
  if ((body.get(0).getX()==body.get(body.size()-1).getX())&&(body.get(0).getY()==body.get(body.size()-1).getY())) {
   //出现下一个食物
   int x=(int)(Math.random() * 580);
   int y=(int)(Math.random() * 580);
   body.get(body.size()-1).setX(x-x%20);
   body.get(body.size()-1).setY(y-y%20);

   //蛇身加一个结点
   body.add(body.size()-1,new Node(0,0));
  }
  //移动头尾节点,使贪吃蛇移动
  Node node=body.get(0);
  if (fx.equals("up")){
   node=new Node(node.getX(),node.getY()-20);
   //加头
   body.add(0,node);
   //去尾
   body.remove(body.size()-2);
  }if (fx.equals("down")){
   node=new Node(node.getX(),node.getY()+20);
   //加头
   body.add(0,node);
   //去尾
   body.remove(body.size()-2);
  }if (fx.equals("right")){
   node=new Node(node.getX()+20,node.getY());
   //加头
   body.add(0,node);
   //去尾
   body.remove(body.size()-2);
  }if (fx.equals("left")){
   node=new Node(node.getX()-20,node.getY());
   //加头
   body.add(0,node);
   //去尾
   body.remove(body.size()-2);
  }

 }
 /**
  * 展示窗体|每一次刷新窗体都会执行的方法
  * @param g 画笔
  */
 @Override
 public void paint(Graphics g) {
  g.setColor(new Color(105, 78,255));
  for(int i=0; i<body.size(); i++){
   body.get(i).drawNode(i,g);
  }
  move();
  //游戏结束绘制
  if(is_attack){
   g.setColor(new Color(255, 67, 40));
   Font ft = new Font("宋体", Font.PLAIN, 40);
   g.setFont(ft);
   g.drawString("很遗憾,游戏结束",150,300);
  }
 }


 //事件监听
 @Override
 public void actionPerformed(ActionEvent e) {

 }
 @Override
 public void keyPressed(KeyEvent e) {
  int keyCode=e.getKeyCode();
  if(keyCode==KeyEvent.VK_UP){
   fx="up";
  }if (keyCode==KeyEvent.VK_DOWN){
   fx="down";
  }if (keyCode==KeyEvent.VK_LEFT){
   fx="left";
  }if (keyCode==KeyEvent.VK_RIGHT){
   fx="right";
  }
 }

 @Override
 public void keyTyped(KeyEvent e) {
 }
 @Override
 public void keyReleased(KeyEvent e) {
 }

 /**
  * main方法
  * @param args
  */
 public static void main(String[] args) {
  new Snake();
 }

}

运行图片

游戏结束

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IDEA配置Maven教程的超详细讲解版

    IDEA配置Maven教程的超详细讲解版

    IntelliJ IDEA是当前最流行的Java IDE(集成开发环境)之一,也是业界公认最好用的Java开发工具之一,这篇文章主要给大家介绍了关于IDEA配置Maven教程的超详细讲解版,需要的朋友可以参考下
    2023-11-11
  • Java全面深入探究SpringBoot拦截器与文件上传

    Java全面深入探究SpringBoot拦截器与文件上传

    拦截器对使用SpringMvc、Struts的开发人员来说特别熟悉,因为你只要想去做好一个项目必然会用到它,文件上传是一个很常见的功能。在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能
    2022-05-05
  • SpringBoot RestTemplate请求日志打印方式

    SpringBoot RestTemplate请求日志打印方式

    这篇文章主要介绍了SpringBoot RestTemplate请求日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java利用位运算实现加减运算详解

    Java利用位运算实现加减运算详解

    这篇文章主要为大家介绍了如何使用位运算来实现加减功能,也就是在整个运算过程中不能出现加减符号。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-12-12
  • Java多线程编程中易混淆的3个关键字总结

    Java多线程编程中易混淆的3个关键字总结

    这篇文章主要介绍了Java多线程编程中易混淆的3个关键字总结,本文总结了、volatile、ThreadLocal、synchronized等3个关键字,对这几个容易混淆概念的关键字分别做了讲解,需要的朋友可以参考下
    2015-03-03
  • maven打包插件的使用(maven-compiler-plugin、maven-dependency-plugin、maven-jar-plugin、maven-resources-plugin)

    maven打包插件的使用(maven-compiler-plugin、maven-dependency-plugin、m

    本文主要介绍了maven打包插件的使用(maven-compiler-plugin、maven-dependency-plugin、maven-jar-plugin、maven-resources-plugin),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java大数运算BigInteger与进制转换详解

    Java大数运算BigInteger与进制转换详解

    这篇文章主要介绍了Java大数运算BigInteger与进制转换详解,Java 提供了 BigInteger(大整数)类和 BigDecimal(大浮点数)类用于大数运算,这两个类都继承自 Number 类(抽象类),由于 BigInteger 在大数运算中更常见,需要的朋友可以参考下
    2023-09-09
  • spring boot静态变量注入配置文件详解

    spring boot静态变量注入配置文件详解

    这篇文章主要为大家详细介绍了spring boot静态变量注入配置文件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 详解Java并发工具类之CountDownLatch和CyclicBarrier

    详解Java并发工具类之CountDownLatch和CyclicBarrier

    在JDK的并发包中,有几个非常有用的并发工具类,它们分别是:CountDownLatch、CyclicBarrier、Semaphore和Exchanger,本文主要来讲讲其中CountDownLatch和CyclicBarrier的使用,感兴趣的可以了解一下
    2023-06-06
  • Java多态中的向上转型与向下转型浅析

    Java多态中的向上转型与向下转型浅析

    多态是指不同类的对象在调用同一个方法是所呈现出的多种不同行为,下面这篇文章主要给大家介绍了关于Java多态中向上转型与向下转型的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论