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

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

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

闲话不说了

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

源码如下供大家学习。

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

先来看看运行效果:

具体代码:

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算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

(0)

相关推荐

  • Java swing实现的计算器功能完整实例

    本文实例讲述了Java swing实现的计算器功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Vector; public class Calculator { String str1 = "0"; // 运算数1 初值一定为0 为了程序的安全 String str2 = "0"

  • java按钮控件数组实现计算器界面示例分享

    思路如下: 创建一个类,通过extends使其继承窗体类JFrame:创建一个JFrame对象,使用JFrame类的setVisible()方法设置窗体可见:在构造函数中,使用super()方法继承父类的构造方法:使用setTitle()方法设置窗体的标题:使用setBounds()方法设置窗体的显示位置及大小:使用setDefaultCloseOperation()方法设置窗体关闭按钮的动作为退出:使用GridLayout创建网格布局管理器对象:使用GridLayout类的setHgap()方

  • Java实现Andriod带看括弧的计算器代码

    废话不多说了,一切尽在代码中,具体代码如下所示: 界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_par

  • java swing实现的扫雷游戏及改进版完整示例

    本文实例讲述了java swing实现的扫雷游戏及改进版.分享给大家供大家参考,具体如下: 版本1: package awtDemo; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import jav

  • Java基于swing实现的弹球游戏代码

    本文实例讲述了Java基于swing实现的弹球游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package Game; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Random;

  • java 简单的计算器程序实例代码

    java 简单的计算器程序 实现实例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { CalculatorFrame frame = new Calculato

  • Java简易计算器程序设计

    编写一个模拟计算器的应用程序,使用面板和网格布局, 添加一个文本框,10个数字按钮(0~9),4个加减乘除按钮, 一个等号按钮,一个清除按钮,一个求平方根按钮,一个退格按钮, 要求将计算公式和结果显示在文本框中,实现效果如下图所示. Java简易计算器代码: import javax.swing.*; import javax.swing.JTextField; import java.awt.*; import java.awt.event.*; import java.lang.*; imp

  • java模仿windows计算器示例

    这个计算器的界面模仿Windows自带的简易计算器,包括交互界面和和对各种输入的响应.目前尚未实现菜单栏和记忆类按钮的功能 复制代码 代码如下: import java.awt.Color;import java.awt.Container;import java.awt.GridLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import

  • java swing标准对话框具体实现

    复制代码 代码如下: package test001;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JToolBar;public class TestJOptionPane implements

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • java基于swing实现的连连看代码

    本文实例讲述了java基于swing实现连连看代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package llkan; import javax.swing.*; import java.awt.*; import java.awt.event.*; /**  * 连连看游戏  * @author Administrator  *2014年10月17日  */ public class MainGame implements ActionListener {     

  • java图形界面AWT编写计算器

    一.前言 1)这个计算器是基于java语言下图形界面AWT编写的.其实我认为写这个计算器,实现什么功能不重要,市场也不缺这个计算器,而是在于对AWT中三大布局的及画板的使用简单控件的操作使用.通过联系熟悉掌握AWT基础为深入学习打下基础.这个计算器功能也十分简单,空有其表.不过有兴趣的话可以继续添加功能完善操作等. 2)使用平台:主要使用Myeclipse2014 3)主要知识点:java 基础; awt+swing 二.功能实现及代码展示 1)主要是layout布局的练习,对画板文本框的使用,

随机推荐