java编写简易贪吃蛇游戏

 更新时间:2020年05月18日 16:07:26   作者:小伙子渴望力量么  
这篇文章主要为大家详细介绍了java编写简易贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下

程序共包含以下两个文件:

文件:ShellWin.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class ShellWin extends JPanel implements Runnable{ //实现了键盘与鼠标两个接口
 int direction;
 int length;
 int score=0;
 boolean control=false;
 int[] xs=new int[400];    //蛇的个数,xy,坐标控制
 int[] ys=new int[400];
 int douX;int douY;
 Thread thread;
 public ShellWin()
 {
   setPreferredSize(new Dimension(600, 600));
  setLocation(100, 100);
  setBackground(Color.GREEN);
  thread=new Thread(this);     //为这个类添加一个线程
  create_snake();
  create_bean();
 }
 public void paintComponent(Graphics g)   //绘制
 {
  super.paintComponent(g);     //Jpanel内的方法,起到清屏的作用
  g.drawString("分数:"+score, 50, 50);
  g.drawRect(0,0, 600, 600);
  show_snake(g);
  show_bean(g);
 }
 //能不能吃豆,能不能死
 void die()
 {
  JOptionPane.showMessageDialog(null, "game over", "游戏结束", JOptionPane.ERROR_MESSAGE);
 }
 void eat()
 {
  length++;
  this.score+=100;
  create_bean();
 }
 boolean out_bounds()
 {
  if(xs[0]==-10||xs[0]==600||ys[0]==-10||ys[0]==600)   //出界即死
  {
   return true;
  }
  return false;
 }
 void change_direction(int new_direction)      //控制方向
 {
  if(direction%2!=new_direction%2||direction==0)    // 2 4 3 1 上下左右
  {
   direction=new_direction;
  }
 }
 boolean eat_self()
 {
  for (int i = 1; i < length; i++) {
   if(xs[0]==xs[i]&&ys[0]==ys[i])
   {
    return true;
   }
  }
  return false;
 }
 boolean can_eat()
 {
  if(xs[0]==douX&&ys[0]==douY)
  {
   return true;
  }
  return false;
 }
 void create_snake()
 {
  direction=0;length=5;
  for (int i = 0; i < length; i++) {
   xs[i]=400;
   ys[i]=400+10*i;
  }
 }
 void create_bean()
 {
  douX=10*(int)(Math.random()*60);
  douY=10*(int)(Math.random()*60);
  for (int i = 0; i < length; i++) {
   if(xs[i]==douX&&ys[i]==douY)
   {
    create_bean();
    return;
   }
  }
 }
 void show_bean(Graphics g)     //仍然得要写入到paintComponent方法内
 {
  g.setColor(Color.RED);
  g.fillOval(douX, douY, 10, 10);
 }
 void crawl()
 {
   if(direction!=0)
  for (int i = length-1; i >0; i--) { // 2 4 3 1 上下左右
   xs[i]=xs[i-1];    //后一个替代前一个 4=3;
   ys[i]=ys[i-1];
  }
  switch (direction) {
  case 1:
   xs[0]=xs[0]+10;
   break;
  case 2:
   ys[0]=ys[0]-10;
   break;
  case 3:
   xs[0]=xs[0]-10;
   break;
  case 4:
   ys[0]=ys[0]+10;
   break;
  default:
   break;
  }
 }
 void show_snake(Graphics g)
 {
  for (int i = 0; i < length; i++) {
   g.setColor(Color.BLUE);
   if(i==0){
    g.drawOval(xs[i], ys[i], 10, 10);
    continue;
   }
   g.drawRect(xs[i], ys[i], 10, 10);   //蛇的长度与大小
  }
 }
 @Override
 public void run() {
  while(control)
  {
   try {    
    if(can_eat())
    {
     eat();
    }
    if(out_bounds())
    {
     die();
     return;
    }
    if(eat_self())
    {
     die();
     return;
    }
    crawl();
    Thread.sleep(200);
    repaint();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
class panel extends JPanel implements ActionListener,KeyListener{
  JButton startGame=new JButton("开始");
  JButton stopGame=new JButton("停止");
  Box box1;     //盒式布局
  panel(){
   setLayout(new FlowLayout());
    box1=Box.createHorizontalBox();
    box1.add(startGame);
    box1.add(Box.createHorizontalStrut(2));
    box1.add(stopGame);
    setSize(800,800);
    setBackground(Color.black);
   addKeyListener(this);     //为ShellWin 对象注册一个侦听器
   startGame.addActionListener(this);  //为开始按钮添加侦听器,this指代的是Actionistener这个类所创建的对象
   stopGame.addActionListener(this);  //为结束按钮添加侦听器,this指代的是Actionistener这个类所创建的对象
  }
  @Override
  public void actionPerformed(ActionEvent e) {
   if(e.getSource()==startGame)
   {
    this.requestFocus();  //将光标添加到该控件中
    control=true;
    thread.start();    //线程开始
    //***********************************
    this.repaint(100,100, 600, 600);   
   }
   if(e.getSource()==stopGame)
   {
    this.requestFocus();  //将光标添加到该控件中
    control=false;    //线程结束   
   }
  }
  @Override
  public void keyPressed(KeyEvent e) {
   switch (e.getKeyCode()) {
   case KeyEvent.VK_UP:
    change_direction(2);
    break;
   case KeyEvent.VK_DOWN:
    if(direction!=0)
    change_direction(4);
    break;
   case KeyEvent.VK_LEFT:
    change_direction(3);
    break;
   case KeyEvent.VK_RIGHT:
    change_direction(1);
    break;
   default:
    break;
   }
  }
  @Override
  public void keyReleased(KeyEvent e) {
   // TODO Auto-generated method stub
    
  }
  @Override
  public void keyTyped(KeyEvent e) {
   // TODO Auto-generated method stub
  }
  
 }
}

文件:ShellMain.java

import javax.swing.Box;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class ShellMain extends JFrame {
 ShellWin win=new ShellWin();
  ShellWin.panel pan=win.new panel();
  Box box,box2;
 ShellMain(){
   box2=Box.createHorizontalBox();
   box2.add(win);
   box=Box.createVerticalBox();
   box.add(pan.box1);
   box.add(Box.createVerticalStrut(8));
   box.add(box2);
  pan.add(box);
  setTitle("贪吃蛇");
  setSize(800,800);
  setVisible(true);
  setLayout(null);
  add(pan);
  setLocation(0,0);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public static void main(String[] args) {
   new ShellMain();
 }
}

更多精彩游戏,请参考专题《java经典小游戏》

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

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

相关文章

  • java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结

    这篇文章主要介绍了java 在file的尾部添加数据的两种方法总结的相关资料,这里提供了两种在file尾部添加数据的方法,希望能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • SpringBoot整合Minio实现上传文件的完整步骤记录

    SpringBoot整合Minio实现上传文件的完整步骤记录

    MinIO是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,下面这篇文章主要给大家介绍了关于SpringBoot整合Minio实现上传文件的完整步骤,需要的朋友可以参考下
    2022-05-05
  • java封装及四种权限修饰符详解

    java封装及四种权限修饰符详解

    这篇文章主要介绍了java封装及四种权限修饰符详解,对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值
    2022-08-08
  • 非常全面的IReport的使用教程

    非常全面的IReport的使用教程

    iReport 是为JasperReports Library和JasperReports Server设计的报表可视化设计器。本教程给大家详细介绍IReport的使用解析,感兴趣的朋友一起看看吧
    2021-10-10
  • Java中的PowerMock使用实践

    Java中的PowerMock使用实践

    这篇文章主要介绍了Java中的PowerMock使用实践,@PrepareForTest和@RunWith是成对出现的,一般@RunWith(PowerMockRunner.class),@PrepareForTest的值是引用的静态方法或私有方法的类,需要的朋友可以参考下
    2023-12-12
  • 如何基于Springboot完成新增员工功能并设置全局异常处理器

    如何基于Springboot完成新增员工功能并设置全局异常处理器

    最近工作中遇到了做一个管理员工信息的功能,下面这篇文章主要给大家介绍了关于如何基于Springboot完成新增员工功能并设置全局异常处理器的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • SparkSQl简介及运行原理

    SparkSQl简介及运行原理

    Spark SQL就是将SQL转换成一个任务,提交到集群上运行,类似于Hive的执行方式。今天通过本文给大家分享SparkSQl简介及运行原理,感兴趣的朋友跟随小编一起看看吧
    2021-08-08
  • SpringMVC的详细架构你了解嘛

    SpringMVC的详细架构你了解嘛

    这篇文章主要为大家介绍了SpringMVC的详细架构,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • java通过jacob实现office在线预览功能

    java通过jacob实现office在线预览功能

    这篇文章主要为大家详细介绍了java通过jacob实现office在线预览功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • java自定义封装StringUtils常用工具类

    java自定义封装StringUtils常用工具类

    这篇文章主要为大家详细介绍了java自定义封装StringUtils常用工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论