闲来无聊,想找点事干。突然想起上学时烂尾了的贪吃蛇,好久没看,加上写的贼烂于是便从头再试一试。先去网上找了找现成的,怪我太懒,改都懒得改。虽然不是完整版,但还是给了我好多帮助。
下面是从网上复制过来的:(有点不一样)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class InterFace extends JFrame {
/**
*
*/
private static final long serialVersionUID = 123;
public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 70, L = 1, R = 2, U = 3, D = 4;
BufferedImage offersetImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);
Snake snake;
Node node;
public InterFace() {
snake = new Snake(null);
createNode();
this.setBounds(0, 0, WIDTH, HEIGHT);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent arg0) {
// System.out.println(arg0.getKeyCode());
switch (arg0.getKeyCode()) {
case KeyEvent.VK_LEFT:
snake.dir = L;
break;
case KeyEvent.VK_RIGHT:
snake.dir = R;
break;
case KeyEvent.VK_UP:
snake.dir = U;
break;
case KeyEvent.VK_DOWN:
snake.dir = D;
}
}
});
this.setTitle(“贪吃蛇 0.1 By : Easy”);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
new Thread(new ThreadUpadte()).start();
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.red);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height);
if (snake.hit(node)) {
createNode();
}
snake.draw(g2d);
node.draw(g2d);
g.drawImage(offersetImage, 0, 0, null);
}
class ThreadUpadte implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void createNode() {
int x = (int) (Math.random() * 650) + 50, y = (int) (Math.random() * 500) + 50;
Color color = Color.red;
node = new Node(x, y, color);
}
public static void main(String args[]) {
new InterFace();
}
}
class Node {
int x, y, width = 15, height = 15;
Color color;
public Node(int x, int y, Color color) {
this(x, y);
this.color = color;
}
public Node(int x, int y) {
this.x = x;
this.y = y;
this.color = Color.black;
}
public void draw(Graphics2D g2d) {
g2d.setColor(color);
g2d.drawRect(x, y, width, height);
}
public Rectangle getRect() {
return new Rectangle(x, y, width, height);
}
}
class Snake {
public List
InterFace interFace;
int dir = InterFace.R;
public Snake(InterFace interFace) {
this.interFace = interFace;
nodes.add(new Node(20 + 150, 40 + 150));
addNode();
}
public boolean hit(Node node) {
for (int i = 0; i < nodes.size(); i++) {
if (nodes.get(i).getRect().intersects(node.getRect())) {
addNode();
return true;
}
}
return false;
}
public void draw(Graphics2D g2d) {
for (int i = 0; i < nodes.size(); i++) {
nodes.get(i).draw(g2d);
}
move();
}
public void move() {
nodes.remove((nodes.size() - 1));
addNode();
}
public synchronized void addNode() {
Node nodeTempNode = nodes.get(0);
switch (dir) {
case InterFace.L:
if (nodeTempNode.x <= 20) {
nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width,
nodeTempNode.y));
break;
case InterFace.R:
if (nodeTempNode.x >= 20 + 15 * 50 - nodeTempNode.width) {
nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width, nodeTempNode.y));
break;
case InterFace.U:
if (nodeTempNode.y <= 40) {
nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height));
break;
case InterFace.D:
if (nodeTempNode.y >= 40 + 15 * 35 - nodeTempNode.height) {
nodeTempNode = new Node(nodeTempNode.x, 40 - nodeTempNode.height);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));
break;
}
}
}
下面这个是我费了一整天才搞出来的半成品:(下面有改进过的版本,虽然这个也能跑一会)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;
public class Eatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4,
SLEEPTIME = 100, AX = 50, AY = 35, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A,
width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1,
grade = 0, c = 0, px = 0, py = 0;
int cc[][] = new int[AX * AY][2];
BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数
public Eatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
keyboard = D;
break;
case KeyEvent.VK_UP:
keyboard = U;
break;
case KeyEvent.VK_LEFT:
keyboard = L;
break;
case KeyEvent.VK_RIGHT:
keyboard = R;
break;
}
}
});
}
class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
cc[++c][0] = x;
cc[c][1] = y;
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
for (int i = c; i > c - length; i–) {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
g2d.setColor(Color.green);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}
public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}
public static void main(String[] args) {
new Eatsnake();
}
}
里面用数组来记录脑袋之前走过的路(用来实现增长),运行一会就会炸(数组大小固定的,到头就塞不进去了)。所以又改了改,到头再折回去,应该能一直运行下去了。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;
public class Eatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4, SLEEPTIME = 100, AX = 50, AY = 35, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A, width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1, grade = 0, c = 0, px = 0, py = 0;
int cc[][] = new int[AX * AY][2];
BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数
public Eatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
keyboard = D;
break;
case KeyEvent.VK_UP:
keyboard = U;
break;
case KeyEvent.VK_LEFT:
keyboard = L;
break;
case KeyEvent.VK_RIGHT:
keyboard = R;
break;
}
}
});
}
class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
c += 1;
if (c < AX * AY) {
cc[c][0] = x;
cc[c][1] = y;
} else {
cc[0][0] = x;
cc[0][1] = y;
c = 0;
}
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
for (int i = c; i > c - length; i–) {
if (i < 0) {
int r = AX * AY + i;
g2d.fillRect(RX + cc[r][0] * A, RY + cc[r][1] * A, A, A);
}
else {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
}
g2d.setColor(Color.green);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}
public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}
public static void main(String[] args) {
new Eatsnake();
}
}
但还是没编蛇头碰身子的东东,就这样了,实在懒得弄了😂
我这个版本虽然有点乱,但是因为我的编码水平和大多新手相近,应该更好理解一点吧。。。
又改了改,让蛇自己动,看个乐子了,感觉有点吃配置。编蛇头碰身子的东东是不可能做的
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;
public class AIEatsnake extends JFrame {
private static final long serialVersionUID = 1L;
public static final int L = 1, R = 2, U = 3, D = 4, SLEEPTIME = 10, AX = 80, AY = 45, A = 20, RX = 20, RY = 50;
// AX为横向格子个数,A为格子边长,RX为窗口框到矩形框的横向距离
// SLEEPTIME调整刷新时间,调高以缓解运行压力<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Random CC = new Random();
int keyboard = R, rwidth = AX * A, rheight = AY * A, width = rwidth + 2 * RX, height = rheight + RY + RX;
int x = AX / 3, y = AY / 2, length = 1, grade = 0, c = 0, px = 0, py = 0;
//int max = 50;
int max = AX * AY;
// 这里的“AX * AY”是蛇的长度上限,可以自定一个<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
int cc[][] = new int[max][2];
BufferedImage offersetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Rectangle rect = new Rectangle(RX, RY, AX * A, AY * A);
// 矩形外框参数
public AIEatsnake() {
createegg();
new Thread(new Thread1()).start();
// 新建一个线程“Thread1”用于一直循环
setBounds(0, 0, width, height);
// 等同于this.setBounds(0, 0, width,height);this关键字是用来调用当前类的方法,不写this编译器会自动补上
setTitle(“贪吃蛇 BY:CC2001”);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
class Thread1 implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(SLEEPTIME);
c += 1;
if (c < max) {
cc[c][0] = x;
cc[c][1] = y;
} else {
cc[0][0] = x;
cc[0][1] = y;
c = 0;
}
if (x == AX || y == AY || x < 0 || y < 0) {
grade = 0;
x = AX / 3;
y = AY / 2;
length = 1;
keyboard = R;
c = 1;
}
if (x == px) {
if (y < py) {
keyboard = D;
} else {
keyboard = U;
}
} else if (x < px) {
keyboard = R;
} else {
keyboard = L;
}
// 让蛇自己动的代码
switch (keyboard) {
case D:
y += 1;
break;
case U:
y -= 1;
break;
case L:
x -= 1;
break;
case R:
x += 1;
break;
}
if (x == px && y == py) {
createegg();
grade += 10;
if (length <= max)
length += 1;
}
repaint();
System.out.println(c + “ x:” + cc[c][0] + “ y:” + cc[c][1]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.black);
g2d.fillRect(0, 0, width, height);
g2d.setColor(Color.white);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height); // 画矩形外框
g2d.drawString(“分数:” + grade + “ X:” + x + “ Y:” + y, 10, 45);
g2d.setColor(Color.green);
for (int i = c; i > c - length; i–) {
if (i < 0) {
int r = max + i;
g2d.fillRect(RX + cc[r][0] * A, RY + cc[r][1] * A, A, A);
} else {
g2d.fillRect(RX + cc[i][0] * A, RY + cc[i][1] * A, A, A);
}
}
g2d.setColor(Color.white);
g2d.fillRect(RX + x * A, RY + y * A, A, A);
g2d.setColor(Color.yellow);
g2d.fillRect(RX + px * A, RY + py * A, A, A);
g.drawImage(offersetImage, 0, 0, null);
}
public void createegg() {
px = CC.nextInt(AX);
py = CC.nextInt(AY);
}
public static void main(String[] args) {
new AIEatsnake();
}
}
还是挺有意思的东东😁