侠客风云传安卓移植版:请编程高手进!请详细回答!深谢!

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 19:58:43
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;

class Snake extends JFrame
{
public static void main(String args[])
{
new Snake();
}
Snake()
{
bb p = new bb();
this.add(p);

this.setSize(500,450);
this.setVisible(true);
this.addKeyListener(p);
}

}
class bb extends JPanel implements Runnable, KeyListener
{
Point q = new Point();
Point body[] = new Point[50];
int nums = 4;
int director;
int c=100;

bb()
{
for (int i = 0; i<50; i++)
{
body[i] = new Point(0,0);
}
q.x = (int)(Math.random()*35);
q.y = (int)(Math.random()*35);

Thread t = new Thread(this);
t.start();
}

public void paintComponent(Graphics g)//
{
super.paintComponent(g);
g.fillRect(q.x*10, q.y*10, 9, 9);
for (int i = 0; i<nums; i++){
g.fillRect(body[i].x*10, body[i].y*10, 9, 9);
}
}

public void keyPressed(KeyEvent e)
{}

public void keyReleased(KeyEvent e)
{
int i = e.getKeyCode();
if(i == e.VK_RIGHT && director!=1)
director = 0;
else if(i == e.VK_LEFT && director!=0)
director = 1;
else if(i == e.VK_DOWN && director!=3)
director = 2;
else if(i == e.VK_UP &&director!=2)
director = 3;
}
public void keyTyped(KeyEvent e)
{}

public void run()
{
while(true)
{
for (int i = nums - 1; i>0; i--)
{
body[i].x = body[i - 1].x;
body[i].y = body[i - 1].y;
}
switch(director)
{
case 0:
body[0].x++;
break;
case 1:
body[0].x--;
break;
case 2:
body[0].y++;
break;
case 3:
body[0].y--;
break;
}
if(body[0].x>=49 || body[0].x<0 || body[0].y>=42 || body[0].y<0)
{
System.out.println ("Game Over!");
break;
}

boolean b=true;
for (int i = 1; i<50; i++)
{
if(body[0].x==body[i].x && body[0].y==body[i].y)
{
b=false;
break;
}
}
if(b==false)
{
System.out.println ("Game Over!");
break;
}
repaint();
if(body[0].x == q.x && body[0].y == q.y)
{
nums++;

q.x = (int)(Math.random()*35);
q.y = (int)(Math.random()*35);
}
try{
Thread.sleep(c);
}
catch(Exception e){}
if(nums==14)
c=80;
else if(nums==19)
c=60;
else if(nums==24)
c=40;
else if(nums==29)
c=20;
else if(nums==34)
c=10;
}
}
}

//问题1:为什么线程的等待会决定蛇的运动或不运动 还有线程的速度问题
//问题2:repaint();这句话到底是怎么回事是重画了什么
//问题3;for (int i = nums - 1; i>0; i--)
// {
// body[i].x = body[i - 1].x;
// body[i].y = body[i - 1].y;
// }
//这段话是什么意思
//问题4:if(i == e.VK_RIGHT && director!=1)这句判断的后半段director!=1是怎么回事
//问题5:this.addKeyListener(p);//注册键盘事件的监器以p对象为参数 为什么要以p为参数

