package work; import java.util.*; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.geom.Arc2D; import java.awt.image.BufferedImage; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; public class Work extends JFrame { private Image background; private int j=0, // номер кадра x=8, // початкові координати центра круга y=250, xmax=800, // розміри поля по горизонталі ymax=450, // розміри поля по вертикалі dy=25, // висота заголовку вікна програми r=8, // радіус круга s=2, // приріст коорднати за зміну одного кадру igame=0, // стан гри idir =0, // напрям руху xb, // найбільше досягнуте значення абсциси jb, // номер точки траєкторії з найбільшим // досягнутим значенням абсциси jt; // поточний номер точки траєкторії при поверненні // у точку "відриву" за найменшу кількість кроків boolean incjt; // зростання поточного номера точки траєкторії // при поверненні у "точку відриву від перешкоди" // за найменшу кількість кроків LinkedList t = new LinkedList();// траєкторія огинання перешкоди BufferedImage bi; // буфер зображення для виведення на екран // і визначення кольорів пікселів Timer timer; public Work (String s) { super(s); MediaTracker tr = new MediaTracker(this); background = getToolkit().getImage("field.png"); // завантаження зображення лісу tr.addImage(background, 0); try { tr.waitForAll ();} // очікування на завантаження всіх зображень catch (InterruptedException e) {}; setSize(xmax, ymax+dy); // вказати розміри вікна setVisible(true); // зробити вікно видимим setDefaultCloseOperation(EXIT_ON_CLOSE); // припинити виконання програми при закритті вікна timer = new Timer(); timer.schedule(new Step(), 3000, // початкова затримка 1*100); // проміжок часу між послідовними викликами } @Override public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; int w = getSize().width, // отримати ширину вікна h = getSize().height; // отримати висоту вікна bi = (BufferedImage) createImage(w, h);// створити буфер зображення Graphics2D big = bi.createGraphics(); // отримати його графічний контекст big.drawImage(background,0,25,this); // вивести зображенння поля big.setColor(Color.white); // білий колір малювання big.fill(new Arc2D.Double(x-r,y-r,2*r,2*r,0,360,Arc2D.OPEN)); // намалювати круг g2.drawImage(bi, 0, 0, this); // вивести зображення-буфер на экран } class Step extends TimerTask { @Override public void run() { if (x+r< xmax) { repaint(); boolean[] can = new boolean [4]; // can[j] - чи можна йти у напрямку j int i,j,j0=0,j1=0,k,k0=0,k1=0; // лічильники for (i=0; i<4; i++) // пошук перешкод у 4 напрямках { switch (i) { case 0:{j0=x+r; j1=x+r+s;k0=y-r; k1=y+r; can[0]=(j1<=xmax);} break; case 1:{j0=x-r; j1=x+r; k0=y-r-s;k1=y-r; can[1]=(dy<=k0); } break; case 2:{j0=x-r-s;j1=x-r; k0=y-r; k1=y+r; can[2]=(0<=j0); } break; case 3:{j0=x-r; j1=x+r; k0=y+r; k1=y+r+s;can[3]=(k1<=ymax+dy);} break; } if (can[i]) for (j=j0; (j1)) { igame=2; if (jb<(int) t.size()-jb-1) { jt=0; incjt=true;} else { jt=t.size()-1; incjt=false;} } else { if (xb