一个数组Point()型dixing_point[],每个point的x,y都是随机生成,算法思路是遍历所有point,如果角色坐标x,y在任何point的20范围以外,储存当前x,y的位置为save_x,save_y,如果进入任何point范围,则不作记录,反过来将x,y读取成之前记录的坐标。
我大概知道算法的漏洞在哪里,在系统判断point1坐标的时候,我可能进入了ponit2并记录了坐标。但循环如此之快,按理来说应该有可能实现。
现在的实际情况是:10个随机生成的障碍,总有一个且只有一个确实起作用了。其它9个障碍和空气一样。。。请求高手们告诉我为什么T_T
地形算法如下:
private void checkDixing(){
Thread checkThread = new Thread(new Runnable(){
public void run(){
while(true){
for(Point i:dixing_point){
//System.out.println(i);
if(Math.abs(me_x - i.x)<20 && Math.abs(me_y - i.y)<20){
x=save_x;
y=save_y;
}
else{
save_x=x;
save_y=y;
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}});
checkThread.start();
}
对于x,y,save_x,save_y赋值,应该添加同步操作,因为是不同线程去处理,否则不能保证两个操作处理的是最新的x,y的值。
算法逻辑问题
循环里边,save_x和save_y,一定等与x,y,因为me_x和me_y一定会在一个障碍点的范围外。
x和y,又被save_x和save_y赋值后(如果me_x和me_y就是x,y的话)。
解决:感觉程序设计问题,不用线程去处理当前位置(因为任务移动有明确的事件,参考观察者模式去设计)
每当键盘操作产生新的人位置x,y,就判断是否在所有障碍点范围内。
x,y两个参数是外部定义的,是否有其他线程给他们赋值,如果有,是否要做同步操作?
用java的volatile 修饰x,y,或者添加synchronized,保证在修改x,y时是最新的值。
程序不是很全,有点蒙的感觉啊,试试