经典题:贪吃蛇

简介: 一款基于Java Swing实现的贪吃蛇小游戏,通过方向键控制蛇移动,吃食物成长,撞墙或撞自身则游戏重置。代码结构清晰,适合学习GUI编程与游戏逻辑设计。

贪吃蛇代码块:

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();  
        }  
    }  
}  
}
相关文章
|
4天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1328 4
|
2天前
|
存储 弹性计算 应用服务中间件
2026年阿里云服务器新手租用全流程完整步骤教程(最新版)
2026年阿里云服务器新手租用全流程完整步骤教程,阿里云服务器提供自定义租用、一键租用、云市场租用和活动租用四种核心方式,适配不同配置需求、技术能力和预算场景。无论是需要精准配置的专业用户,还是追求快速部署的新手,都能找到合适的租用方案。以下是详细的适用场景和操作流程,助力高效上云。
259 146
|
5天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
2天前
|
弹性计算 固态存储 大数据
2026年阿里云服务器租用费用_阿里云最新轻量、ECS、GPU云服务器价格表
2026年阿里云服务器租用费用多少钱?小编通过查询全网最新关于阿里云服务器租用价格的资料,整理了今年最新的云服务器租用价格表,包括轻量应用服务器、云服务器ECS和GPU服务器。现在最新阿里云服务器租用费用价格表,轻量2核2G轻量服务器一年68元,折合5.6元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年(企业专享),2核4G4M轻量服务器298元一年,4核8G服务器955元一年,4核16G10M服务器70元1个月、210元3个月,8核32G服务器160元1个月、480元3个月,整理2026阿里云服务器租用费用价格表,包括一年优惠价格、一个月和1小时收费明细表:
217 152
|
4天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
679 4
|
12天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
800 14