侠客风云传安卓移植版:请编程高手进!请详细回答!深谢!
来源:百度文库 编辑:中科新闻网 时间:2024/04/29 19:58:43
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正学习中,呵呵
不会