Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例
本文實(shí)例講述了Java swing框架實(shí)現(xiàn)的貪吃蛇游戲。分享給大家供大家參考,具體如下:
java是門高級語言,做游戲時(shí)適合做后臺,但是用它也可以做游戲。閑來無事做的時(shí)候可以用來寫點(diǎn)小游戲,練習(xí)練習(xí)預(yù)防早衰哈哈!
閑話不說了
下面是以前練習(xí)的作品,不怕大家笑話,那個(gè)時(shí)候用了一個(gè)禮拜才做出來的。
源碼如下供大家學(xué)習(xí)。
使用的是java的 swing Jframe Jpanel JButton 當(dāng)然你也可以使用awt
先來看看運(yùn)行效果:

具體代碼:
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;
}// 暫時(shí)無用
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();// 蛇頭運(yùn)動
ssmove();// 蛇身運(yùn)動
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;}
}
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解
SpringBootAdmin是一個(gè)管理和監(jiān)控SpringBoot應(yīng)用程序的工具,可通過集成和配置實(shí)現(xiàn)應(yīng)用監(jiān)控與告警功能,本文給大家介紹Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解,感興趣的朋友跟隨小編一起看看吧2024-09-09
Springboot整合freemarker和相應(yīng)的語法詳解
FreeMarker是一款Spring官方推薦使用的模板引擎。接下來通過本文給大家介紹Springboot整合freemarker和相應(yīng)的語法,感興趣的朋友一起看看吧2021-09-09
Java8時(shí)間api之LocalDate/LocalDateTime的用法詳解
在項(xiàng)目中,時(shí)間的使用必不可少,而java8之前的時(shí)間api?Date和Calander等在使用上存在著很多問題,于是,jdk1.8引進(jìn)了新的時(shí)間api-LocalDateTime,本文就來講講它的具體使用吧2023-05-05
Java中Object.wait()和LockSupport.park()的用法
Object.wait()和LockSupport.park()都是用來使當(dāng)前線程等待的方法,本文主要介紹了Java中Object.wait()和LockSupport.park()的用法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中
在現(xiàn)代軟件開發(fā)中,Docker已成為一種流行的容器化技術(shù),能夠簡化應(yīng)用的部署和管理,本文將詳細(xì)介紹如何將多個(gè)Spring Boot項(xiàng)目打包到一個(gè)Docker容器中,希望對大家有所幫助2024-10-10
Java Eclipse中實(shí)現(xiàn)快速替換變量
這篇文章主要介紹了Java Eclipse中實(shí)現(xiàn)快速替換變量,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java?DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)的示例詳解
DelayQueue是一個(gè)無界的BlockingQueue的實(shí)現(xiàn)類,用于放置實(shí)現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時(shí)才能從隊(duì)列中取走。本文就來利用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù),感興趣的可以了解一下2022-08-08

