求一份java 贪吃蛇的代码
//文件1importjavax.swing.*;importjava.awt.*;importjava.util.*;importjava.awt.event.*;pu...
//文件1
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class aa extends JPanel implements Runnable,KeyListener
{
Points p=new Points(50,50);
//ArrayList ls=new ArrayList();
int direction=0;//0 -right 1-left 2-down 3-up
public aa(){
//ls.add(p);
addKeyListener(this);
}
public void paint(Graphics g)
{
move(direction);
super.paintComponent(g);
int x=p.getX();
int y=p.getY();
g.fillRect(x,y,9,9);
g.fillRect(x+10,y,9,9);
g.fillRect(x+20,y,9,9);
g.fillRect(x+30,y,9,9);
}
public void keyPressed(KeyEvent e)
{
//决定方向
if(e.getKeyCode()==KeyEvent.VK_DOWN && direction!=2 && direction!=3)
{
direction=2;
}
if(e.getKeyCode()==KeyEvent.VK_UP && direction!=3 && direction!=2)
direction=3;
if(e.getKeyCode()==KeyEvent.VK_RIGHT && direction!=0 && direction!=1)
direction=0;
if(e.getKeyCode()==KeyEvent.VK_LEFT && direction!=1 && direction!=0)
direction=1;
}
public void move(int d){
int x=p.getX();
int y=p.getY();
if(d==0)
{
x=x+10;
}
if(d==1)
{
x=x-10;
}
if (d==2)
{
y=y+10;
}
if(d==3)
{
y=y-10;
}
p.setX(x);
p.setY(y);
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void run()
{
while (true)
{
//需要改变每个方块的位置
//这里最重要改变头的位置
//设一个成员变量,4个值,决定蛇移动的方向
repaint();
try{
Thread.sleep(200);
}catch(Exception ee){
}
}
}
}
//文件2
public class Points
{
int x,y;
public Points(int x,int y)
{
this.x=x;
this.y=y;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void setX(int x)
{
this.x=x;
}
public void setY(int y)
{
this.y=y;
}
}
//文件3
import javax.swing.*;
import java.awt.event.*;
public class bb extends JFrame
{
aa p=new aa();
JButton jbn=new JButton("开始");
public bb()
{
getContentPane().add(p,"Center");
getContentPane().add(jbn,"South");
jbn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
p.requestFocus(true);
(new Thread(p)).start();
}
});
setVisible(true);
setSize(400,200);
validate();
}
public static void main(String args[])
{
new bb();
}
}
能用我给的三个文件写吗?能的追加悬赏...谢谢 展开
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class aa extends JPanel implements Runnable,KeyListener
{
Points p=new Points(50,50);
//ArrayList ls=new ArrayList();
int direction=0;//0 -right 1-left 2-down 3-up
public aa(){
//ls.add(p);
addKeyListener(this);
}
public void paint(Graphics g)
{
move(direction);
super.paintComponent(g);
int x=p.getX();
int y=p.getY();
g.fillRect(x,y,9,9);
g.fillRect(x+10,y,9,9);
g.fillRect(x+20,y,9,9);
g.fillRect(x+30,y,9,9);
}
public void keyPressed(KeyEvent e)
{
//决定方向
if(e.getKeyCode()==KeyEvent.VK_DOWN && direction!=2 && direction!=3)
{
direction=2;
}
if(e.getKeyCode()==KeyEvent.VK_UP && direction!=3 && direction!=2)
direction=3;
if(e.getKeyCode()==KeyEvent.VK_RIGHT && direction!=0 && direction!=1)
direction=0;
if(e.getKeyCode()==KeyEvent.VK_LEFT && direction!=1 && direction!=0)
direction=1;
}
public void move(int d){
int x=p.getX();
int y=p.getY();
if(d==0)
{
x=x+10;
}
if(d==1)
{
x=x-10;
}
if (d==2)
{
y=y+10;
}
if(d==3)
{
y=y-10;
}
p.setX(x);
p.setY(y);
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void run()
{
while (true)
{
//需要改变每个方块的位置
//这里最重要改变头的位置
//设一个成员变量,4个值,决定蛇移动的方向
repaint();
try{
Thread.sleep(200);
}catch(Exception ee){
}
}
}
}
//文件2
public class Points
{
int x,y;
public Points(int x,int y)
{
this.x=x;
this.y=y;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void setX(int x)
{
this.x=x;
}
public void setY(int y)
{
this.y=y;
}
}
//文件3
import javax.swing.*;
import java.awt.event.*;
public class bb extends JFrame
{
aa p=new aa();
JButton jbn=new JButton("开始");
public bb()
{
getContentPane().add(p,"Center");
getContentPane().add(jbn,"South");
jbn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
p.requestFocus(true);
(new Thread(p)).start();
}
});
setVisible(true);
setSize(400,200);
validate();
}
public static void main(String args[])
{
new bb();
}
}
能用我给的三个文件写吗?能的追加悬赏...谢谢 展开
4个回答
展开全部
package games;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
*/
public class Snake extends JPanel {
private static final long serialVersionUID = 1L;
private Direction dir;// 要走的方向
private int blockWidth = 10;// 块大小
private int blockSpace = 2;// 块之间的间隔
private long sleepTime;// 重画的进间间隔
private MySnake my;
private int total;// 代表蛇的长度
private Rectangle food;// 代表蛇的食物
private volatile boolean go;
private int round;// 表示第几关
public Snake(JFrame jf) {
initOther();
// 为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
int code = ke.getKeyCode();
if (code == KeyEvent.VK_RIGHT) {
if (dir != Direction.WEST)
dir = Direction.EAST;
}
else if (code == KeyEvent.VK_LEFT) {
if (dir != Direction.EAST)
dir = Direction.WEST;
}
else if (code == KeyEvent.VK_UP) {
if (dir != Direction.SOUTH)
dir = Direction.NORTH;
}
else if (code == KeyEvent.VK_DOWN) {
if (dir != Direction.NORTH)
dir = Direction.SOUTH;
} else if (code == KeyEvent.VK_ENTER) {
if (!go)
initOther();
}
}
});
this.setBounds(300, 300, 400, 400);
this.setVisible(true);
}
// 随机生成一个食物的位置
private void makeFood() {
int x = 40 + (int) (random() * 30) * 12;
int y = 10 + (int) (random() * 30) * 12;
food = new Rectangle(x, y, 10, 10);
}
// 做一些初始化的工作
private void initOther() {
dir = Direction.EAST;
sleepTime = 500;
my = new MySnake();
makeFood();
total = 3;
round = 1;
new Thread(new Runnable() {
public void run() {
go = true;
while (go) {
try {
Thread.sleep(sleepTime);
repaint();
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}).start();
}
// 处理多少关的函数
private void handleRound() {
if (total == 6) {
round = 2;
sleepTime = 300;
} else if (total == 10) {
round = 3;
sleepTime = 200;
} else if (total == 15) {
round = 4;
sleepTime = 100;
} else if (total == 18) {
round = 5;
sleepTime = 50;
} else if (total == 20) {
round = 6;
sleepTime = 20;
} else if (total > 21) {
round = 7;
sleepTime = 15;
}
}
// 把自己的组件全部画出来
public void paintComponent(Graphics g) {
g.setColor(Color.PINK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40, 10, 358, 360);
if (go) {
my.move();
my.draw(g);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("您的得分:" + (total * 10) + " 第" + round + "关", 40,
400);
} else {
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏结束,按回车(ENTER)键重玩!", 40, 440);
}
g.setColor(Color.RED);
g.fillRect(food.x, food.y, food.width, food.height);
}
private class MySnake {
private ArrayList<Rectangle> list;
public MySnake() {
list = new ArrayList<Rectangle>();
list.add(new Rectangle(160 + 24, 130, 10, 10));
list.add(new Rectangle(160 + 12, 130, 10, 10));
list.add(new Rectangle(160, 130, 10, 10));
}
// 蛇移动的方法
public void move() {
if (isDead()) {
go = false;
return;
}
if (dir == Direction.EAST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
+ (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.WEST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
- (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.NORTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
- (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
} else if (dir == Direction.SOUTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
+ (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
}
if (isEat()) {
handleRound();
makeFood();
} else {
list.remove(list.size() - 1);
}
}
// 判断是否吃到了食物
private boolean isEat() {
if (list.get(0).contains(food)) {
total++;
return true;
} else
return false;
}
// 判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead() {
Rectangle temp = list.get(0);
if (dir == Direction.EAST) {
if (temp.x == 388)
return true;
else {
Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.WEST) {
if (temp.x == 40)
return true;
else {
Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.NORTH) {
if (temp.y == 10)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.SOUTH) {
if (temp.y == 358)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else {
return false;
}
}
// 把自己画出来
public void draw(Graphics g) {
for (Rectangle rec : list) {
g.fillRect(rec.x, rec.y, rec.width, rec.height);
}
}
}
public static void main(String arsg[]) {
JFrame jf = new JFrame("贪吃蛇");
Snake s = new Snake(jf);
jf.getContentPane().add(s, BorderLayout.CENTER);
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// 定义一个枚举,在此也可以用接口或者常量值代替
enum Direction {
EAST, SOUTH, WEST, NORTH;
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
*/
public class Snake extends JPanel {
private static final long serialVersionUID = 1L;
private Direction dir;// 要走的方向
private int blockWidth = 10;// 块大小
private int blockSpace = 2;// 块之间的间隔
private long sleepTime;// 重画的进间间隔
private MySnake my;
private int total;// 代表蛇的长度
private Rectangle food;// 代表蛇的食物
private volatile boolean go;
private int round;// 表示第几关
public Snake(JFrame jf) {
initOther();
// 为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
int code = ke.getKeyCode();
if (code == KeyEvent.VK_RIGHT) {
if (dir != Direction.WEST)
dir = Direction.EAST;
}
else if (code == KeyEvent.VK_LEFT) {
if (dir != Direction.EAST)
dir = Direction.WEST;
}
else if (code == KeyEvent.VK_UP) {
if (dir != Direction.SOUTH)
dir = Direction.NORTH;
}
else if (code == KeyEvent.VK_DOWN) {
if (dir != Direction.NORTH)
dir = Direction.SOUTH;
} else if (code == KeyEvent.VK_ENTER) {
if (!go)
initOther();
}
}
});
this.setBounds(300, 300, 400, 400);
this.setVisible(true);
}
// 随机生成一个食物的位置
private void makeFood() {
int x = 40 + (int) (random() * 30) * 12;
int y = 10 + (int) (random() * 30) * 12;
food = new Rectangle(x, y, 10, 10);
}
// 做一些初始化的工作
private void initOther() {
dir = Direction.EAST;
sleepTime = 500;
my = new MySnake();
makeFood();
total = 3;
round = 1;
new Thread(new Runnable() {
public void run() {
go = true;
while (go) {
try {
Thread.sleep(sleepTime);
repaint();
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}).start();
}
// 处理多少关的函数
private void handleRound() {
if (total == 6) {
round = 2;
sleepTime = 300;
} else if (total == 10) {
round = 3;
sleepTime = 200;
} else if (total == 15) {
round = 4;
sleepTime = 100;
} else if (total == 18) {
round = 5;
sleepTime = 50;
} else if (total == 20) {
round = 6;
sleepTime = 20;
} else if (total > 21) {
round = 7;
sleepTime = 15;
}
}
// 把自己的组件全部画出来
public void paintComponent(Graphics g) {
g.setColor(Color.PINK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40, 10, 358, 360);
if (go) {
my.move();
my.draw(g);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("您的得分:" + (total * 10) + " 第" + round + "关", 40,
400);
} else {
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏结束,按回车(ENTER)键重玩!", 40, 440);
}
g.setColor(Color.RED);
g.fillRect(food.x, food.y, food.width, food.height);
}
private class MySnake {
private ArrayList<Rectangle> list;
public MySnake() {
list = new ArrayList<Rectangle>();
list.add(new Rectangle(160 + 24, 130, 10, 10));
list.add(new Rectangle(160 + 12, 130, 10, 10));
list.add(new Rectangle(160, 130, 10, 10));
}
// 蛇移动的方法
public void move() {
if (isDead()) {
go = false;
return;
}
if (dir == Direction.EAST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
+ (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.WEST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
- (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.NORTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
- (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
} else if (dir == Direction.SOUTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
+ (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
}
if (isEat()) {
handleRound();
makeFood();
} else {
list.remove(list.size() - 1);
}
}
// 判断是否吃到了食物
private boolean isEat() {
if (list.get(0).contains(food)) {
total++;
return true;
} else
return false;
}
// 判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead() {
Rectangle temp = list.get(0);
if (dir == Direction.EAST) {
if (temp.x == 388)
return true;
else {
Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.WEST) {
if (temp.x == 40)
return true;
else {
Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.NORTH) {
if (temp.y == 10)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.SOUTH) {
if (temp.y == 358)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else {
return false;
}
}
// 把自己画出来
public void draw(Graphics g) {
for (Rectangle rec : list) {
g.fillRect(rec.x, rec.y, rec.width, rec.height);
}
}
}
public static void main(String arsg[]) {
JFrame jf = new JFrame("贪吃蛇");
Snake s = new Snake(jf);
jf.getContentPane().add(s, BorderLayout.CENTER);
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// 定义一个枚举,在此也可以用接口或者常量值代替
enum Direction {
EAST, SOUTH, WEST, NORTH;
}
追问
谢谢你,但不是我给定的文件写的。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给邮箱我发给你,几百行。
更多追问追答
追问
576768765@qq.com
追答
代码发给你了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
代码太多,邮箱给我,发给你。
追问
576768765@qq.com
追答
发了,这个是以前上培训班老师给的,功能强大,你参考下改你的代码不成问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询