Index: src/solver.d ================================================================== --- src/solver.d +++ src/solver.d @@ -1,8 +1,10 @@ import util; import game; +bool rocky(char c){ return c=='*'||c=='@'; } + class Solver_0 { this(in Game g) {} char single_step() { return 'W'; } void force(char c) {} @@ -106,12 +108,12 @@ if(cand.empty) { const(Pos)[] tgt; for(int y=1; y<=g.map.H; ++y) for(int x=1; x<=g.map.W; ++x) if(g.map[y,x]=='.') - if(g.map[y+1,x]=='*'||g.map[y+1,x-1]=='*'||g.map[y+1,x+1]=='*' - ||g.map[y,x+1]=='*'||g.map[y,x-1]=='*') + if(rocky(g.map[y+1,x])||rocky(g.map[y+1,x-1])||rocky(g.map[y+1,x+1]) + ||rocky(g.map[y,x+1])||rocky(g.map[y,x-1])) tgt ~= new Pos(y,x); cand ~= search(g, ro, tgt, death, true); } if(cand.empty) { @@ -161,19 +163,19 @@ { bool danger(int y, int x) { if(g.map[y,x] == ' ' || g.map[y,x] == 'R') return false; - if(g.map[y+1,x] == '*') + if(rocky(g.map[y+1,x])) + return true; + if(rocky(g.map[y+1,x-1]) && (g.map[y,x-1]=='\\'||rocky(g.map[y,x-1])) && (g.map[y+1,x]==' '||g.map[y+1,x]=='R')) return true; - if(g.map[y+1,x-1]=='*' && (g.map[y,x-1]=='\\'||g.map[y,x-1]=='*') && (g.map[y+1,x]==' '||g.map[y+1,x]=='R')) + if(rocky(g.map[y+1,x+1]) && rocky(g.map[y,x+1]) && (g.map[y+1,x]==' '||g.map[y+1,x]=='R')) return true; - if(g.map[y+1,x+1]=='*' && (g.map[y,x+1]=='*') && (g.map[y+1,x]==' '||g.map[y+1,x]=='R')) + if(rocky(g.map[y,x-1]) && (g.map[y-1,x-1]=='\\'||rocky(g.map[y-1,x-1])) && (g.map[y-1,x]==' '||g.map[y-1,x]=='R')) return true; - if(g.map[y,x-1]=='*' && (g.map[y-1,x-1]=='\\'||g.map[y-1,x-1]=='*') && (g.map[y-1,x]==' '||g.map[y-1,x]=='R')) - return true; - if(g.map[y,x+1]=='*' && (g.map[y-1,x+1]=='*') && (g.map[y-1,x]==' '||g.map[y-1,x]=='R')) + if(rocky(g.map[y,x+1]) && rocky(g.map[y-1,x+1]) && (g.map[y-1,x]==' '||g.map[y-1,x]=='R')) return true; return false; } // avoid directly below '*' @@ -268,11 +270,11 @@ int[] yyy=[p.y-1,p.y+1,p.y,p.y]; int[] xxx=[p.x,p.x,p.x-1,p.x+1]; for(int i=0; i=4)continue; if(y!=p.y)continue; if(g.map[y,p.x+(p.x-x)]!=' '&&g.map[y,p.x+(p.x-x)]!='R')continue; } if('1'<=g.map[y,x]&&g.map[y,x]<='9') { @@ -286,11 +288,11 @@ if(y==s.y && x==s.x && i<4) { char c = "UDRL"[i]; if( death.count(c) == 0 ) return [tuple(c,step)]; } else if(forbidden_cell[y][x]){ - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||g.map[y,x]=='*'||g.map[y,x]=='!'||i>=4) { + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||rocky(g.map[y,x])||g.map[y,x]=='!'||i>=4) { q2 ~= new Pos(y,x); v[y][x]=true; } } }