//这个程序是对上一个改进 去掉了上一个用到的链表的,改用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();
}
}
//用到的图片