分享
 
 
 

翻译TIPatterns--工程(Projects)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

工程

这里是一些留待你解决的更具挑战性的工程。【其中的某一些可能以后会作为本书的例子,所以有一些可能会从这里拿掉】

老鼠和迷宫

首先,创建一个黑板(cite reference?)对象用来记录信息。在这个特殊的黑板上画迷宫,并且用它来显示由老鼠探测出来的迷宫的结构信息。

现在创建一个真正的迷宫,这个对象只暴露它自身很少一部分的信息——针对给定的坐标,它会告诉你紧挨着给它四周是墙壁还是空地,但是不会有其它更多的信息。对于新手,可以从一个文本文件读入迷宫(数据),但是可以考虑从因特网上找一个构造迷宫的算法。无论如何,最后的结果都应该是这么一个对象,这个对象可以根据给定的坐标找出它周围的墙壁和空地。还有一点,它还必须提供这个迷宫的入口以供查询。

最后,创建迷宫探路的老鼠Rat类。每个老鼠都可以与黑板和迷宫打交道,它向黑板报告自己的当前信息,并且根据自己所处的位置向迷宫请求新的信息。不管怎样,每次老鼠碰到迷宫分支点需要做出决策的时候,它就创建一个新的线程探测每一个分支。每个老鼠由它自己的线程驱动,当它走近死胡同以后,它会先向黑板报告自己探测的最终结果,然后它会结束自己所在的线程。

最终目标是绘出迷宫的完整地图,但是你必须得决定最后的结束条件是顺其自然找到的还是由黑板来判定。

下面是Jeremy Meyer写的一个实现的例子:

//: projects:Maze.java

package projects;

import java.util.*;

import java.io.*;

import java.awt.*;

public class Maze extends Canvas {

private Vector lines; // a line is a char array

private int width = -1;

private int height = -1;

public static void main (String [] args)

throws IOException {

if (args.length < 1) {

System.out.println("Enter filename");

System.exit(0);

}

Maze m = new Maze();

m.load(args[0]);

Frame f = new Frame();

f.setSize(m.width*20, m.height*20);

f.add(m);

Rat r = new Rat(m, 0, 0);

f.setVisible(true);

}

public Maze() {

lines = new Vector();

setBackground(Color.lightGray);

}

synchronized public boolean

isEmptyXY(int x, int y) {

if (x < 0) x += width;

if (y < 0) y += height;

// Use mod arithmetic to bring rat in line:

byte[] by =

(byte[])(lines.elementAt(y%height));

return by[x%width]==' ';

}

synchronized public void

setXY(int x, int y, byte newByte) {

if (x < 0) x += width;

if (y < 0) y += height;

byte[] by =

(byte[])(lines.elementAt(y%height));

by[x%width] = newByte;

repaint();

}

public void

load(String filename) throws IOException {

String currentLine = null;

BufferedReader br = new BufferedReader(

new FileReader(filename));

for(currentLine = br.readLine();

currentLine != null;

currentLine = br.readLine()) {

lines.addElement(currentLine.getBytes());

if(width < 0 ||

currentLine.getBytes().length > width)

width = currentLine.getBytes().length;

}

height = lines.size();

br.close();

}

public void update(Graphics g) { paint(g); }

public void paint (Graphics g) {

int canvasHeight = this.getBounds().height;

int canvasWidth = this.getBounds().width;

if (height < 1 || width < 1)

return; // nothing to do

int width =

((byte[])(lines.elementAt(0))).length;

for (int y = 0; y < lines.size(); y++) {

byte[] b;

b = (byte[])(lines.elementAt(y));

for (int x = 0; x < width; x++) {

switch(b[x]) {

case ' ': // empty part of maze

g.setColor(Color.lightGray);

g.fillRect(

x*(canvasWidth/width),

y*(canvasHeight/height),

canvasWidth/width,

canvasHeight/height);

break;

case '*': // a wall

g.setColor(Color.darkGray);

g.fillRect(

x*(canvasWidth/width),

y*(canvasHeight/height),

(canvasWidth/width)-1,

(canvasHeight/height)-1);

break;

default: // must be rat

g.setColor(Color.red);

g.fillOval(x*(canvasWidth/width),

y*(canvasHeight/height),

canvasWidth/width,

canvasHeight/height);

break;

}

}

}

}

} ///:~

//: projects:Rat.java

package projects;

public class Rat {

static int ratCount = 0;

private Maze prison;

private int vertDir = 0;

private int horizDir = 0;

private int x,y;

private int myRatNo = 0;

public Rat(Maze maze, int xStart, int yStart) {

myRatNo = ratCount++;

System.out.println("Rat no." + myRatNo +

" ready to scurry.");

prison = maze;

x = xStart;

y = yStart;

prison.setXY(x,y, (byte)'R');

new Thread() {

public void run(){ scurry(); }

}.start();

}

public void scurry() {

// Try and maintain direction if possible.

// Horizontal backward

boolean ratCanMove = true;

while(ratCanMove) {

ratCanMove = false;

// South

if (prison.isEmptyXY(x, y + 1)) {

vertDir = 1; horizDir = 0;

ratCanMove = true;

}

// North

if (prison.isEmptyXY(x, y - 1))

if (ratCanMove)

new Rat(prison, x, y-1);

// Rat can move already, so give

// this choice to the next rat.

else {

vertDir = -1; horizDir = 0;

ratCanMove = true;

}

// West

if (prison.isEmptyXY(x-1, y))

if (ratCanMove)

new Rat(prison, x-1, y);

// Rat can move already, so give

// this choice to the next rat.

else {

vertDir = 0; horizDir = -1;

ratCanMove = true;

}

// East

if (prison.isEmptyXY(x+1, y))

if (ratCanMove)

new Rat(prison, x+1, y);

// Rat can move already, so give

// this choice to the next rat.

else {

vertDir = 0; horizDir = 1;

ratCanMove = true;

}

if (ratCanMove) { // Move original rat.

x += horizDir;

y += vertDir;

prison.setXY(x,y,(byte)'R');

} // If not then the rat will die.

try {

Thread.sleep(2000);

} catch(InterruptedException e) {

throw new RuntimeException(e);

}

}

System.out.println("Rat no." + myRatNo +

" can't move..dying..aarrgggh.");

}

} ///:~

The maze initialization file:

//:! projects:Amaze.txt

* ** * * ** *

*** * ******* * ****

*** ***

***** ********** *****

* * * * ** ** * * * ** *

* * * * ** * * * * **

* ** * **

* ** * ** * ** * **

*** * *** ***** * *** **

* * * * * *

* ** * * * ** * *

///:~

其它关于迷宫的资源

关于创建迷宫算法的讨论以及实现它们的java源代码:

http://www.mazeworks.com/mazegen/mazegen.htm

关于碰撞检测算法的讨论和其它针对自主物理对象(autonomous physical objects)单个或群体运动行为的讨论:

http://www.red3d.com/cwr/steer/

XML修饰器

针对I/O读写器写一对修饰器(decorators)用来对XML编码(写修饰器)和解码(读修饰器)。

目录

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有