Ответ: алгоритм поиска пути ии
PHP код:
// Main.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Main extends MIDlet {
public static Main midlet;
public void startApp() {
midlet = this;
Display.getDisplay(this).setCurrent(new TGameCanvas());
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
}
//TGameCanvas.java
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.*;
import java.util.*;
public class TGameCanvas extends GameCanvas implements CommandListener {
public int width, height, i, xi, yi, x, y, x1, y1, key;
public Command cHelp = new Command("Help", Command.EXIT, 1);
public boolean Dsetka, cel;
public int[][] solid = new int[10][10];
public Graphics G;
public Random R = new Random();
public int getKeyClicked;
protected void showNotify() {
Draw();
keyPressed(-1);
flushGraphics();
}
public TGameCanvas() {
super(false);
setFullScreenMode(true);
setCommandListener(this);
G = getGraphics();
Dsetka = false;
cel = true;
width = getWidth() / 10;
height = getHeight() / 10;
solid[0][0] = 1;
x1 = 9;
y1 = 9;
addCommand(cHelp);
}
public void Draw() {
G.setColor(255, 255, 255);
G.fillRect(0, 0, getWidth(), getHeight());
G.setColor(0, 0, 128);
for (i = 0; i < 10; i++) {
G.drawLine(width * i, 0, width * i, getHeight());
}
for (i = 0; i < 10; i++) {
G.drawLine(0, height * i, getWidth(), height * i);
}
G.setColor(128, 255, 0);
for (xi = 0; xi < 10; xi++) {
for (yi = 0; yi < 10; yi++) {
if (solid[xi][yi] == -1) {
G.fillRect(width * xi, height * yi, width, height);
} else if (solid[xi][yi] == 1) {
G.drawLine(width * xi, height * yi, width * xi + width, height * yi + height);
G.drawLine(width * xi + width, height * yi, width * xi, height * yi + height);
}
}
}
if (Dsetka) {
G.setColor(0, 0, 0);
for (xi = 0; xi < 10; xi++) {
for (yi = 0; yi < 10; yi++) {
G.drawString("" + solid[xi][yi], width * xi, height * yi, 20);
}
}
}
}
public int min(int v1, int v2, int v3, int v4) {
int vmin = v1;
if (vmin > v2) {
vmin = v2;
}
if (vmin > v3) {
vmin = v3;
}
if (vmin > v4) {
vmin = v4;
}
return vmin;
}
public void poisc() {
int xp, yp, num = 1;
boolean perebor = true;
while (!(perebor == false)) {
for (xp = 0; xp < 10; xp++) {
for (yp = 0; yp < 10; yp++) {
if (solid[xp][yp] == num) {
if (xp - 1 > -1) {
if (solid[xp - 1][yp] == 0) {
solid[xp - 1][yp] = num + 1;
}
}
if (xp + 1 < 10) {
if (solid[xp + 1][yp] == 0) {
solid[xp + 1][yp] = num + 1;
}
}
if (yp - 1 > -1) {
if (solid[xp][yp - 1] == 0) {
solid[xp][yp - 1] = num + 1;
}
}
if (yp + 1 < 10) {
if (solid[xp][yp + 1] == 0) {
solid[xp][yp + 1] = num + 1;
}
}
}
}
}
num++;
if (num > 40) {
perebor = false;
}
}
}
public void dvijenie() throws Exception {
int left, right, up, down, vmin;
while (!(solid[x1][y1] == 1)) {
if (x1 - 1 > -1) {
up = solid[x1 - 1][y1];
} else {
up = 999;
}
if (x1 + 1 < 10) {
down = solid[x1 + 1][y1];
} else {
down = 999;
}
if (y1 - 1 > -1) {
left = solid[x1][y1 - 1];
} else {
left = 999;
}
if (y1 + 1 < 10) {
right = solid[x1][y1 + 1];
} else {
right = 999;
}
if (up < 1) {
up = 999;
}
if (down < 1) {
down = 999;
}
if (left < 1) {
left = 999;
}
if (right < 1) {
right = 999;
}
vmin = min(up, down, left, right);
if (up == vmin) {
x1 = x1 - 1;
}
if (down == vmin) {
x1 = x1 + 1;
}
if (left == vmin) {
y1 = y1 - 1;
}
if (right == vmin) {
y1 = y1 + 1;
}
if ((right == 999) && (down == 999) && (left == 999) && (right == 999)) {
G.setColor(255, 255, 255);
G.fillRect(getWidth() / 2 - 55, getHeight() / 2, 110, 15);
G.setColor(0, 0, 0);
G.drawRect(getWidth() / 2 - 55, getHeight() / 2, 110, 15);
G.drawString("Пути не существует", getWidth() / 2 - 53, getHeight() / 2 + 1, 20);
flushGraphics();
Thread.sleep(1000);
break;
}
if ((right == vmin) && (down == vmin) && (left == vmin) && (right == vmin)) {
x1 += R.nextInt(2) - 1;
}
Draw();
G.setColor(255,0,0);
G.fillArc(width * x1, height * y1, width, height, 0, 360);
flushGraphics();
Thread.sleep(500);
}
}
public void obnul() {
int xp, yp;
solid[x1][y1] = 999;
for (xp = 0; xp < 10; xp++) {
for (yp = 0; yp < 10; yp++) {
if (solid[xp][yp] > 0) {
solid[xp][yp] = 0;
}
}
}
}
public void help() throws Exception {
do {
G.setColor(255, 255, 255);
G.fillRect(20, 0, getWidth() - 20, getHeight());
G.setColor(0, 0, 0);
G.drawRect(20, 0, getWidth() - 20, getHeight());
G.drawString("клавиши :", 22, 1, 20);
G.drawString("1-добавить/убрать стену", 22, 12, 20);
G.drawString("2,8,4,6-перемещение", 22, 23, 20);
G.drawString("3-переместить цель", 22, 34, 20);
G.drawString("7-показать/убрать матрицу", 22, 45, 20);
G.drawString("0-выход из программы", 22, 56, 20);
flushGraphics();
Thread.sleep(100);
} while ((getKeyClicked == 0 ? 0 : -1) == 0);
}
public void commandAction(Command c, Displayable d) {
if (c == cHelp) {
try {
help();
} catch (Exception Ex) {
}
}
}
protected void keyPressed(int key) {
Draw();
if (key == KEY_NUM2) {
y--;
}
if (key == KEY_NUM8) {
y++;
}
if (key == KEY_NUM4) {
x--;
}
if (key == KEY_NUM6) {
x++;
}
if (y < 0) {
y = 0;
}
if (y > 9) {
y = 9;
}
if (x < 0) {
x = 0;
}
if (x > 9) {
x = 9;
}
G.setColor(255, 0, 0);
G.drawRect(width * x, height * y, width, height);
G.fillArc(width * x1, height * y1, width, height, 0, 360);
if (key == KEY_NUM1) {
if (solid[x][y] == 0) {
solid[x][y] = -1;
} else if (solid[x][y] == -1) {
solid[x][y] = 0;
}
}
if ((key == KEY_NUM3) && (solid[x][y] != 999)) {
for (xi = 0; xi < 10; xi++) {
for (yi = 0; yi < 10; yi++) {
if (solid[xi][yi] == 1) {
solid[xi][yi] = 0;
}
}
}
solid[x][y] = 1;
cel = true;
}
if (key == KEY_NUM7) {
if (Dsetka) {
Dsetka = false;
} else {
Dsetka = true;
}
}
if ((key == KEY_NUM5) && (cel)) {
poisc();
try {
dvijenie();
} catch (Exception Ex) {
}
obnul();
cel = false;
}
if (key == KEY_NUM0) {
Main.midlet.destroyApp(true);
}
flushGraphics();
}
protected void keyReleased(int keyCode) {
getKeyClicked = 0;
}
}
//Запара в том , что при движении экран не перерисовываеться...
Мог би отладить, но инет щас закончиться...
|