Untitled

 avatar
unknown
java
3 years ago
7.1 kB
8
Indexable
package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

class Star {
    private int x;
    private int y;

    private Color color;

    public Star(int x, int y, Color color) {
        this.x = x;
        this.y = y;
        this.color = color;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Color getColor() {
        return color;
    }

    public void draw(Graphics g, int viewportWidth, int viewportHeight) {
        g.setColor(color);
        g.fillRect(x, y, 1, 1);
    }
}

class Player {
    private int scores = 0;
    private int x;
    private int y;
    private int size = 50;
    private Color color = Color.YELLOW;
    private int speed = 5;

    public Player() {

    }

    public void draw(Graphics g, int viewportWidth, int viewportHeight) {
        g.setColor(color);
        g.fillRect(x, y, size, size);

        g.setColor(Color.WHITE);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setFont(new Font("Arial", Font.BOLD, 24));
        g2.drawString("Score: " + scores,10, 30);
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getSize() {
        return size;
    }

    public void move(int x, int y) {
        this.x += x;
        this.y += y;
    }

    public int getSpeed() {
        return speed;
    }

    public int getCenterX() {
        return x + size / 2;
    }

    public int getCenterY() {
        return y + size / 2;
    }

    public void addScore(int score) {
        this.scores += score;
    }
}

class Asteroid {
    private int x;
    private int y;
    private int size;
    private Color color = Color.YELLOW;
    private int speed;
    private boolean isAlive = true;

    public Asteroid(int x, int y, int size, int speed, Color color) {
        this.x = x;
        this.y = y;
        this.size = size;
        this.speed = speed;
        this.color = color;
    }

    public void draw(Graphics g, int viewportWidth, int viewportHeight) {
        g.setColor(color);
        g.fillOval(x, y, size, size);
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getSize() {
        return size;
    }

    public void move(int x, int y) {
        this.x += x;
        this.y += y;
    }

    public int getSpeed() {
        return speed;
    }

    public int getCenterX() {
        return x + size / 2;
    }

    public int getCenterY() {
        return y + size / 2;
    }

    public boolean isAlive() {
        return isAlive;
    }

    public void remove() {
        isAlive = false;
    }
}



class Viewport extends JPanel {
    private Random random = new Random();
    private ArrayList<Star> stars = new ArrayList<Star>();
    private Player player = new Player();
    private ArrayList<Asteroid> asteroids = new ArrayList<Asteroid>();

    public Viewport() {

    }

    public void initializeGame() {
        for (int starIndex = 0; starIndex < 200; starIndex++) {
            int x = random.nextInt(0, getWidth());
            int y = random.nextInt(0, getHeight());

            Color color = new Color(random.nextFloat(), random.nextFloat(), random.nextFloat());

            stars.add(new Star(x, y, color));
        }

        for (int starIndex = 0; starIndex < 10; starIndex++) {
            asteroids.add(generateRandomAsteroid());
        }

        player.setPosition(getWidth() / 2 - player.getSize() / 2, getHeight() - player.getSize() - 15);

    }

    public Asteroid generateRandomAsteroid() {
        int x = random.nextInt(0, getWidth());
        int y = random.nextInt(0, getHeight()) - getHeight() - 50;

        Color color = new Color(random.nextFloat(), random.nextFloat(), random.nextFloat());

        int size = random.nextInt(10, 50);
        int speed = random.nextInt(5, 10);

        return new Asteroid(x, y, size, speed, color);
    }

    public void handleKey(char keyChar) {
        // w a s d
        if (keyChar == 'd') {
            player.move(player.getSpeed(), 0);
        }
        else if (keyChar == 'a') {
            player.move(-player.getSpeed(), 0);
        }

        repaint();
    }

    private boolean isPlayerAndAsteroidIntersecting(Player player, Asteroid asteroid) {
        return Math.pow(player.getCenterX() - asteroid.getCenterX(), 2)
                + Math.pow(player.getCenterY() - asteroid.getCenterY(), 2) <= Math.pow(asteroid.getSize(), 2);
    }

    public void updateGame(float delta) {
        int removedAsteroidsCount = 0;

        for (Asteroid asteroid : asteroids) {
            asteroid.move(0, asteroid.getSpeed());

            if (isPlayerAndAsteroidIntersecting(player, asteroid)) {
                throw new RuntimeException("Вы проиграли!");
            }

            if (asteroid.isAlive() && asteroid.getCenterY() > getHeight()) {
                player.addScore(1);
                asteroid.remove();

                removedAsteroidsCount++;
            }
        }

        for (int asteroidIndex = 0; asteroidIndex < removedAsteroidsCount; asteroidIndex++) {
            asteroids.add(generateRandomAsteroid());
        }

        // TODO: remove all asteroids those are not alive
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());

        for (Star star : stars) {
            star.draw(g, getWidth(), getHeight());
        }

        for (Asteroid asteroid : asteroids) {
            asteroid.draw(g, getWidth(), getHeight());
        }

        player.draw(g, getWidth(), getHeight());
    }
}

class GraphicsWindow extends JFrame {
    private final Viewport viewport = new Viewport();

    public GraphicsWindow(String title, int width, int height) {
        super(title);
        add(viewport);
        pack();
        setSize(width, height);
        setResizable(false);
        setFocusable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        viewport.initializeGame();

        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {
                event.consume();
                viewport.handleKey(event.getKeyChar());
            }
        });

        Timer timer = new Timer(33, new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                long time = System.currentTimeMillis();

                viewport.updateGame(33.0f / 1000.0f);
                viewport.repaint();
            }
        });

        timer.start();
    }

    public Viewport getViewport() {
        return viewport;
    }
}


public class Main {
    public static void main(String[] args) {
        new GraphicsWindow("Asteroids game", 640, 480);
    }
}
Editor is loading...