Fazer o menu

package projeto;

import static java.lang.Thread.sleep;

//Desenvolvimento do jogo em Java.     Data de entrega: 27/09/2019          Nome: Hélder Silva      Turma:2171080TIAB      Numero do Utilizador: 034832111

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class Projeto extends JFrame {

    private class Grafico extends JPanel {

        private final Font fonte = new Font("Digiface", Font.BOLD, 70);

        @Override // @Override quando utiliza esse comando, ele garante que você não vai sobrescrever o que não herdou.
        public void paintComponent(Graphics g) {
            final Graphics2D g2d = (Graphics2D) g; // Graphics é a classe fundamental para renderizar formas, textos e imagens.
            g2d.setColor(Color.BLACK); // Este codigo faz que o ecrã fica preto ou qualquer cor.
            g2d.fillRect(0, 0, getWidth(), getHeight());

            g2d.setColor(Color.YELLOW); // Eate codigo é cor do placar.
            g2d.setFont(fonte);
            g2d.drawString(pontosJogador + "     " + pontosAdversario, 310, 100); // Este codigo serve para pontuação do placar

            g2d.setColor(Color.LIGHT_GRAY); // Este codigo é a cor da barreira de cima
            g2d.fill(new Rectangle2D.Double(40, 20, 700, 20)); // Este codigo serve para coordenado na barreira de cima, tamanho e a forma.

            g2d.setColor(Color.LIGHT_GRAY); // Este codigo é a cor da barreira de baixo
            g2d.fill(new Rectangle2D.Double(40, 520, 700, 20)); // Este codigo serve para coordenado na barreira de baixo, tamanho e a forma.

            g2d.setColor(Color.WHITE); // Este codigo é a cor do meio campo
            g2d.fill(new Rectangle2D.Double(400, 40, 5, 480)); // Este codigo serve para coordenado do meio campo, tamanho e a forma.

            g2d.setColor(Color.BLUE);
            g2d.fillRect(jogador.x, jogador.y, jogador.width, jogador.height); // Este codigo serve para coordenado do teu objeto para jogar, tamanho e a forma.

            g2d.setColor(Color.RED);
            g2d.fillRect(adversario.x, adversario.y, adversario.width, adversario.height); // Este codigo serve para coordenado do teu adversario para jogar,
                                                                                           // tamanho e a forma.

            g2d.setColor(Color.WHITE); // Este codigo é cor da bola.
            g2d.fillOval(bola.x, bola.y, bola.width, bola.height); // Este codigo serve para coordenadar a bola e o tamanho da bola.
        }
    }

    public static void main(String[] args) {
        Projeto projeto1 = new Projeto();
        projeto1.executar();
    }

    private Point velocidade = new Point(3, 3); // coordenada correspondentes à velocidade dos eixos x e y da bola

    private Rectangle bola = new Rectangle(50, 50, 20, 20); // forma da bola
    private Rectangle jogador = new Rectangle(40, 100, 20, 100); // forma do jogador
    private Rectangle adversario = new Rectangle(720, 100, 20, 100); // forma do adversario

    private int pontosJogador = 0;
    private int pontosAdversario = 0;

    private int vidas = 5;

    private int teclaPressionada = 0;

    private Grafico grafico;

    public void executar() {
        criarJanela();
        tratarTeclas();
    }

    private void aguardar() {
        try {
            sleep(10); // aqui você pode ter que ajustar de acordo com a velocidade de sua máquina
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void criarJanela() { // Este codigo até linha 102 serve para ciar uma Janela para o jogo.
        setTitle(" Desenvolvimento do jogo "); // Este codigo serve para dar o nome do titulo.
        setSize(800, 600); // Este código é o Tamanho do ecrã. 800 é a largura e 600 é comprimento.
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Este codigo faz que quando fecha o jogo o programa diz que fechou no caso não tiver este codigo faz
                                                        // que o programa continua.
        setVisible(true); // Este codigo faz que o titulo torna visível.

        grafico = new Grafico();
        add(grafico);
        Timer timer = new Timer(3, event -> jogar()); // Este codigo serve para velocidade da bola.
        timer.start();
    }

    private void jogar() {
        moverBola();
        verificarJogadaAdversario();
        verificarJogadaJogador();
        verificarColisaoAdversario();
        verificarColisaoJogador();
        verificarPontuacao();
        grafico.repaint();
        aguardar();
    }

    private void moverBola() {
        bola.x += velocidade.x;
        bola.y += velocidade.y;

        if (bola.y > 500 || bola.y <= 40) {
            velocidade.y *= -1;
        }
    }

    private void tratarTeclas() {
        addKeyListener(new KeyAdapter() { // Este codigo serve para usar setas cima, baixo, esquerda ou direita para o movimento do objeto ou personagem.

            @Override
            public void keyPressed(KeyEvent e) {
                teclaPressionada = e.getKeyCode();
            }

            @Override
            public void keyReleased(KeyEvent e) {
                teclaPressionada = 0;
            }
        });
    }

    private void verificarColisaoAdversario() {
        if (bola.intersects(adversario)) { // verifica se o adversario bateu na bola
            velocidade.x *= -1;
            bola.x = adversario.x - bola.width;
        }
    }

    private void verificarColisaoJogador() {
        if (bola.intersects(jogador)) { // verifica se o jogador bateu na bola
            velocidade.x *= -1;
            bola.x = jogador.x + jogador.width;
        }
    }

    private void verificarJogadaAdversario() {
        if (bola.x > 400) { // Este codigo serve para o adversario jogar automaticamente. Basicamente é um computador a jogar.
            if (bola.y > adversario.y + 50 && adversario.y < 420) {
                adversario.y += 3;
            }

            if (bola.y < adversario.y && adversario.y > 40) {
                adversario.y -= 3;
            }
        }
    }

    private void verificarJogadaJogador() {
        if (teclaPressionada == KeyEvent.VK_UP && jogador.y > 40) {
            jogador.y -= 3; // Este codigo serve para mover o tua forma mais rapido nas setas.
        } else if (teclaPressionada == KeyEvent.VK_DOWN && jogador.y < 420) {
            jogador.y += 3;
        }
    }

    private void verificarPontuacao() {
        boolean reposicionarBola = false;

        if (bola.x < jogador.x) { // verifica se o jogador deixou a bola passar
            pontosAdversario++;
            vidas--;
            reposicionarBola = true;
        }

        if (bola.x > (adversario.x + adversario.width)) { // verifica se o adversario deixou a bola passar
            pontosJogador++;
            reposicionarBola = true;
        }

        if (reposicionarBola) {
            bola.x = 400; // Este codigo serve quando você ou adversário marcam, a bola automaticamente vai para o meio. Basicamente é coordenado do meio campo.
            velocidade.x = 5;
        }
    }
}

Semana passada alguém teve a mesma dúvida.
O autor apagou as mensagens dele, entretanto minha resposta continua lá.
Bons estudos. :slight_smile:

Staroski mas pode ajudar me meter obstáculos com esse código por favor. Agredecia imenso e tenha bom dia

Senhor o meu adversário consegue marcar no meu lado e eu não consigo marcar na dele. Mas o senhor podia fazer diferente do que meteu para outro senhor. Um dia deste podia dar aulas de programação para estar preparado mas para frente assim já sei muito conhecimentos. Obrigado

É só ajustar sua lógica.
O adversário vai marcar pontos quando o x da bola for menor que o x do jogador.

O jogador vai marcar pontos quando o x da bola for maior que o (x + largura) do adversário.

Você também tem que corrigir os erros na implementação do método paintComponents, pois você está criando várias variáveis diferentes, mas todas apontando para o mesmo objeto g, está errado.

Senhor tive hoje todo dia a encontrar o erro e nao encontrei podia ajudar me por favor. Senhor gostava saber se o Senhor podia um dia destes dar aulas para ter ja conhecimento mais para frente

senhor vou usar aquele codigo que enviou para outro senhor mas pode ajudar meter o obstaculo por favor