程序实现搜索迷宫出口完整版(二)

2014-11-24 11:30:19 · 作者: · 浏览: 32
this.setBackground(new Color(41,36,33));
setVisible(true);
setResizable(true);
this.setFocusableWindowState(true);
}
//画图函数,每次数据的改变都依赖于此函数的重新绘制
public void paint(Graphics g){
Color tempColor; //颜色对象
tempColor = g.getColor(); //获得画笔的颜色
g.setColor(Color.green); //设置画笔的颜色
g.drawRect(20, 130, 627, 533); //画游戏的边框
tempColor = g.getColor();
g.setColor(Color.blue); //恢复画笔的初始颜色
for(int i = 0 ; i < 11 ; i++)
for(int j = 0 ; j < 13 ; j++)
{
//如果是墙体
if(map.readMap(i, j) == 1)
{
g.setColor(Color.red);
g.fillRect(23+j*48,133+i*48,47,47);
}
//符合条件的下一个位置作为当前路径
if(map.readMap(i , j) == 2)
{
g.setColor(Color.yellow);
g.fillRect(23+j*48,133+i*48,47,47);
Nowx = 23+j*48; //修改当前路径的x值
Nowy = 133+i*48; //修改当前路径的y值
stack.push(new Rect(Nowx,Nowy)); //路径入栈
}
//若果是终点
if(map.readMap(i , j) == 3)
{
g.setColor(Color.green);
g.fillRect(23+j*48,133+i*48,47,47);
}
//如果是已经走过的路径
if(map.readMap(i , j) == 5)
{
g.setColor(Color.blue);
g.fillRect(23+j*48,133+i*48,47,47);
}
//如果是无法走通的路径
if(map.readMap(i , j) == 4)
{
g.setColor(Color.MAGENTA);
g.fillRect(23+j*48,133+i*48,47,47);
}
}
g.setColor(tempColor); //恢复现场操作
}
//内部类
class Paint implements Runnable{
int SleepTime = 100;
public void run(){
//实现图案填充,标记功能
//创建绘图线程,重写run()方法
while(gameflag == false && stack.empty() == false)
{
//根据栈顶对象的坐标转换为数组下标,判断对应的数组元素值,下同
if((map.readMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48) + 1) != 1)
&& (map.readMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48) + 1) != 4)
&& (map.readMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48) + 1) != 5
))
{
//如果当前栈顶元素的东面是终点,弹出胜利提示框,并跳出循环
if(map.readMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48 + 1)) == 3){
JOptionPane.showMessageDialog(null,"Very Good! We Succeed, There is a way to the distict!");
break;
}
//如果不是终点,下同
if((stack.peek().GetX() + 48)/48 <= map.readXlength() &&
stack.peek().Gety()/48 <= map.readYlength())
{
//将当前栈顶路径的东面设置为当前路径
map.setMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48) + 1, 2);
//将栈顶路径设置为已走路径
map.setMap((stack.peek().Gety() - 133)/48, ((stack.peek().GetX() - 23)/48), 5);
stack.peek().SetPointerTo(0);
//将当前路径入栈
stack.push(new Rect(stack.peek().GetX() + 48,stack.peek().Gety()));
//数组未越界,进行重绘
repaint();
}
//绘图线程睡眠一段时间
try {
Thread.sleep(SleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
};
}
//如果当前栈顶元素的南面不是墙体,不是已经走过的路径,不是无法走通的路径
else if(map.readMap((stack.peek().Gety() - 133)/48 + 1, (stack.peek().GetX() - 23)/48) != 1
&& (map.readMap((stack.peek().Gety() - 133)/48 + 1, (stack.peek().GetX() - 23)/48)) != 4
&& (map.readMap((stack.peek().Gety() - 133)/48 + 1, (stack.peek().GetX() - 23)/48) != 5
))
{
//如果当前栈顶元素的南面是终点,弹出胜利提示框,并跳出循环
if(map