用Java做的貪吃蛇,簡單版......


效果圖片:

 

:

 

話不多說,上代碼:

一共三個類:

public class Body {
int x;
int y;

public Body(int x, int y) {
this.x = x;
this.y = y;
}

}

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;

import javax.swing.JFrame;

public class BallThread extends JFrame {

/**
*
*/
private static final long serialVersionUID = 1L;
private static int RedX = 120; // 小球初始位置
private static int RedY = 120;
private Color color = Color.RED; // 小球初始顏色
private Thread run;
private String direction;
private Body[] body = new Body[100];
int body_length = 1;
int randomx = 40, randomy = 40;
private boolean pause = false;

// 有參構造方法
public BallThread() {
// 實例化數組
for (int i = 0; i < 100; i++) {
body[i] = new Body(0, 0);
}
body[0].x = RedX;
body[0].y = RedY;
setSize(400, 400); // 設置大小
setLocationRelativeTo(null);
setTitle("貪吃球");
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {
System.out.println("到這來.........");
super.keyPressed(e);
// System.out.println(e.getKeyCode());

if (e.getKeyCode() == KeyEvent.VK_LEFT) {
direction = "L";
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
direction = "R";
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
direction = "U";
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
direction = "D";
}
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
if (pause == false) {
pause = true;
} else {
pause = false;
}

}
}

});
}

public void paint(Graphics g) {
// 必須傳遞給父類
super.paint(g);

// System.out.println("運行到這來");

// 畫網格
// g.drawLine(500, 500, 600, 400);

g.clipRect(1, 1, 400, 400);

// 1.畫方格
// 豎線
for (int i = 1; i < 500; i = i + 20) {
g.setColor(Color.BLACK);
g.drawLine(i, 1, i, i + 400);
// 填充
g.setColor(Color.GREEN);
// 畫橫牆
g.fill3DRect(i + 1, 20 + 1, 20, 20, true);
g.fill3DRect(i + 1, 380 + 1, 20, 20, true);
}
// 橫線
for (int i = 1; i < 500; i = i + 20) {
g.setColor(Color.BLACK);
g.drawLine(1, i, i + 400, i);
// 填充
g.setColor(Color.green);
g.fill3DRect(1, i + 1, 20, 20, true);
g.fill3DRect(382, i + 1, 20, 20, true);
}
// 畫顏色圈
g.setColor(Color.blue);
g.drawRoundRect(20, 40, 20, 20, 20, 20);
g.setColor(Color.RED);
g.drawRoundRect(80, 120, 20, 20, 20, 20);
g.setColor(Color.PINK);
g.drawRoundRect(220, 220, 20, 20, 20, 20);

if (isEated()) {
produceFood();
g.setColor(Color.yellow);
g.fillRect(randomx, randomy, 20, 20);
} else {
g.setColor(Color.yellow);
g.fillRect(randomx, randomy, 20, 20);
}
// 小球
g.setColor(color); // 顏色
g.drawRoundRect(RedX, RedY, 20, 20, 20, 20);
g.fillRoundRect(RedX, RedY, 20, 20, 20, 20);
body[0].x = RedX;
body[0].y = RedY;
for (int i = 1; i < body_length; i++) {
System.out.println("身體顯示了");
System.out.println("X==" + body[i].x + " Y======" + body[i].y);
g.setColor(Color.BLACK);
g.drawRect(body[i].x, body[i].y, 20, 20);
g.fillRect(body[i].x, body[i].y, 20, 20);
}
g.setColor(color); // 顏色
g.drawRoundRect(RedX, RedY, 20, 20, 20, 20);
g.fillRoundRect(RedX, RedY, 20, 20, 20, 20);
}

// 消除閃爍(下面這兩行代碼可寫可不寫,因為還沒實現解決閃爍這個問題,有興趣的可以自己解決閃爍問題)
public void update(Graphics g) {
paint(g);
}

private boolean isEated() {
// TODO Auto-generated method stub
if (RedX == randomx && RedY == randomy) {
return true;
} else {
return false;
}

}

// 小球移動
public void move() {
System.out.println(body.length);
long millis = 600; // 每隔300毫秒刷新一次
run = new Thread() {
public void run() {
while (true) {
try {
System.out.println("public void Thread:" + Thread.currentThread().getName());
Thread.sleep(millis);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!pause) {
// 移動
if (direction == "L") {
if (RedX >= 40)
RedX -= 20;
}
if (direction == "R") {
if (RedX <= 340)
RedX += 20;
}
if (direction == "U") {
if (RedY >= 60)
RedY -= 20;
}
if (direction == "D") {
if (RedY <= 340)
RedY += 20;
}
System.out.println("body_length====" + body_length);

if (RedX == randomx && RedY == randomy) {
body_length++;
body[body_length - 1].x = randomx;
body[body_length - 1].y = randomy;
System.out.println("body[body_length-1].x" + body[body_length - 1].x);
System.out.println(body[body_length - 1].y);
}

// 身體刷新
for (int i = body_length - 1; i > 0; i--) {
body[i].x = body[i - 1].x;
body[i].y = body[i - 1].y;

}
// 給球頭換顏色
if (RedY == 40 && RedX == 20) {
color = Color.blue;
}
if (RedX == 80 && RedY == 120) {
color = Color.RED;
}
if (RedY == 220 && RedX == 220) {
color = Color.PINK;
}
repaint();

}
}
}
};

run.start();
}

// 生產食物
public void produceFood() {
boolean flag = true;
Random r = new Random();
randomx = (r.nextInt(18) + 1) * 20;
randomy = (r.nextInt(17) + 2) * 20;

while (flag) {
for (int i = 0; i < body_length; i++) {
if (body[i].x == randomx && body[i].y == randomy) {
// 如果生產的食物在球身上,那么就重新生產
randomx = (r.nextInt(18) + 1) * 20;
randomy = (r.nextInt(17) + 2) * 20;
flag = true;
break;
} else {
if (i == body_length - 1) {
flag = false;
}
}
}
}
}

}

public class BallMove {
public static void main(String[] args) {

BallThread Ball = new BallThread();
Ball.move();

}
}

 

如果你有其他想法或建議,寫下來:我們一塊討論啊!!!!!!!!!!!!!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM