package graphtest; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.Arc2D; import java.awt.image.BufferedImage; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; public class Graphtest extends JFrame implements KeyListener { public int i=0, // стан гри il=0, // кількість очок на рахунку програми ir=0, // кількість очок на рахунку гравця w=780, // ширина вікна програми та ігрового поля h=500, // висота ігрового поля c=24, // висота рядка заголовку вікна програми a=10, // ширини прямокутника — зображення ракетки b=100, // висота прямокутника — зображення ракетки, d=20, // діаметр круга — зображення м'яча, d_=8, // приріст ординати ракетки на одне оновлення екрану (3), dx=0, // приріст поточної величини приросту абсциси круга за 1 такт оновлення екрану dy=0, // приріст поточної величини приросту ординати круга за 1 такт оновлення екрану dx_=9, // верхня межа приросту абсциси круга за 1 такт оновлення екрану dy_=4, // верхня межа приросту ординати круга за 1 такт оновлення екрану x =(w-d)/2, // поточна абсциса ЛВК квадрата, що містить зображення м'яча y =(h-a)/2+c, // поточна ордината ЛВК квадрата, що містить зображення м'яча yl=(h-b)/2+c, // ордината верхнього краю прямокутника-ракетки ліворуч, керованого програмою yr=(h-b)/2+c; // ордината верхнього краю прямокутника-ракетки праворуч, керованого людиною public boolean up = false, // потрібно рухати жовтий прямокутник догори down = false; // потрібно рухати червоний прямокутник догори Font f = new Font("Serif",Font.BOLD, 24); // шрифт для виведення рагунку Timer timer; public Graphtest (String s) { super(s); setSize(w, h+c); // вказати розміри вікна setVisible(true); // зробити вікно видимим setDefaultCloseOperation(EXIT_ON_CLOSE); // припинити виконання програми при закритті вікна this.addKeyListener((KeyListener) this); timer = new Timer(); timer.schedule(new Step(), 0, // початкова затримка 1*50); // проміжок часу між послідовними викликами*/ } @Override public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; BufferedImage bi = (BufferedImage) createImage(w, h+c);// створити буфер зображення Graphics2D big = bi.createGraphics(); // отримати його графічний контекст big.setColor(new Color(0,80,0)); // темно зелений колір малювання big.fillRect(0, 0, w, h+c); // заповнити темно зеленим тлом big.setColor(Color.white); // білий колір малювання big.fill(new Arc2D.Double(x,y,d,d,0,360,Arc2D.OPEN)); // круг-м'яч big.drawLine( a, 0, a, h+c); // лінія розмітки ліворуч big.drawLine(w-a, 0, w-a, h+c); // лінія розмітки праворуч big.drawLine(w/2, 0, w/2, h+c); // лінія розмітки посередині big.setFont(f); big.drawString(Integer.toString(il),w/4 -9 ,30+c); big.drawString(Integer.toString(ir),w*3/4-9 ,30+c); big.setColor(Color.red); // червоний колір малювання big.fillRect(0, yl, a, b); // прямокутник-ракетка ліворуч big.setColor(Color.yellow); // жовтий колір малювання big.fillRect(w-a, yr, a, b); // прямокутник-ракетка праворуч g2.drawImage(bi, 0, 0, this); // вивести зображення-буфер на экран } class Step extends TimerTask { @Override public void run() { repaint(); if (up && ch+c) {y=2*(h+c-d)-y; dy=-dy;} // відбиття від нижньої межі if (x<0) { if (yl < y-d/2 && y-d/2 < yl+b) { x=-x; dx=-dx;} else { i=0; ir++;} } if (w-d