麻烦帮我解释一下这个程序的构造函数的作用
import javax.swing.*;public class GreedSnake extends JApplet implements Runnable { //继承JApplet类 继承Runnable接口
/**
*
*/
private static final long serialVersionUID = -6948242468600811775L;
public static int[] snake = new int[80]; //数组
public static int sl = 3;//蛇头连身子一起的长度
public static int dir = 0;// 蛇头方向,0右1左2下3上 当dir=0 表示向右 dir=1表示向左 dir=2表示向下
private Thread thread1 = null;
private static int time = 300;
private static boolean moving = true;
private static boolean stop = false;
public GreedSnake() { // 这里看不懂
snake[0] = 200;// 蛇身初始化
snake[1] = 100;//??
snake[2] = 0;//??
}
public void start() {//重写线程的start()方法
if (thread1 == null) {
thread1 = new Thread(this, "Moving");
thread1.start();
}
}
public void run() {//线程的run()方法
setFocusable(true);//将此 Component 的焦点状态设置为指定值。此值覆盖 Component 的默认焦点状态。
//建立按键事监听类 监听发生了什么事件
//发生按下按钮事件时候 该控件能够接受到事件做出的响应
addKeyListener(new KeyLis());//添加指定的按键侦听器,以接收发自此组件的按键事件。如果 l 为 null,则不会抛出异常并且不执行动作。
Canvas.j = (int) Math.round(Math.random() * 29 + 0);// 食物位置 随即生成的
Canvas.w = (int) Math.round(Math.random() * 18 + 0);
//因为它是一个线程
while (!stop)
while (!stop)
{
switch (dir)//这个值由实践响应机制来实现传入
{// 键盘控制蛇头方向
case 0:
{
for (int i = sl - 1; i > 0; i--) // i=2 i=1
// 0右1左2下3上
snake[i] = snake[i - 1]; //snake[2]=snake[1];
snake[0] = snake[0] + 100;
break;
}
case 1:
{
for (int i = sl - 1; i > 0; i--) // i=2 i=1
// 0右1左2下3上
snake[i] = snake[i - 1];
snake[0] = snake[0] - 100;
break;
}
case 2:
{
for (int i = sl - 1; i > 0; i--) // i=2 i=1
// 0右1左2下3上
snake[i] = snake[i - 1];
snake[0] = snake[0] + 1;
break;
}
case 3:
{
for (int i = sl - 1; i > 0; i--) // i=2 i=1
// 0右1左2下3上
snake[i] = snake[i - 1];
snake[0] = snake[0] - 1;
break;
}
default:
break;
}//switch结束 按下方向键之后
tail();//每次按了按钮都要去判断是否咬到尾巴
if (snake[0] / 100 == Canvas.j && snake[0] % 100 == Canvas.w)
{//如果吃到食物
int i = 0;
snake[sl] = snake[sl - 1];
//在生产食物坐标
Canvas.j = (int) Math.round(Math.random() * 29 + 0);
Canvas.w = (int) Math.round(Math.random() * 18 + 0);
while (i >= 0)
{
Canvas.j = (int) Math.round(Math.random() * 29 + 0);
Canvas.w = (int) Math.round(Math.random() * 18 + 0);
for (i = sl; i >= 0; i--)
{
if (snake[i] / 100 != Canvas.j|| snake[i] % 100 != Canvas.w)//如果没吃到食物 一直for语句
;//空语句 意思就是继续for循环 如果不满足就跳出循环
else
break;
}
}
sl++;//能来到这里 说明吃到食物了
if (sl == 80) {// 判断是否胜利
JOptionPane.showMessageDialog(null, "You Win!");
moving = false;
}
if (sl % 10 == 0)// 游戏升级
time = time - 30; //间隔时间减少 蛇的移动速度加快
}//吃食物完毕
if (snake[0] / 100 >= 0 && snake[0] % 100 >= 0&& snake[0] / 100 < 30 && snake[0] % 100 < 19 && moving) {
repaint();//重绘此组件。
try {
Thread.sleep(time); //线程的睡眠时间 时间越小 睡的越短 蛇移动速度越快速
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
stop = true;
}
JOptionPane.showMessageDialog(null, "GameOver");// 游戏结束
}
public void tail() {// 判断是否咬到自己尾巴
for (int i = sl; i > 0; i--) {
if (snake[0] == snake[i])
moving = false;
}
}
public void init() {
Canvas p = new Canvas();
p.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createRaisedBevelBorder(), BorderFactory
.createLoweredBevelBorder()));// 设置画布边界隆起与内陷
setLayout(null);
p.setBounds(0, 0, 452, 312);
add(p);
}
public static void main(String[] args) {
JFrame frame = new JFrame(); //创建框架容器
GreedSnake game = new GreedSnake(); //创建蛇
game.init();//创建窗口大小
game.start();//开始线程
frame.add(game);
frame.setTitle("贪吃蛇");
frame.setSize(455, 314);
frame.setLocationRelativeTo(null);//设置窗口相对于指定组件的位置
frame.setVisible(true);//是否可见
frame.setResizable(false);//设置此 dialog 是否可以由用户调整大小 是否可以调整大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置当用户在此对话框上启动 "close" 时默认执行的操作
}
}
import java.awt.*;
import javax.swing.*;
class Canvas extends JPanel { //画画类
/**
*
*/
private static final long serialVersionUID = -4636326156229619914L;
public static int j, w;// 食物坐标
public void paintComponent(Graphics g) {
super.paintComponent(g);//画一个BOX
setBackground(Color.pink);// 设置画布背景颜色
g.setColor(Color.red);// 蛇头颜色
//snake[0]=200; 200/100 =2 2*15=30 snake[0]%100 =1 1*
g.fill3DRect((GreedSnake.snake[0] / 100) * 15 + 1,
(GreedSnake.snake[0] % 100) * 15 + 1, 15, 15, true);// 蛇头位置 绘制一个用当前颜色填充的 3-D 高亮显示矩形。矩形的边是高亮显示的,以至于从左上角看呈斜面并加亮。高亮显示效果所用的颜色根据当前颜色确定
//fill3DRect(x坐标,y坐标,宽度,长度)
g.setColor(Color.gray);// 蛇身颜色
for (int i = 1; i < GreedSnake.sl; i++) { //根据s1来画身子个个数 不用-1应为执行不到s1这个值
//snake[1]=100; 100/100=1; 1*15+1=16;
//snake[1]=100; 100%100=0; 0+1=1;
//snake[0]=0; 0/100=0; 0+1=1;
// 1;
g.fill3DRect((GreedSnake.snake[i] / 100) * 15 + 1,
(GreedSnake.snake[i] % 100) * 15 + 1, 15, 15, true);// 绘制蛇身
}
g.setColor(Color.green);// 食物颜色
g.fill3DRect(j * 15 + 1, w * 15 + 1, 15, 15, true);// 食物位置
}
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
class KeyLis implements KeyListener {
static int temptime;
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT: { //如果事件是按左键
GreedSnake.dir = 1;
}
break;
case KeyEvent.VK_RIGHT: { //如果事件是按右键
GreedSnake.dir = 0;
}
break;
case KeyEvent.VK_UP: { //上
GreedSnake.dir = 3;
}
break;
case KeyEvent.VK_DOWN: { //下
GreedSnake.dir = 2;
}
break;
default:
break;
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
----------------解决方案--------------------------------------------------------
public GreedSnake() { // 这里看不懂
snake[0] = 200;// 蛇身初始化
snake[1] = 100;//??
snake[2] = 0;//??
是根据画布 类Canvas的界面参数所定义的,画布的单个网格的具体绘画的参数,
这个程序的构造函数的作用就很简单了,就是初始化蛇身的长度为三个网格(在画布上显示的)。
----------------解决方案--------------------------------------------------------