⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snakeview.java

📁 本代码以J2SE 5.0为开发环境
💻 JAVA
字号:
package book.mutimedia.greadsnake;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Observer;

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

/**
 * 贪吃蛇的视图,MVC中的View
 */
public class SnakeView extends JFrame implements Observer{
    
	// 蛇运行范围格子的宽度和高度
	public static final int nodeWidth = 10;
    public static final int nodeHeight = 10;
    
    // 游戏画面的宽度和高度
    private int canvasWidth;
    private int canvasHeight;
    // 游戏画面左上角的位置
    private int startX = 0;
    private int startY = 0;
    
    // 显示分数的标签
    JLabel labelScore;
    // 画蛇和格子的画布
    Canvas paintCanvas;
    
    // 默认构造方法
    public SnakeView(){
        this(30, 40, 0, 0);
    }
    // 带参数的构造方法
    public SnakeView(int maxX, int maxY){
        this(maxX, maxY, 0, 0);
    }
    // 带参数的构造方法
    public SnakeView(int maxX, int maxY, int startX, int startY){
        this.canvasWidth = maxX * nodeWidth;
        this.canvasHeight = maxY * nodeHeight;
        this.startX = startX;
        this.startY = startY;
        init();
    }
    
    // 初始化视图
    private void init(){
        
        this.setName("贪吃蛇");
        this.setLocation(startX, startY);
        Container cp = this.getContentPane();

        // 创建顶部的分数显示
        labelScore = new JLabel("Score:");
        cp.add(labelScore, BorderLayout.NORTH);

        // 创建中间的游戏显示区域
        paintCanvas = new Canvas();
        paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
        cp.add(paintCanvas, BorderLayout.CENTER);

        // 创建底下的帮助栏
        JPanel panelBottom = new JPanel();
        panelBottom.setLayout(new BorderLayout());
        JPanel panel1 = new JPanel();
        panel1.setLayout(new BorderLayout());
        JLabel labelHelp;
        labelHelp = new JLabel("PageUp, PageDown for speed", 
        		JLabel.CENTER);
        panel1.add(labelHelp, BorderLayout.NORTH);
        labelHelp = new JLabel("ENTER or R or S for start", 
        		JLabel.CENTER);
        panel1.add(labelHelp, BorderLayout.CENTER);
        panelBottom.add(panel1, BorderLayout.NORTH);
        
        labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);
        panelBottom.add(labelHelp);
        labelHelp = new JLabel("q for stop", JLabel.CENTER);
        panelBottom.add(labelHelp);
        
        cp.add(panelBottom, BorderLayout.SOUTH);

        this.pack();
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    
    // 实现Observer接口定义的update方法
    public void update(Observable o, Object arg){
        
    	// 获取被监控的模型
        SnakeModel model = (SnakeModel)o;
        // 获得画笔
        Graphics g = paintCanvas.getGraphics();

        // 画背景
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, canvasWidth, canvasHeight);

        // 画蛇
        g.setColor(Color.BLACK);
        LinkedList na = model.getNodeArray();
        Iterator it = na.iterator();
        while (it.hasNext()) {
            Node n = (Node) it.next();
            drawNode(g, n);
        }

        // 画食物
        g.setColor(Color.RED);
        Node n = model.getFood();
        drawNode(g, n);
        // 更新分数
        this.updateScore(model.getScore());
    }
    
    // 画格子
    private void drawNode(Graphics g, Node n) {
        g.fillRect(n.x * nodeWidth, n.y * nodeHeight, 
        		nodeWidth - 1, nodeHeight - 1);
    }

    public void updateScore(int score) {
        String s = "Score: " + score;
        labelScore.setText(s);
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -