【汇智学堂】JAVA多线程实现的小游戏-弹球-5

最终实现不同角度,小球开始落下。与墙体碰撞后反弹,落在球板上加分。落地结束。

在这里插入图片描述
项目结构:
在这里插入图片描述
Ui类

/**
 * 定义界面
 * 显示球板
 * 球板动画
 * 球板对键盘的响应
 * 键盘事件响球拍的左右移动
 * 球直线下落
 * 实现小球上下来回运动
 * 实现直线碰撞的检测
 * 随机位置生成球
 *游戏结束的判断
 * 积分
 * 角度落球
 */
package com.huizhi;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Ui extends JFrame {

      static int PositionA=0,PositionB=450,RecWidth=100,RecHeight=20,Width=900;//球板
      static int BallWidth=25,BallHeight=25,PositionX,PositionY;//球的坐标及大小
      static boolean blIsOver;
      static int intSore;
      //定义角度的变量
      static int intDu;

    public Ui(){
            setTitle("弹球游戏");
            setBackground(Color.WHITE);
            setSize(900,600);
            setLocation(300,50);
            setResizable(false);
            setVisible(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);

            PositionX=(int)(Math.random()*100)+300;
            PositionY=(int)(Math.random()*100)+100;

             intDu= (int)(Math.random()*3)+1;
             // System.out.println(intDu);

            this.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    //JOptionPane.showMessageDialog(null,e.getKeyChar(),"22",JOptionPane.INFORMATION_MESSAGE);
                    char aa=e.getKeyChar();
                    if(aa=='d'){//此处测试时注意字母输入时的大小写
                     PositionA+=5;
                    }
                    else if(aa=='a'){
                        PositionA-=5;
                    }
                }
            });
        }

    public void paint(Graphics g) {

        if(blIsOver){
            g.setFont(new Font("宋体", ALLBITS, 50));
            g.setColor(Color.RED);
            g.drawString(new String("游戏结束!"), 550, 250);
            g.drawString(new String("你的得分:"+String.valueOf(intSore)), 250, 350);
            return;
        }

        g.clearRect(0,0,900,600);//0,0:是相对于容器的坐标
        g.setColor(Color.red);
        g.fillRect(PositionA , PositionB, RecWidth, RecHeight);

        g.setColor(Color.green);
        g.fillOval(PositionX,PositionY,BallWidth,BallHeight);
      }
    }

ThreadPaddles类:

package com.huizhi;

import javax.swing.*;

public class ThreadPaddles  extends Thread{
    public void run(){
        while(true){

            if(Ui.PositionX>Ui.PositionA&&Ui.PositionX+25<=Ui.PositionA+Ui.RecWidth){
                if(Ui.PositionY>=Ui.PositionB&&Ui.PositionY<=Ui.PositionB+Ui.RecHeight){
                    //ThreadBall.blUpOrDown=true;
                    Ui.intSore+=10;
                    System.out.println(Ui.intSore);

                    switch (Ui.intDu){
                        case 1:
                            Ui.intDu=3;
                            break;
                        case 2:
                            Ui.intDu=4;
                            break;
                    }
                  JOptionPane.showMessageDialog(null,Ui.PositionX,"2", JOptionPane.INFORMATION_MESSAGE);
                }
            }

            try {
                sleep(500);//参数改小时,分数会错误,因为执行的次数多。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void setListen(){

    }
}

ThreadControle类:

package com.huizhi;

public class ThreadControle extends Thread {

    Ui ui=new Ui();
    public void run(){
        if(!Ui.blIsOver){
            while(true){
                ui.repaint();
            }
        }
    }
}

ThreadBall类:

package com.huizhi;

public class ThreadBall extends Thread {

    static boolean blUpOrDown;

    public void run(){
        while(true){

            if(Ui.PositionY>=600){
               // Ui.PositionY-=50;
               // blUpOrDown=true;
                Ui.blIsOver=true;
            }
            else if(Ui.PositionY<600){
                blUpOrDown=false;
            }
           // System.out.println(blUpOrDown);
            System.out.println(Ui.intDu);

            //向上碰撞上墙面的情况
            if(Ui.PositionY<=0){
                if(Ui.intDu==3){
                    Ui.intDu=1;
                }
                else if(Ui.intDu==4){
                    Ui.intDu=2;
                }
            }

            //左侧墙面碰撞
            if(Ui.PositionX<=0){
                if(Ui.intDu==2){
                    Ui.intDu=1;
                }
                else if(Ui.intDu==4){
                    Ui.intDu=3;
                }
            }

            //右侧墙面碰撞
            if(Ui.PositionX>=900){
                if(Ui.intDu==1){
                    Ui.intDu=2;
                }
                else if(Ui.intDu==3){
                    Ui.intDu=2;
                }
            }

            if(!blUpOrDown){
                switch (Ui.intDu){

                    //1为右下方行进,2为左下方,3 为右上方,4为左上方
                    case 1:
                        Ui.PositionY+=6;
                        Ui.PositionX+=6;

                        System.out.println(Ui.PositionX);
                        System.out.println(Ui.PositionY);
                        System.out.println(Ui.PositionA);
                        System.out.println(Ui.PositionB);

                        break;
                    case 2:
                        Ui.PositionY+=6;
                        Ui.PositionX-=6;
                        break;
                    case 3:
                        Ui.PositionY-=6;
                        Ui.PositionX+=6;
//                        System.out.println(Ui.PositionX);
//                        System.out.println(Ui.PositionY);
                        break;
                    case 4:
                        Ui.PositionY-=6;
                        Ui.PositionX-=6;
                        break;
                }
            }

            try {
                sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Main类:

package com.huizhi;

public class Main {

    public static void main(String[] args) {

        ThreadBall threadBall=new ThreadBall();
        ThreadPaddles threadPaddles=new ThreadPaddles();
        ThreadControle threadControle=new ThreadControle();

        threadPaddles.start();
        threadControle.start();
        threadBall.start();

        try {
            threadPaddles.join();
            threadControle.join();
            threadBall.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
发布了268 篇原创文章 · 获赞 47 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_39593940/article/details/103612912
今日推荐