学习目标:
一周内完成用JAVA实现贪吃蛇小游戏
学习内容:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握图形界面以及键盘监听
4、 掌握节点的随机生成
学习时间:
1、 周一至周五早 8点30—上午11点30
2、 周日下午 1点30-下午 4 点30
学习产出:
代码:
import javax.swing.;
import java.awt.;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;
public class MainFrame extends JFrame {
private Snake snake;
private Timer timer;
private JPanel jpanel;
private Node food;
public MainFrame() throws HeadlessException{
//初始化窗体参数
initFrame();
initGamePanel();
initSnake();
iniFood();
initTimer();
setKeyListener();
}
private void iniFood() {
food=new Node();
food.random();
}
//设置键盘监听
private void setKeyListener() {
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
//当键盘按下时会自动调用此方法
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_UP:
if(snake.getDirection()!=Direction.DOWN){
snake.setDirection(Direction.UP);
}
//修改蛇的运动方向
break;
case KeyEvent.VK_DOWN:
if(snake.getDirection()!=Direction.UP){
snake.setDirection(Direction.DOWN);
}
break;
case KeyEvent.VK_LEFT:
if(snake.getDirection()!=Direction.RIGHT){
snake.setDirection(Direction.LEFT);
}
break;
case KeyEvent.VK_RIGHT:
if(snake.getDirection()!=Direction.LEFT){
snake.setDirection(Direction.RIGHT);
}
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
private void initTimer() {
timer=new Timer();
TimerTask timerTask=new TimerTask(){
@Override
public void run() {
snake.move();
//判断蛇头是否吃到食物
Node head= snake.getBody().getFirst();
if(head.getX()==food.getX()&&head.getY()==food.getY()){
snake.eat(food);
food.random();
}
jpanel.repaint();
}
};
timer.scheduleAtFixedRate(timerTask,0,100);
}
private void initSnake() {
snake=new Snake();
}
private void initGamePanel() {
jpanel=new JPanel(){
public void paint(Graphics g){
g.clearRect(0,0,600,600);
//super.paint(g);
for(int i=0;i<40;i++){
g.drawLine(0,i*15,600,i*15);
}
for(int i=0;i<40;i++){
g.drawLine(i*15,0,i*15,600);
}
//绘制蛇
LinkedList<Node> body=snake.getBody();
for(Node node:body){
g.fillRect(node.getX()*15,node.getY()*15,11,11);
}
g.fillRect(food.getX()*15, food.getY()*15,15, 15);
}
};
//把棋盘添加到窗体里
add(jpanel);
}
private void initFrame() {
setSize(610,640);
setLocation(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
}
public static void main(String[] args){
new MainFrame().setVisible(true);
}
}public class Snake {
private LinkedList body;
private Direction direction = Direction.LEFT;
private boolean isLiving = true;
public Snake() {
initSnake();
}
private void initSnake() {
//创建集合
body = new LinkedList<>();
//创建6个节点
body.add(new Node(16, 20));
body.add(new Node(17, 20));
body.add(new Node(18, 20));
body.add(new Node(19, 20));
body.add(new Node(20, 20));
body.add(new Node(21, 20));
}
public void move() {
Node head;
if (isLiving) {
head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
body.removeLast();
//判断蛇是否撞墙
head = body.getFirst();
if (head.getX() < 0 || head.getY() < 0 || head.getX() >= 40 || head.getY() >= 40) {
isLiving = false;
}
for (int i = 1; i < body.size(); i++) {
Node node = body.get(i);
if (head.getX() == node.getX() && head.getY() == node.getY()) {
isLiving = false;
}
}
if(isLiving==false){
}
}
}
public LinkedList<Node> getBody() {
return body;
}
public void setBody(LinkedList<Node> body) {
this.body = body;
}
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
//吃食物
public void eat(Node food) {
Node head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
}
}
public enum Direction {
UP,DOWN,LEFT,RIGHT
}
public class Node {
private int x;
private int y;
public Node(int x,int y){
this.x=x;
this.y=y;
}
public Node() {
}
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 void random(){
Random r=new Random();
//生成横坐标
this.x=r.nextInt(40);
//随机生成纵坐标
this.y=r.nextInt(40);
}
}
结果: