java貪食蛇遊戲

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
import java.util.Random;
public class MainClass extends JFrame 
{ ControlSnake control; 
  Toolkit kit;Dimension dimen;
  public static void main(String[] args)
{
new MainClass("貪食蛇");
 }
 public MainClass(String s) { 
super(s);
control = new ControlSnake();
  control.setFocusable(true);
kit = Toolkit.getDefaultToolkit(); 
dimen = kit.getScreenSize(); 
add(control);
setLayout(new BorderLayout());
setLocation(dimen.width/3, dimen.height/3);
setSize(FWIDTH, FHEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);
  setVisible(true);
  }
  public static final int FWIDTH = 400;
public static final int FHEIGHT = 450;}
class ControlSnake extends JPanel implements ActionListener {
Random rand;
ArrayList<Point> list, listBody;
String str, str1;
static boolean key;
int x, y, dx, dy, fx, fy, flag;
int snakeBody;
int speed;
public ControlSnake() { snakeBody = 1;
str = "上UP下DOWN左RIGHT右LEFT方向鍵控制 P鍵暫停";
str1 = "現在的長度爲:" + snakeBody;
key = true; flag = 1;
speed = 170;rand = new Random(); 
list = new ArrayList<Point>();
listBody = new ArrayList<Point>();
x = 5;
y = 5;
list.add(new Point(x, y));
  listBody.add(list.get(0));
dx = 10;
  dy = 0;
fx = rand.nextInt(30) * 10 + 5;
fy = rand.nextInt(30) * 10 + 5;
setBackground(Color.WHITE);
setSize(new Dimension(400, 500));
final Timer time = new Timer(speed, this);
time.start();
addKeyListener
(new KeyAdapter() 
{ public void keyPressed(KeyEvent e) 
{if (e.getKeyCode() == 37) { dx = -10; 
dy = 0;
} else if (e.getKeyCode() == 38) 
{ dx = 0;
dy = -10;}
else if (e.getKeyCode() == 39)
{ dx = 10;
dy = 0;
} else if (e.getKeyCode() == 40)
{ dx = 0;
dy = 10;
} else if 
(e.getKeyCode() == 80)
{ if (flag % 2 == 1) 
{ time.stop(); 
}if (flag % 2 == 0) 
{ time.start(); } flag++;
} } });
}
public void paint(Graphics g) 
{ g.setColor(Color.white);
g.fillRect(0, 0, 305, 305); 
g.setColor(Color.DARK_GRAY);
g.drawLine(3, 3, 305, 3);
g.drawLine(3, 3, 3, 305);
g.drawLine(305, 3, 305, 305);
g.drawLine(3, 305, 305, 305);
g.setColor(Color.pink);
for (int i = 0; i < listBody.size(); i++) 
{g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);
  }g.fillRect(x, y, 9, 9); 
g.setColor(Color.orange); g.fillRect(fx, fy, 9, 9);
g.setColor(Color.DARK_GRAY); 
str1 = "現在的長度爲:" + snakeBody;
g.drawString(str, 10, 320); 
g.drawString(str1, 10, 335);
}public void actionPerformed(ActionEvent e)
{ x += dx;
  y+= dy;
if (makeOut() == false) 
{ JOptionPane.showConfirmDialog(null,"重新開始?");
speed = 700; 
snakeBody = 1; 
x = 5;
y = 5;
list.clear();
list.add(new Point(x, y));
listBody.clear(); 
listBody.add(list.get(0));
dx = 10;
dy = 0; 
} addPoint(x, y);
  if (x == fx && y == fy)
{speed = (int) (speed * 0.8);
if (speed < 200) 
{ speed = 100; }
fx = rand.nextInt(30) * 10 + 5;
fy = rand.nextInt(30) * 10 + 5;
snakeBody=snakeBody+5;

repaint();
} public void addPoint(int xx, int yy)
{
if(list.size() < 100)
{
list.add(new Point(xx, yy));}
else
{list.remove(0); list.add(new Point(xx, yy)); } 
if (snakeBody == 1) {listBody.remove(0);
listBody.add(0, list.get(list.size() - 1));
}
else {listBody.clear();
if (list.size() < snakeBody) 
{for (int i = list.size() - 1; i > 0; i--)
{ listBody.add(list.get(i)); }}
else { for (int i = list.size() - 1;
listBody.size() < snakeBody; i--) 
{listBody.add(list.get(i));
} } } }
public boolean makeOut() 
{if ((x < 3 || y < 3) || (x > 305 || y > 305)) { return false; }
for (int i = 0; 
i < listBody.size() - 1; i++)
{for (int j = i + 1; j < listBody.size(); 
j++) {if (listBody.get(i).equals(listBody.get(j)))
{ return false; } } } return true;}}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章