java编写贪吃蛇小游戏

作者:hebedich 时间:2023-06-19 01:49:54 

废话不多说,直接奉上代码:

Frame.java


package snake;

import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Frame extends JFrame implements KeyListener {

/**
  *
  */

Boolean isAlive;
 Boolean isPause;
 Panel panel;
 Character direction;
 private static final long serialVersionUID = 1L;

public Frame(){
   // TODO Auto-generated constructor stub
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setSize(300,300);
   addKeyListener(this);
   panel = new Panel();
   add(panel);
   setVisible(true);
   isAlive = true;
   isPause = false;
   direction = new Character('d');
   MenuBar menuBar = new MenuBar();
   Menu menu = new Menu("menu");
   MenuItem reset = new MenuItem("newgame");
   MenuItem pause= new MenuItem("pause");

pause.addActionListener(new ActionListener(){

@Override
     public void actionPerformed(ActionEvent e) {
       // TODO Auto-generated method stub
       if(!isPause) isPause= true;
       else     isPause= false;
     }

});

reset.addActionListener(new ActionListener(){

@Override
     public void actionPerformed(ActionEvent e) {
       // TODO Auto-generated method stub
       reset();
     }

});

menu.add(reset);
   menu.add(pause);
   menuBar.add(menu);
   setMenuBar(menuBar);

}

public void reset(){
   panel.reset();
   isAlive = true;
 }

@Override
 public void keyTyped(KeyEvent e) {
   // TODO Auto-generated method stub

}

@Override
 public void keyPressed(KeyEvent e) {
   // TODO Auto-generated method stub
   if(e.getKeyCode()==KeyEvent.VK_UP)  direction = 'w';
   if(e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's';
   if(e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a';
   if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd';
 }

@Override
 public void keyReleased(KeyEvent e) {
   // TODO Auto-generated method stub

}

public void paint(Graphics g){
   panel.repaint();
 }

}

Launch.java


package snake;

import java.util.Timer;
import java.util.TimerTask;

public class Launch extends TimerTask {

Frame frame = new Frame();
 public Launch() {
   // TODO Auto-generated constructor stub

}

boolean crashWall(){
   SnakeBody sb = frame.panel.snake.getFirst();
   if((sb.x<0)||(sb.y<0)||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE))
     return true;
   else
     return false;
 }
 void initial(){
   frame.panel.snake.add(newBody());
   frame.panel.food = newBody();
 }
 @Override
 public void run() {
   // TODO Auto-generated method stub
   if(frame.panel.snake.isEmpty())
     initial();
   if(frame.isAlive)
     if(!frame.isPause){
       if(goStraight())
          frame.isAlive = false;
       frame.repaint();
     }
   if(crashWall()) frame.isAlive = false;
 }

SnakeBody newBody(){
   SnakeBody sb = new SnakeBody();

boolean overlap = true;
   while(overlap){
     overlap =false;
     sb.x = (int) (Math.random()*(Panel.LINE-2)+1);
     sb.y = (int) (Math.random()*(Panel.LINE-2)+1);
     if(!frame.panel.snake.isEmpty())
     for(SnakeBody s : frame.panel.snake)
       if(sb.equals(s))
         overlap =true;
   }

return sb;
 }

void eat(SnakeBody sb){
   frame.panel.snake.addFirst(sb);
 }
 boolean goStraight(){

boolean result = false;

SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst());
   frame.panel.snake.removeLast();
   if(frame.direction=='w')
     sb.turnUp();
   if(frame.direction=='s')
     sb.turnDown();
   if(frame.direction=='a')
     sb.turnLeft();
   if(frame.direction=='d')
     sb.turnRight();

for(SnakeBody s : frame.panel.snake){
     if(sb.equals(s)) result = true;
   }

frame.panel.snake.addFirst(sb);
   if(sb.equals(frame.panel.food)){
     if(frame.direction=='w')
       frame.panel.food.turnUp();
     if(frame.direction=='s')
       frame.panel.food.turnDown();
     if(frame.direction=='a')
       frame.panel.food.turnLeft();
     if(frame.direction=='d')
       frame.panel.food.turnRight();
     eat(frame.panel.food);
     frame.panel.food = newBody();
   }

return result;
 }

public static void main(String[] args){
   // TODO Auto-generated method stub
    Launch timertask = new Launch();
    Timer timer = new Timer();

timer.schedule(timertask,0,500);
 }

}

