经典题:贪吃蛇

贪吃蛇代码块:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Snake extends JPanel {
private static final long serialVersionUID = 1L;

// 地图的行数和列数  
private int row = 25;  
private int col = 25;  

// 小蛇的大小 */
private int size = 20;  

// 小蛇头部坐标  
private int snakeX;  
private int snakeY;  

// 方向  
private String fangxiang = "R";  

// 小蛇的节点  
private int sizetmp = 4;  
private int[][] snake = new int[row * col][2];  

// 食物  
private int foodX;  
private int foodY;  

// 设置分数  
private int score = 0;  

public Snake() {  
    initGame();  
}  

public void initGame() {  
    // 小蛇的初始位置  
    snake[0][0] = 6;  
    snake[0][1] = 6;  
    snake[1][0] = 5;  
    snake[1][1] = 6;  
    snake[2][0] = 4;  
    snake[2][1] = 6;  
    snake[3][0] = 3;  
    snake[3][1] = 6;  

    // 小蛇头部的位置  
    snakeX = snake[0][0] * size;  
    snakeY = snake[0][1] * size;  

    // 食物的位置  
    foodX = (int) (Math.random() * row) * size;  
    foodY = (int) (Math.random() * col) * size;  

}  

@Override
protected void paintComponent(Graphics g) {  
    // 画背景  
    g.fillRect(0, 0, size * row, size * col);  

    // 画小蛇身子  
    g.setColor(Color.BLACK);  
    for (int i = 0; i < sizetmp; i++) {  
        g.fill3DRect(snake[i][0] * size, snake[i][1] * size, size - 1,  
                size - 1, true);  
    }  

    // 画小蛇头  
    switch (fangxiang) {  
    case "U":  
        g.fill3DRect(snakeX, snakeY - size, size - 1, size - 1, true);  
        break;  
    case "D":  
        g.fill3DRect(snakeX, snakeY + size, size - 1, size - 1, true);  
        break;  
    case "L":  
        g.fill3DRect(snakeX - size, snakeY, size - 1, size - 1, true);  
        break;  
    case "R":  
        g.fill3DRect(snakeX + size, snakeY, size - 1, size - 1, true);  
        break;  
    default:  
        break;  
    }  

    // 画食物  
    g.fillOval(foodX, foodY, size, size);  
}  

public void move() {  
    // 让小蛇头移动  
    switch (fangxiang) {  
    case "U":  
        snakeY -= size;  
        break;  
    case "D":  
        snakeY += size;  
        break;  
    case "L":  
        snakeX -= size;  
        break;  
    case "R":  
        snakeX += size;  
        break;  
    default:  
        break;  
    }  

    sessionOver();  

    // 吃到食物,小蛇变长  
    if (snakeX == foodX && snakeY == foodY) {  
        sizetmp++;  
        score += 10;  
        foodX = (int) (Math.random() * row) * size;  
        foodY = (int) (Math.random() * col) * size;  
    }  

    // 把小蛇的头记录到数组里
    snake[0][0] = snakeX / size;  
    snake[0][1] = snakeY / size;  

    // 移动小蛇的节点
    for (int i = sizetmp - 1; i > 0; i--) {  
        snake[i][0] = snake[i - 1][0];  
        snake[i][1] = snake[i - 1][1];  
    }  

}  

public void sessionOver() {  
    // 撞墙  
    if (snakeX < 0 || snakeX > row * size - size || snakeY < 0  
            || snakeY > col * size - size) {  
        initGame();  
        sizetmp = 4;  
    }  

    // 撞自己  
    for (int i = 4; i < sizetmp; i++) {  
        if (snakeX == snake[i][0] * size  
                && snakeY == snake[i][1] * size) {  
            initGame();  
            sizetmp = 4;  
        }  
    }  
}  

public static void main(String[] args) {  
    JFrame frame = new JFrame("贪吃蛇");  
    Snake snake = new Snake();  
    frame.add(snake);  
    frame.setSize(500, 500);  

    // 不可改变大小  
    frame.setResizable(false);  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.setVisible(true);  

    // 控制移动  
    frame.addKeyListener(new KeyListener() {  
        public void keyTyped(KeyEvent e) {  
        }  
        public void keyReleased(KeyEvent e) {  
        }  

        public void keyPressed(KeyEvent e) {  
            int keycodes = e.getKeyCode();  

            switch (keycodes) {  
            case KeyEvent.VK_UP:  
                snake.fangxiang = "U";  
                break;  
            case KeyEvent.VK_DOWN:  
                snake.fangxiang = "D";  
                break;  
            case KeyEvent.VK_LEFT:  
                snake.fangxiang = "L";  
                break;  
            case KeyEvent.VK_RIGHT:  
                snake.fangxiang = "R";  
                break;  
            default:  
                break;  
            }  
        }  
    });  

    // 移动和刷新  
    while (true) {  
        try {  
            snake.move();  
            Thread.sleep(200);  
            snake.repaint();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}  
}
posted @ 2023-10-17 21:03  JenckMin  阅读(9)  评论(0编辑  收藏  举报