Java swing框架实现的贪吃蛇游戏完整示例

作者:101tx 时间:2021-06-30 13:03:01 

本文实例讲述了Java swing框架实现的贪吃蛇游戏。分享给大家供大家参考,具体如下:

java是门高级语言,做游戏时适合做后台,但是用它也可以做游戏。闲来无事做的时候可以用来写点小游戏,练习练习预防早衰哈哈!

闲话不说了

下面是以前练习的作品,不怕大家笑话,那个时候用了一个礼拜才做出来的。

源码如下供大家学习。

使用的是java的 swing  Jframe Jpanel JButton   当然你也可以使用awt

先来看看运行效果:

Java swing框架实现的贪吃蛇游戏完整示例

具体代码:


package Tcs;
/**
*
*
*
* @author tx
*/
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Snack extends JPanel implements KeyListener {
 public JButton bt = new JButton("重新开始");
 public ArrayList<Treasure> bw = new ArrayList<Treasure>();
 public body[] b = new body[5];
 public String state = "";
 public ArrayList<point> p = new ArrayList<point>();
 public static int score;
 public Snack() {
   this.addKeyListener(this);
   shengc();
 }
 public void shengc() {
   for (int i = 0; i < b.length; i++) {
     b[i] = new body();
     b[i].x = 10 - i * 10;
     b[i].y = 150;
   }
 }
 public int x = 0, y = 0;
 public void paint(Graphics g) {
   super.paint(g);
   g.setColor(new Color(165,41,10));//RGB定义颜色的方法
   g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20));
   for (int i = 0; i < b.length; i++) {
     body z1 = b[i];
     g.drawString("O", b[i].x, b[i].y);
   }
   g.setColor(Color.BLUE);
   g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20));
   g.drawString("SCORE:" + score, 30, 30);
   paintjs(g);
   paintbw(g);
 }
 public void paintjs(Graphics g) {
   g.setColor(Color.BLACK);
   if (state.length() > 1) {
     g.drawString(state, 140, 200);
   }
 }
 public void paintbw(Graphics g) {
   g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));
   g.setColor(Color.RED);
   for (int i = 0; i < bw.size(); i++) {
     g.drawString("o", bw.get(i).x, bw.get(i).y);
   }
 }
 public boolean yj() {
   if ((b[0].x < 400 && b[0].x > 0) && (b[0].y < 400 && b[0].y > 0)) {
     return false;
   } else {
     state = "GAME OVER";
     return true;
   }
 }
 public void stmove() {
   if (pzjc() == false && (yj() == false)) {
     b[0].speed = 8;//此处可提升速度增加难度
     b[0].move();
     p.add(new point(b[0].x, b[0].y, b[0].fx));
     if (p.size() > b.length) {
       p.remove(p.get(0));
       // System.out.println(p.size());
     }
   }
 }
 public int jl(body a, Treasure b) {
   int jl = 0;
   jl = (int) Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y)
       * (a.y - b.y));
   return jl;
 }// 暂时无用
 public void ssmove() {
   if (p.size() >= b.length) {
     for (int i = 0; i < b.length - 1; i++) {
       b[i + 1].fx = p.get(i).fx;
       b[i + 1].x = p.get(i).x;
       b[i + 1].y = p.get(i).y;
     }
   }
 }
 Random r = new Random();
 public void bzbw() {
   if (bw.size() < 1) {
     Treasure s = new Treasure();
     s.x = r.nextInt(300) + 50;
     s.y = r.nextInt(300) + 50;
     bw.add(s);
   }
 }
 public void bwxs() {
   Timer t = new Timer();
   t.schedule(new TimerTask() {
     public void run() {
     }
   }, 0, 8000);
 }
 public boolean pzjc() {
   for (int i = 1; i < p.size(); i++) {
     if (p.get(0).equals(p.get(i))) {
       state = "GAME OVER";
       return true;
     }
   }
   return false;
 }
 public void crush() {
   if (bw.size() > 0) {
     if (jl(b[0], bw.get(0)) < 8) {
       bw.remove(0);
       b = Arrays.copyOf(b, b.length + 1);
       b[b.length - 1] = new body();
       score += 10;
     }
   }
 }
 public void gameover() {
   MouseListener k = new MouseAdapter() {
     public void mouseClicked(MouseEvent e) {
       super.mouseClicked(e);
       state = "";
       b = Arrays.copyOf(b, 5);
       p.clear();
       shengc();
       score = 0;
       bt.setVisible(false);
     }
   };
   if (state.length() > 1) {
     this.add(bt);
     bt.setVisible(true);
     bt.setBounds(150, 150, 100, 30);
     bt.addMouseListener(k);
   }
     if(bt.isVisible()==false){this.remove(bt);}
   this.requestFocus();
 }
 public void zmAction() {
   Timer timer = new Timer();
   timer.schedule(new TimerTask() {
     public void run() {
       bzbw();// 生成宝物
       stmove();// 蛇头运动
       ssmove();// 蛇身运动
       crush();// 碰撞检测
       gameover();
       repaint();
     }
   }, 10, 83);
 }
 public static void main(String[] args) {
   JFrame jf = new JFrame("脚本之家 - 贪吃蛇游戏测试");
   jf.setBounds(0, 0, 400, 400);
   jf.setVisible(true);
   jf.setLayout(null);
   Container c = new Container();
   c = jf.getContentPane();
   c.setBackground(Color.WHITE);
   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Snack s = new Snack();
   s.setVisible(true);
   s.setBounds(0, 0, 600, 600);
   s.setLocation(0, 0);
   s.setBackground(Color.ORANGE);
   jf.add(s);
   s.zmAction();
   s.requestFocus();
 }
 public void keyTyped(KeyEvent e) {
 }
 public void keyPressed(KeyEvent e) {
   int k = e.getKeyCode();
   switch (k) {
   case KeyEvent.VK_UP:
     if (b[0].fx != "sz" && b[0].fx != "xz") {
       b[0].fx = "sz";
     }
     break;
   case KeyEvent.VK_DOWN:
     if (b[0].fx != "sz" && b[0].fx != "xz") {
       b[0].fx = "xz";
     }
     break;
   case KeyEvent.VK_LEFT:
     if (b[0].fx != "zz" && b[0].fx != "yz") {
       b[0].fx = "zz";
     }
     break;
   case KeyEvent.VK_RIGHT:
     if (b[0].fx != "zz" && b[0].fx != "yz") {
       b[0].fx = "yz";
     }
     break;
   }
   repaint();
 }
 public void keyReleased(KeyEvent e) {
 }
}

body类


package Tcs;
public class body {
public int x=0;
public int y=0;
public int speed;
private String str;
public String fx;
public body(){
 fx="yz";
}
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 String getStr() {
 return str;
}
public void setStr(String str) {
 this.str = str;
}
public void sz(){
 this.y+=-speed;
}
public void xz(){
 this.y+=speed;
}
public void zz(){
 this.x+=-speed;
}
public void yz(){
 this.x+=speed;
}
public void move(){
 if(fx=="xz"){
   xz();
 }
 if(fx=="sz"){
   sz();
 }
 if(fx=="zz"){
   zz();
 }
 if(fx=="yz"){
   yz();
 }
}
}

宝物类


package Tcs;
public class Treasure {
public int x;
public int y;
public String str;
}

point类


package Tcs;
public class point {
public int x;
public int y;
public String fx;
public point(int x,int y,String fx){
 this.x=x;
 this.y=y;
 this.fx=fx;
}
public boolean equals(Object o){
 if(o instanceof point){
   point p=(point)o;
   if(p.x==this.x&&p.y==this.y){
     return true;
   }
 }
 if(o==this){return true;}
 if(o==null){return false;}
 return false;}
}

希望本文所述对大家java程序设计有所帮助。

来源:http://blog.csdn.net/tx101q/article/details/54811079

标签:Java,swing,游戏
0
投稿

猜你喜欢

  • 浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题

    2023-10-18 10:36:43
  • Java jvm中Code Cache案例详解

    2022-02-04 17:00:53
  • Mybatis中的延迟加载案例解析

    2023-02-27 01:55:37
  • 详解Java中Optional类的使用方法

    2023-11-25 05:22:28
  • 详解Java中日志跟踪的简单实现

    2023-03-28 00:18:48
  • Java多线程 Callable、Future 和FutureTask

    2023-07-24 08:09:23
  • Android网格布局GridView学习使用

    2023-02-07 15:03:13
  • SpringBoot切面拦截@PathVariable参数及抛出异常的全局处理方式

    2023-05-27 13:59:52
  • spring与disruptor集成的简单示例

    2021-12-16 11:01:41
  • Android控件之SlidingDrawer(滑动式抽屉)详解与实例分享

    2023-07-27 09:26:18
  • C#使用FileStream复制一个任意文件

    2022-04-17 19:55:17
  • 深入剖析构建JSON字符串的三种方式(推荐)

    2023-09-26 07:47:22
  • Android Build Variants 为项目设置变种版本的方法

    2023-04-26 10:29:07
  • 解读List list=new ArrayList()是怎么回事

    2022-04-17 12:28:22
  • 详解jeefast和Mybatis实现二级联动的问题

    2022-11-10 05:10:15
  • c#中实现图片灰度化技术详解

    2023-06-26 22:25:56
  • Spring Boot2.3 新特性分层JAR的使用

    2021-08-03 12:55:50
  • Android7.0自动更新适配 包解析异常

    2022-02-13 11:21:00
  • Android使用CrashHandler来获取应用的crash信息的方法

    2023-07-25 20:27:38
  • Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件

    2022-06-25 19:04:23
  • asp之家 软件编程 m.aspxhome.com