用JAVA写贪吃蛇游戏 超详细注释及原理讲解

snake.java
package snake;
import javax.swing.JFrame;
public class snake2 {
public static void main(String[] args) {
//框架三步骤
JFrame frame = new JFrame();
frame.setBounds(10,10,900,720);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//先建的框架 然后在框架上铺上画布 就是SnakePanel.java类
//后续的所有工作都在这个画布上画
SnakePanel panel = new SnakePanel();
frame.add(panel);
frame.setVisible(true);
}
}

SnakePanel.java
package snake2;

import java.awt.Color; // eclipse 用 shift+ctrl+O 自动添加包、类
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class SnakePanel extends JPanel implements KeyListener,ActionListener{
//图片导入方法: 直接拖住 然后添加到工程的文件夹中 这个方便 但是不规范
// 可以在工程文件下建立一个专门放图片的文件夹 我的是image 这样看起来清晰 但是路径要写清楚 文件夹/图片名
ImageIcon up = new ImageIcon(“image/up.png”);
ImageIcon down = new ImageIcon(“image/down.png”);
ImageIcon right = new ImageIcon(“image/right.png”);
ImageIcon left = new ImageIcon(“image/left.png”);
ImageIcon snake = new ImageIcon(“image/snake.png”);
ImageIcon food = new ImageIcon(“image/food.png”);
ImageIcon body = new ImageIcon(“image/body.png”);

//所有要用的变量都定义在一起 最好放在方法前面 方便查找
int[] snakex = new int[750]; //放蛇的数组
int[] snakey = new int[750];
Random rand = new Random();  // 随机产生食物
int foodx = rand.nextInt(34)*25+25;  //放事物的数组
int foody = rand.nextInt(24)*25+75;
int len = 3;    // 蛇身体的长度
int score = 0;  //游戏积分
String fangxiang = "R";   //蛇头的方向

boolean isStarted = false;  //判断游戏是否开始  关系到后面的空格键事件以及 Timer是否开始
boolean isFailed = false;  //判断游戏是否失败 即蛇头是否撞到身体

//蛇移动的原理:就是不断的重画 即下面的热paint()函数 重画的频率由timer控制 单位是毫秒
Timer timer = new Timer(100,this); //控制蛇的移动的速度


public SnakePanel() {  //构造函数 即给类初始化  即运行工程后的初始状态
    this.setFocusable(true);  //选中焦点 即对画布 上的按钮起作用
    this.addKeyListener(this);  //键盘监听 即你按键盘的时候我们的程序有反映
    setup();     //重置 初始化
    timer.start();   //Timer类的启动 相当于定闹钟 然后工程开始repaint 蛇才能运动

}

public void paint(Graphics g) {  //此函数相当于一支画笔 在panel画布上画各种东西(蛇 事物 文字等)
    this.setBackground(Color.white); 
    snake.paintIcon(this, g, 25, 11);  //上面导入的图片就是用paintIcon函数来画出来 这是在画标题图片
    g.fillRect(25, 75, 850, 600);  //填写指定的矩形

    //画蛇头
    if(fangxiang.equals("R")) { //键盘监听后对蛇头方向的判断后 这这里画出
        right.paintIcon(this, g, snakex[0], snakey[0]);
    }else if(fangxiang.equals("L")) {
        left.paintIcon(this, g, snakex[0], snakey[0]);
    }else if(fangxiang.equals("U")) {
        up.paintIcon(this, g, snakex[0], snakey[0]);
    }else if(fangxiang.equals("D")) {
        down.paintIcon(this, g, snakex[0], snakey[0]);
    }

    //画蛇身体
    for(int i=1;i0;i--) { //蛇身体的移动 数据的变化 真正的移动在下面的repaint中实现
            snakex[i] = snakex[i-1];
            snakey[i] = snakey[i-1];
        }

    if(fangxiang.equals("R")) {  //蛇头的移动 数据的变化 真正的变化在下面的repaint 中的实现
        snakex[0] = snakex[0]+25;
        if(snakex[0]>850) snakex[0] = 25;  //四个if语句 判断蛇头是否超出画布 
    }else if(fangxiang.equals("L")) {
        snakex[0] = snakex[0]-25;
        if(snakex[0]<25) snakex[0] = 850;
    }else if(fangxiang.equals("U")) {
        snakey[0] = snakey[0]-25;
        if(snakey[0]<75) snakey[0] = 650;
    }else if(fangxiang.equals("D")) {
        snakey[0] = snakey[0]+25;
        if(snakey[0]>650) snakey[0] = 75;
    }

        if(snakex[0] == foodx && snakey[0] == foody) {  //判断蛇是否吃到食物
            len++;
            score++;
            foodx = rand.nextInt(34)*25+25;//食物出现的 x y坐标 在画布内
            foody = rand.nextInt(24)*25+75;
        }

        for(int i=1;i

}
开始界面
用JAVA写贪吃蛇游戏 超详细注释及原理讲解_第1张图片
结束界面
用JAVA写贪吃蛇游戏 超详细注释及原理讲解_第2张图片

总结
1.所有的运动 图片都是基于数据的变换
2. 简单的操作就是数据操作变换个可视化呈现分开函数
3. 细节的推敲非常重要

你可能感兴趣的:(java学习笔记)