针对上个程序的改进 —— 贪吃蛇

来源:互联网 发布:nero9刻录软件免费下载 编辑:程序博客网 时间:2024/05/29 18:59

//这个程序是对上一个改进   去掉了上一个用到的链表的,改用LinkedList  ,还用到了Canvas,整体结构更加清晰 代码更简单些。

//参考了别人的一些地方,但是个人独立完成,编写过程中不曾看过别人代码!请大家放心看


//Food


package com.haiwnagch;


import java.awt.*;
import java.util.*;


public class Food {
private int r;
private int c;
private int maxr;
private int maxc;
Random rand = new Random();
public Food(int maxr, int maxc){
this.maxr = maxr;
this.maxc = maxc;
foodLocation();
}

public void foodLocation(){
r = rand.nextInt(maxr-2);
c = rand.nextInt(maxc-2);
}

public void draw(Graphics g){
Color color = g.getColor();
g.setColor(Color.RED);
g.drawRect(r*10, c*10, 10, 10);
g.setColor(color);
}

public int getr(){
return r;
}

public int getc(){
return c;
}
}


//Snake


package com.haiwnagch;


import java.awt.*;
import java.util.*;


public class Snake {
private  int  score;
// private int r;
// private int c;
private int maxr;
private int maxc;
private SnakeFrame sf;
private boolean live =true;
Point head;
Point tail;
LinkedList<Point> points = new LinkedList<Point>();
enum Dir{U, D, L, R}
Dir dir = Dir.U;
public Snake(int maxr, int maxc, SnakeFrame sf){
this.maxr = maxr;
this.maxc = maxc;
this.sf = sf;
initilize();
}

public void initilize(){
int r = maxr/2;
int c = maxc/2;
for(int i = 0; i<5; i++){
points.addFirst(new Point(r,c));
r++;
//System.out.println(1);
}
}

public void move(){
head = points.getFirst();
tail = points.getLast();
int r = head.x;
int c = head.y;
switch (dir) {
case U:
c--;
if(c==0){
c = maxc;
}
break;
case D:
c++;
if(c == maxc){
c = 0;
}
break;
case L:
r--;
if(r == 0){
r = maxr;
}
break;
case R:
r++;
if(r == maxr){
r = 0;
}
break;
}

points.addFirst(new Point(r,c));

if(!eat(sf.food)){
points.removeLast();
}
test1();
}

public boolean test(){
head = points.getFirst();
Iterator<Point> it = points.iterator();
Point point = it.next();
while(it.hasNext()){
if(head.x == point.x && head.y == point.y){
live = false;
}
}
return live;
}

public boolean test1(){
head = points.getFirst();
for(int i = 1; i<points.size();i++){
if(head.x == points.get(i).x && head.y == points.get(i).y){
live = false;
}
}
return live;
}
public boolean eat(Food food){
head = points.getFirst();
if(head.x == food.getr() && head.y == food.getc()){
food.foodLocation();

score+=5;

return true;
}
return false;
}

public boolean getLive(){
return live;
}
public int getScore(){
return score;
}
public void draw(Graphics g){
Point point;

g.drawImage(sf.image, 0, 0, sf);
move();
Iterator<Point> it = points.iterator();
while(it.hasNext()){
point = it.next();
g.fillOval(point.x*10, point.y*10, 10, 10);
}

}
}


//SnakeFrame


package com.haiwnagch;


import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import java.security.Key;


import javax.swing.*;
public class SnakeFrame extends JFrame implements KeyListener, ActionListener, Runnable{

private JLabel jlabel;
private JButton jbkg;
private JButton jiasu;
private JButton jiansu;
private Canvas canvas;
private JPanel jpanel1;
private JPanel jpanel2;
private int sudu = 200;
private int suducansu = 2;
private boolean live = true;
private boolean stop = false; 
public static final int WIDTH = 400;
public static final int HEIGTH = 400;
Snake s;
Food food;
Image image;

public SnakeFrame(){
jpanel1 = new JPanel(new BorderLayout());
jpanel2 = new JPanel(new GridLayout(1,3));
jlabel = new JLabel();
jbkg = new JButton("开始/暂停");
jiasu = new JButton("加速");
jiansu = new JButton("减速");
canvas = new Canvas();
canvas.setFocusable(true);
canvas.setSize(WIDTH, HEIGTH);
s = new Snake(WIDTH/10, HEIGTH/10, this);
food = new Food(WIDTH/10, HEIGTH/10); 
URL url = this.getClass().getResource("bk.jpg");
image = new ImageIcon(url).getImage();
}

public void initilize(){
jpanel2.add(jbkg);
jpanel2.add(jiasu);
jpanel2.add(jiansu);
jpanel1.add(jlabel, BorderLayout.NORTH);
jpanel1.add(canvas,BorderLayout.CENTER);
jpanel1.add(jpanel2, BorderLayout.SOUTH);
canvas.addKeyListener(this);
//addKeyListener(this);
jbkg.addActionListener(this);
jiasu.addActionListener(this);
jiansu.addActionListener(this);


}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() =="加速"){
sudu = sudu/suducansu;
canvas.requestFocus();
}
else if(e.getActionCommand() == "减速"){
sudu = sudu*suducansu;
canvas.requestFocus();
}
else if(e.getActionCommand() == "开始/暂停"){
stop = !stop;
canvas.requestFocus();
}

}


@Override
public void keyTyped(KeyEvent e) {
// TODO 自动生成的方法存根

}


@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_UP:
if(s.dir != Snake.Dir.D){
s.dir = Snake.Dir.U;
}
break;
case KeyEvent.VK_DOWN:
if(s.dir != Snake.Dir.U){
s.dir = Snake.Dir.D;
}
break;
case KeyEvent.VK_LEFT:
if(s.dir != Snake.Dir.R){
s.dir = Snake.Dir.L;
}
break;
case KeyEvent.VK_RIGHT:
if(s.dir != Snake.Dir.L){
s.dir = Snake.Dir.R;
}
break;
}

}


@Override
public void keyReleased(KeyEvent e) {
// TODO 自动生成的方法存根

}

public void showFrame(){
initilize();
this.setTitle("贪吃蛇");
getContentPane().add(jpanel1);
this.setSize(400,500);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


}

public void repaint(){
Graphics g = canvas.getGraphics();
if(s.getLive()){
s.draw(g);
s.eat(food);
jlabel.setText("得分: " +s.getScore());
food.draw(g);
}

else{
Font font = new Font("楷体", Font.BOLD, 40);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("GAME OVER", WIDTH/4, HEIGTH/2);
}


@Override
public void run() {
while(live){
if(!stop){
repaint();
}
try {
Thread.sleep(sudu);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public static void main(String[] agrs){
SnakeFrame sf = new SnakeFrame();
sf.showFrame();
new Thread(sf).start();
}




}


//用到的图片





0 0
原创粉丝点击