import java.awt.event.*;
import javax.swing.*;
public class View implements ActionListener{
JFrame frame=new JFrame();
JLabel sizeLabel=new JLabel("大小 ");
JTextField sizeText=new JTextField(8);
JLabel speedLabel=new JLabel("速度 ");
JTextField speedText=new JTextField(8);
JButton start=new JButton("开始游戏");
JPanel mainPanel=new JPanel();
public View(){
frame.add(mainPanel);
mainPanel.add(sizeLabel);
mainPanel.add(sizeText);
mainPanel.add(speedLabel);
mainPanel.add(speedText);
sizeText.setText("40");
speedText.setText("10");
mainPanel.add(start);
start.addActionListener(this);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent arg0) {
try{
int size=Integer.parseInt(sizeText.getText().trim());
int speed=Integer.parseInt(speedText.getText().trim());
frame.dispose();
new GameView(size, speed);
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, "请输入数字!");
sizeText.setText("40");
speedText.setText("10");
}
}
public static void main(String[] args) {
new View();
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;
public class GameView implements KeyListener {
JFrame frame=new JFrame();
private GameMap map;
JPanel mainPanel = new JPanel();
MyPanel drawPanel = new MyPanel();
boolean isOver=false;
int speed=1;
public GameView(int size,int speed) {
this.speed=(speed<=0?1:speed);
if(size<30||size>90){
size=40;
}
map = new GameMap(size);
drawPanel.setBounds(0, 0, 7*size, 7*size);
frame.add(drawPanel);
frame.addKeyListener(this);
frame.setTitle("贪吃蛇小游戏");
int x=7*size+10;
int y=7*size+36;
frame.setSize( x, y );
// frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Thread thread = new Thread(new MyRunnable());
thread.start();
if(isOver){
thread.stop();
}
}
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("press " +e.getKeyCode());
map.changeDire(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// System.out.println(e.getKeyCode());
// map.move(e.getKeyCode());
}
class MyRunnable implements Runnable {
@Override
public void run() {
while (true) {
isOver=map.move();
if(!isOver){
JOptionPane.showMessageDialog(null, "Game Over !");
frame.dispose();
new View();
return;
}
frame.repaint();
try {
Thread.sleep(1000/speed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g) {
int[][] mapArray = map.getValMap();
for (int i = 0; i < map.getN(); i++) {
for (int j = 0; j < map.getN(); j++) {
switch (mapArray[i][j]) {
case 0:
g.setColor(Color.WHITE);
break;
case 1:
g.setColor(Color.BLACK);
break;
case 2:
g.setColor(Color.RED);
break;
default:
break;
}
g.fillRect(7 * i, 7 * j, 7, 7);
}
}
frame.setTitle("贪吃蛇 得分:"+map.getScore());
}
}
public static void main(String[] args) {
new GameView(30,10);
}
}
import java.awt.event.KeyEvent;
public class GameMap {
private static int[][] valMap;
private int n;
private int max_length;
private Snake snake;
public GameMap(int n){
this.n=n;
valMap=new int[n][n];
max_length=n*n/2;
snake=new Snake(valMap,max_length);
this.creatFood();
}
public void creatFood(){
int x=this.getRandom();
int y=this.getRandom();
while(valMap[x][y]!=0){
x=this.getRandom();
y=this.getRandom();
}
valMap[x][y]=2;
}
public void changeDire(int i){
switch (i) {
case KeyEvent.VK_UP:
snake.setDire(Direction.UP);
break;
case KeyEvent.VK_DOWN:
snake.setDire(Direction.DOWN);
break;
case KeyEvent.VK_LEFT:
snake.setDire(Direction.LEFT);
break;
case KeyEvent.VK_RIGHT:
snake.setDire(Direction.RIGHT);
break;
default:
break;
}
}
public boolean move(){
this.valMap=snake.move();
if(null==valMap){
return false;
}
if(snake.isEat()){
this.creatFood();
snake.setEat(false);
}
return true;
}
private int getRandom(){
return (int)(Math.random()*n);
}
public static int[][] getValMap() {
return valMap;
}
public static void setValMap(int[][] valMap) {
GameMap.valMap = valMap;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
public int getMax_length() {
return max_length;
}
public void setMax_length(int max_length) {
this.max_length = max_length;
}
public Snake getSnake() {
return snake;
}
public void setSnake(Snake snake) {
this.snake = snake;
}
public int getScore() {
// TODO Auto-generated method stub
return snake.getNum();
}
}
import java.util.LinkedList;
public class Snake {
private Direction dire;
private LinkedList<Point> body;
private int[][] valMap;
private int max_length;
private boolean isEat=false;
private int num=0;
// private Point food;
public Snake(int[][] valMap, int max_length) {
dire = Direction.RIGHT;
body = new LinkedList<>();
this.valMap = valMap;
// body.add(new Point(0, 0));
this.addPoint(new Point(0, 0));
this.addPoint(new Point(1, 0));
this.addPoint(new Point(2, 0));
this.addPoint(new Point(3, 0));
this.addPoint(new Point(4, 0));
this.max_length = max_length;
}
public int[][] move() {
int x = body.getFirst().getX();
int y = body.getFirst().getY();
Point add;
switch (dire) {
case UP:
add = new Point(x, y - 1);
break;
case DOWN:
add = new Point(x, y + 1);
break;
case RIGHT:
add = new Point(x + 1, y);
break;
case LEFT:
add = new Point(x - 1, y);
break;
default:
add = null;
break;
}
int tmp = isVal(add);
if (tmp != -1) {
// body.addFirst(add);
this.addPoint(add);
if (tmp == 0) {
this.removePoint();
}
return valMap;
}
return null;
}
private void addPoint(Point p) {
body.addFirst(p);
valMap[p.getX()][p.getY()] = 1;
}
private void removePoint() {
Point p = body.getLast();
body.removeLast();
valMap[p.getX()][p.getY()] = 0;
}
private int isVal(Point add) {
if (null == add) {
return -1;
}
int x = add.getX();
int y = add.getY();
int n = valMap.length;
boolean val=x >= 0 && x < n && y >= 0 && y < n;
if(!val||valMap[x][y] == 1){
return -1;// 不合法移动
}
if (valMap[x][y] == 2 ) {
isEat=true;// 吃到食物
num++;
if(body.size() < max_length){
return 1;//增长
}
}
return 0;//不增长
}
public Direction getDire() {
return dire;
}
public void setDire(Direction dire) {
Direction opp = null;
switch (this.dire) {
case UP:
opp = Direction.DOWN;
break;
case DOWN:
opp = Direction.UP;
break;
case RIGHT:
opp = Direction.LEFT;
break;
case LEFT:
opp = Direction.RIGHT;
break;
default:
break;
}
if (dire != opp) {
this.dire = dire;
}
}
public boolean isEat() {
return isEat;
}
public void setEat(boolean isEat) {
this.isEat = isEat;
}
public LinkedList<Point> getBody() {
return body;
}
public void setBody(LinkedList<Point> body) {
this.body = body;
}
public int getNum() {
// TODO Auto-generated method stub
return num;
}
}
没变的部分:
public class Point {
private int x,y;
public Point(int x,int y){
this.x=x;
this.y=y;
}
public Point(){
x=0;
y=0;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean equals(Point p){
return (p.getX()==x)&&(p.getY()==y);
}
}
public enum Direction {
UP,DOWN,LEFT,RIGHT;
}