9 创建了GameFrame和GamePanel两个类
Frame设定了title、关闭按钮、 窗体是否可以自由改变大小、构造数据模型允许paint。
Panel 设定了蛇和苹果,设定了延迟175,蛇和苹果位置用数组实现
package dd;
import javax.swing.*;
/**
* @author 郑道炫
* @version 1.0
*/
public class GameFrame extends JFrame {
GameFrame(){
GamePanel gamePanel = new GamePanel();
this.add(gamePanel);
this.setTitle("snake");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.pack();
this.setVisible(true);
this.setLocationRelativeTo(null);
}
}
package dd;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
/**
* @author 郑道炫
* @version 1.0
*/
public class GamePanel extends JPanel implements ActionListener {
static final int SCREEN_WIDTH = 800;
static final int SCREEN_HEIGHT = 700;
static final int UNIT_SIZE = 35;
static final int GAME_UNITS = (SCREEN_WIDTH * SCREEN_HEIGHT) / (UNIT_SIZE*UNIT_SIZE);
static final int DELAY = 175;
final int x[] = new int[GAME_UNITS];
final int y[] = new int[GAME_UNITS];
int bodyParts = 3;
int applesEaten;
int appleX;
int appleY;
char direction = 'R';
boolean running = false;
Timer timer;
Random randoms;
GamePanel() {
randoms = new Random();
this.setPreferredSize(new Dimension(SCREEN_WIDTH,SCREEN_HEIGHT));
this.setBackground(Color.black);
this.setFocusable(true);
this.addKeyListener(new MyKeyAdapter());
startGame();
}
public void startGame() {
newApple();
running = true;
timer = new Timer(DELAY, this);
timer.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
}
public void draw(Graphics g) {
if (running) {
// for (int i = 0; i < SCREEN_HEIGHT / UNIT_SIZE; i++) {
// g.drawLine(i * UNIT_SIZE, 0, i * UNIT_SIZE, SCREEN_HEIGHT);
// g.drawLine(0, i * UNIT_SIZE, SCREEN_WIDTH, i * UNIT_SIZE);
// }//用完表格取消
g.setColor(Color.red);
g.fillOval(appleX, appleY, UNIT_SIZE, UNIT_SIZE);
for (int i = 0; i < bodyParts; i++) {
if (i == 0) {
g.setColor(Color.green);
g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE);
} else {
g.setColor(new Color(45, 100, 0));
g.setColor(new Color(randoms.nextInt(255),randoms.nextInt(255),randoms.nextInt(255)));
g.fillRect(x[i], y[i], UNIT_SIZE, UNIT_SIZE);
}
}
g.setColor(Color.RED);
g.setFont(new Font("Ink Free", Font.BOLD, 40));
FontMetrics metrics1 = getFontMetrics(g.getFont());
g.drawString("Score: " + applesEaten,
(SCREEN_WIDTH - metrics1.stringWidth("Score" + applesEaten)) / 2,
g.getFont().getSize());
}else {
gameOver(g);
}
}
public void newApple() {
do{
appleX = randoms.nextInt((SCREEN_WIDTH / UNIT_SIZE)) * UNIT_SIZE;
appleY = randoms.nextInt((SCREEN_WIDTH / UNIT_SIZE)) * UNIT_SIZE;
} while (!(appleX/UNIT_SIZE >0&&appleX/UNIT_SIZE <SCREEN_WIDTH &&appleY/UNIT_SIZE >0&&appleY/UNIT_SIZE <SCREEN_HEIGHT));
}
public void move() {
for (int i = bodyParts; i > 0; i--) {
x[i] = x[i - 1];
y[i] = y[i - 1];
}
switch (direction) {
case 'U':
y[0] = y[0] - UNIT_SIZE;
break;
case 'D':
y[0] = y[0] + UNIT_SIZE;
break;
case 'L':
x[0] = x[0] - UNIT_SIZE;
break;
case 'R':
x[0] = x[0] + UNIT_SIZE;
break;
}
}
public void checkApple() {
if ((x[0] == appleX) && (y[0] == appleY)) {
bodyParts++;
applesEaten++;
newApple();
}
}
public void checkCollisions() {
//头撞到身体
for (int i = bodyParts; i > 0; i--) {
if ((x[0] == x[i]) && (y[0] == y[i])) {
running = false;
}
}
//头碰到左边的框框
if (x[0] < 0) {
running = false;
}
//头撞到右边
if (x[0] > SCREEN_WIDTH) {
running = false;
}
//头碰到上边的框框
if (y[0]<0){
running =false;
}
//头撞到下面的框框
if (y[0] > SCREEN_HEIGHT) {
running = false;
}
if (!running) {
timer.stop();
}
}
public void gameOver(Graphics g) {
//Game Over text
g.setColor(Color.RED);
g.setFont(new Font("Ink Free", Font.BOLD, 45));
FontMetrics metrics1 = getFontMetrics(g.getFont());
g.drawString("Score: " + applesEaten,
(SCREEN_WIDTH - metrics1.stringWidth("Score:" + applesEaten)) / 2,
g.getFont().getSize());
g.setFont(new Font("Ink Free", Font.BOLD, 75));
FontMetrics metrics2 = getFontMetrics(g.getFont());
g.drawString("gameOver ",
(SCREEN_WIDTH - metrics2.stringWidth("GameOver"))/2,SCREEN_HEIGHT/2);
}
@Override
public void actionPerformed(ActionEvent e) {
//TODO Auto-generated method stub
if (running) {
move();
checkApple();
checkCollisions();
}
repaint();
}
public class MyKeyAdapter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_A:
if (direction != 'R') {
direction = 'L';
}
break;
case KeyEvent.VK_D:
if (direction != 'L') {
direction = 'R';
}
break;
case KeyEvent.VK_W:
if (direction != 'D') {
direction = 'U';
}
break;
case KeyEvent.VK_S:
if (direction != 'U') {
direction = 'D';
}
break;
}
}
}
}
package dd;
/**
* @author 郑道炫
* @version 1.0
*/
public class snakebord {
public static void main(String[] args) {
//TODO Auto-generated method sub
GameFrame frame = new GameFrame();
}
}
效果
但是有一个技术问题吃到4个或者5个苹果后,苹果消失,在屏幕找不到,考虑是因为苹果座位表超出了整体frame。