Panel.java


package snake;

import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;

import javax.swing.JPanel;

public class Panel extends JPanel {

/**
  *
  */
 private static final long serialVersionUID = 1L;
 public LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>();
 static final int LINE = 10;
 SnakeBody food = new SnakeBody(-99,-99);

public Panel() {
   // TODO Auto-generated constructor stub
 }

public void reset(){
   snake.clear();  
 }

public void paint(Graphics g){
   g.setColor(Color.white);
   g.fillRect(0, 0, getWidth(), getHeight());

for(SnakeBody sb : snake){
     g.setColor(Color.black);
     g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
     g.setColor(Color.orange);
     g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
   }
   g.setColor(Color.red);
   g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);

}
}

SnakeBody.java


package snake;

class SnakeBody {

int x;
 int y;

public SnakeBody() {
   // TODO Auto-generated constructor stub
   x = 0;
   y = 0;
 }

public SnakeBody(int a,int b){
   x = a;
   y = b;
 }
 public SnakeBody(SnakeBody sb){
   this(sb.x,sb.y);
 }

public void turnUp(){
   y--;
 }
 public void turnDown(){
   y++;
 }
 public void turnLeft(){
   x--;
 }
 public void turnRight(){
   x++;
 }

boolean equals(SnakeBody s){
   if((x==s.x)&&(y==s.y)) return true;
   else          return false;
 }

}

以上所述就是本文给大家分享的贪吃蛇的全部代码了,希望能够对大家熟练掌握java有所帮助。

标签:java,小游戏,贪吃蛇
0
投稿

猜你喜欢

  • Android中应用前后台切换监听的实现详解

    2021-12-28 17:59:36
  • Java集合之Map接口的实现类精解

    2023-10-07 15:10:37
  • C#实现的JS操作类实例

    2023-11-13 05:19:48
  • Java真题实练掌握哈希表的使用

    2023-11-09 06:33:15
  • Spring jackson原理及基本使用方法详解

    2021-10-03 08:28:18
  • 如何让Spring Rest 接口中路径参数可选

    2022-02-17 19:29:14
  • springMVC的生命周期详解

    2022-10-29 22:27:40
  • Android编程ProgressBar自定义样式之动画模式实现方法

    2022-02-10 12:54:29
  • Java中try catch处理异常示例

    2023-11-07 00:43:17
  • Java协程编程之Loom项目实战记录

    2023-10-23 17:44:06
  • Spring Boot 中密码加密的两种方法

    2021-09-12 15:08:38
  • Visual C#中如何使用IComparable和IComparer接口

    2021-12-17 20:01:02
  • IntelliJ IDEA使用教程从入门到上瘾(2019图文版)

    2023-03-30 17:00:49
  • SpringBoot整合Quartz实现定时任务详解

    2021-11-22 06:40:57
  • C#使用windows服务发送邮件

    2022-05-31 11:54:55
  • 安卓(Android)中如何实现滑动导航

    2023-10-17 10:51:18
  • Android实现自动匹配关键字并且标红功能

    2023-05-29 06:19:28
  • C# DataGridView添加新行的2个方法

    2023-06-23 05:42:19
  • Android中使用GridView进行应用程序UI布局的教程

    2022-03-19 15:18:06
  • Fluent Mybatis零xml配置实现复杂嵌套查询

    2022-02-03 19:34:32
  • asp之家 软件编程 m.aspxhome.com