问题1:为什么线程的等待会决定蛇的运动或不运动 还有线程的速度问题
*****
因为该线程被启动后便马上进入一个不断重复一组操作的死循环。
该组操作包括小量地更改蛇的位置、更新整个游戏画面(主要目的是反映蛇的新位置)、
和空等一小段时间。
那意味着线程空等时间的长度与蛇运动的速度成反比。
蛇的“运动”是一种动画效果(http://zh.wikipedia.org/wiki/%E5%8A%A8%E7%94%BB)。

你大可改变空等时间然后观察效果。 “int c=100;”就是设定游戏开始时的空等时间的语句。

问题2:repaint();这句话到底是怎么回事是重画了什么
*****
重画整个游戏画面。

问题3;for (int i = nums - 1; i>0; i--)
{
    body[i].x = body[i - 1].x;
    body[i].y = body[i - 1].y;
}
这段话是什么意思
*****
把蛇尾往前推一“步”。蛇尾的定义是蛇头以外的部分。 这程序的蛇头是 body[0]。
nums 代表蛇的长度。 nums 的初值是 4。 你可以用这个小值去了解这段循环推进蛇尾的具体步骤。

问题4:if(i == e.VK_RIGHT && director!=1)这句判断的后半段director!=1是怎么回事
*****
加入后半段的目的是为了避免蛇直接往后爬(爬到自己身上)。
director 代表蛇当下爬行的方向。 ( 0 == 右, 1 == 左, 2 == 下, 3 == 上 )。

问题5:this.addKeyListener(p);//注册键盘事件的监器以p对象为参数 为什么要以p为参数
*****
p 这个对象是 bb 类的实例。 bb 类实现了键盘事件监听功能,是合格的键盘事件监听者。

下面是我用空格重新编排然后加入文档的代码。 好些变量名都很糟糕,但我没有更改。

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;

class Snake extends JFrame {
    public static void main(String args[]) {
        new Snake();
    }

    Snake() {
        bb p = new bb();
        this.add(p);
        this.setSize(500,450);
        this.setVisible(true);
        this.addKeyListener(p);
    }
}

class bb extends JPanel implements Runnable, KeyListener {
    Point q = new Point();          // Food's co-ordinates.
    Point body[] = new Point[50];   // Snake's co-ordinates (body[0] is head).
    int nums = 4;                   // Length of snake.
    int director;   // Crawling direction (0:right, 1:left, 2:down, 3:up).
    int c=100;      // Crawling "slowness" (thread sleep time in ms).

    bb() {
        for (int i = 0; i<50; i++) {
            body[i] = new Point(0,0);
        }
        q.x = (int)(Math.random()*35);
        q.y = (int)(Math.random()*35);

        Thread t = new Thread(this);
        t.start();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw food.

        g.fillRect(q.x*10, q.y*10, 9, 9);   

        // Draw snake.
        
        for (int i = 0; i<nums; i++)
            g.fillRect(body[i].x*10, body[i].y*10, 9, 9);
    }

    public void keyPressed(KeyEvent e) {
    
    }

    public void keyReleased(KeyEvent e) {
        int i = e.getKeyCode();
        if(i == e.VK_RIGHT && director!=1)
            director = 0;
        else if(i == e.VK_LEFT && director!=0)
            director = 1;
        else if(i == e.VK_DOWN && director!=3)
            director = 2;
        else if(i == e.VK_UP &&director!=2)
            director = 3;
    }

    public void keyTyped(KeyEvent e) {
    
    }

    public void run() {

        while(true) {

            // Advance tail.

            for (int i = nums - 1; i>0; i--) {
                body[i].x = body[i - 1].x;
                body[i].y = body[i - 1].y;
            }

            // Advance head.
            
            switch(director) {
                case 0:
                    body[0].x++;
                    break;
                case 1:
                    body[0].x--;
                    break;
                case 2:
                    body[0].y++;
                    break;
                case 3:
                    body[0].y--;
                    break;
            }

            // Banged against the wall?
            
            if(body[0].x>=49 || body[0].x<0 || body[0].y>=42 || body[0].y<0){
                System.out.println ("Game Over!");
                break;
            }

            // "Stepped" over self? (Head on any part of tail?)

            boolean b=true;
            for (int i = 1; i<50; i++) {
                if(body[0].x==body[i].x && body[0].y==body[i].y) {
                    b=false;
                    break;
                }
            }
            if(b==false) {
                System.out.println ("Game Over!");
                break;
            }

            // Show next "video frame".

            repaint();

            // Eaten the food?

            if(body[0].x == q.x && body[0].y == q.y) {
                
                // Grow longer.

                nums++;

                // Relocate the food.
                
                q.x = (int)(Math.random()*35);
                q.y = (int)(Math.random()*35);
            }

            try {

                // Delay between display of each "video frame".

                Thread.sleep(c);
            }
            catch(Exception e){
            
            }

            // Speed up crawling according to growth.
            
            if(nums==14)
                c=80;
            else if(nums==19)
                c=60;
            else if(nums==24)
                c=40;
            else if(nums==29)
                c=20;
            else if(nums==34)
                c=10;
        }
    }
}

第一个问题太笼统了,叫我怎么回答?
repaint是重画屏幕的.
第三个问题,那一段代码是用来使蛇的身体运动的.
每一块,都补到它前面的那一块,就样,蛇就动起来了.
第四个,没仔细看代码.不知道.
第五个问题,没学过JAVA.不懂.

java正学习中,呵呵

不会