线程小球游戏

今天要分享的内容属于GUI图像中的游戏,类似于做一个的简单的游戏

接下来我们进入今天的正题

1、演示关于多线程工作的基本过程

public class test_1229 {
    public static void main(String[] args) {
        Thread_1 thread_1 = new Thread_1();
        Thread t1 = new Thread(thread_1);
        t1.start();

        Thread_2 thread2 = new Thread_2();
        Thread t2 = new Thread(thread2);
        t2.start();



    }
}
class Thread_1 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程1---->" + i);
        }
    }

}
class Thread_2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程2---->" +i);
        }
    }
}

在这里插入图片描述

会出现这种执行不太均匀的情况出现,下面我根据自己的情况,进行有限的说明,有不妥之处,请各位大佬批评指正

t1和t2的方式是相同的
在对Thread_1和Thread_2两个线程启动中,先启动的是Thread_1线程,后启动的是Thread_2线程
此时,会出现一个情况,抢占CPU资源不均匀的问题
(主要体现抢占的百分比不同,线程执行会出现执行了部分当前线程,又去执行其他线程的问题出现) start() ----- 启动线程

线程执行的步骤

main ---------> i<100 ---------------> i<100 由于此刻该程序就是多线程
从main方法进入 在进入第一个循环内(i<100)
当第一个循环结束,进入第二循环(i<100),当第二个程序执行完毕之后,main方法执行完毕,程序结束
程序执行顺序是有从上到下依次执行,在上一个程序没有执行完毕时,下一个程序需要进行等待,等待上个程序完成,方可进入下个程序(例:main方法)
总结:当前实验,main方法执行结束(线程中start()执行结束),程序结束。

多线程启动条件

硬性条件:都需要实现run方法
1、继承(extends) 被动 实现run方法(可能会忘记)

  • 创建Thread类
  • 创建线程对象
  • 调用Thread中的start()方法

2、实现(implement) 主动 实现run方法(不实现会出现错误)

  • 创建Thread类并创建对象
  • 创建线程对象
  • 把线程对象传入Thread对象中
  • 调用start()方法

2、线程窗口实现

public class GameUI extends JFrame{
 public void GameUI()
    {
        setTitle("线程小球Game1.0");//修改线程名 --- 窗口左上角名
        setSize(800,1000);//窗口大小
        setLocationRelativeTo(null);//窗口居中显示
//        setResizable(false);//禁止修改GUI页面大小
        setVisible(true);//窗口可视化
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//窗口关闭,停止当前执行程序
}

在这里插入图片描述

运行后会出现上图的内容

3、在窗口上画一个小球

在main方法的类当中重写paint方法

@Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.cyan);//给小球上颜色
        g.fillOval(80,100,50,50);//在80,100的坐标上,画一个50*50的小球
    }

在这里插入图片描述

4、小球"动"起来

//线程类的run方法

class Thread_1 extends Thread
{
int x,y;//横纵坐标
Graphics g;//画笔

 public Thread_1(JFrame jf){
        this.g = jf.getGraphics();//创建图形上下文
    }
public void run()
{
	for(int i = 0; ;i++)//注 中间是条件的,这样才能一直移动下去
	{
		 try {
                Thread.sleep(10);//延迟10s
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
	g.setColor(Color.BLACK);
	g.fillOval(x,y,50,50);
	x++;
	y++;
	}
}

另外在main方法中的无参构造中需要添加 以下内容
在这里插入图片描述

Video_2022-12-30_151029 - Trim

5、两个小球相向而行

Thread_1不变

下面是Thread_2

class Thread_2  extends Thread {

    int x,y;
    Graphics g;
    public Thread_2(JFrame jf){
        this.g = jf.getGraphics();//创建图形上下文
    }
    @Override
    public void run() {
        x = 600;//小球初始位置
        y = 600;
        for (int i = 0; ;  i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            g.setColor(Color.black);
            g.fillOval(x, y, 50, 50);
            x--;//由于这是向上走,所以x,y的值是变小的
            y--;
        }
    }
}

Video_2022-12-30_150525 - Trim

6、让小球弹起来1.0

class Thread_2  extends Thread {

    int x,y;
    Graphics g;
    float speedX = -2.4f;//创建一个变量间接控制x
    float speedY = -5.2f;//创建一个变量间接控制y
    public Thread_2(JFrame jf){
        this.g = jf.getGraphics();//创建图形上下文
    }
    @Override
    public void run() {
        x= 500;//起始点位
        y =500;//起始点位
        for (int i = 0; ;  i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            g.setColor(Color.black);
            g.fillOval(x, y, 50, 50);

            x+= speedX;
            y+= speedY;

            if(x<= 0 || x>= 750)//到达边界弹边
            {
                speedX = -speedX;
            }if(y<= 0|| y >= 950)
            {
                speedY = -speedY;
            }
        }
    }
}

jpg

弹边1 - Trim

7、让小球随机生成并弹边

 Random random = new Random();


        x = random.nextInt(800);//坐标x范围内值随机
        y = random.nextInt(1000);//坐标y范围内值随机

        speedX = random.nextInt(20)-5;//弹边的角度随机
        speedY = random.nextInt(15)-8;

        Color color = new Color(random.nextInt(Integer.MAX_VALUE));//颜色随机

		//颜色需要修改为color,若按指定值无法随机颜色
 		g.setColor(color);

构造方法test_1229()中添加内容

for (int i = 0; i <10 ; i++) {
            t2 = new Thread_2(this);
            t2.start();
        }

多个小球弹边1 - Trim

已上就是小球游戏1.0的内容了,后期还会接着更新哦~,这一期就到这里啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值