java线程游戏之随机小球游戏V1

       今天我们来实现多线程经典小游戏,在窗体的点击处生成随机大小和初速度的随机颜色泡泡,碰到窗体边缘会改变方向。

       首先介绍计算机的线程实现原理。CPU可以被看成一个流水线工厂,流水线的每一个工序都不是空闲的,最后成品会依次一个挨着一个形成。介绍一下参数线程数量,八核十六线程代表同一时刻绝对在运作的线程数量为16,八核八线程代表同一时刻绝对在运作的线程数量为8,而打开电脑的任务管理器后我们会发现电脑现实的正在跑的线程数量是5000左右,那么电脑线程数量为八线程时是如何做到的呢?答案就是CPU会交替运行每个线程,即每个线程都会执行一个很小的时间片段,让用户感觉不到这个暂停。线程在计算机中时很贵重的资源,要谨慎节约使用。

       先介绍第一个游戏,点击一次鼠标就能发射5000枚小球。首先创建主体类构建游戏窗体,创建GameUI类并继承Jframe类,代码为 public GameUI extends JFrame{...},接着创建showUI方法,然后在方法体中依次用setSize方法、setTitle方法来设置窗体的大小和标题,接着使用setVisible方法来使窗体可见,接着就调用这个窗体的画笔属性,然后我们就要给窗体添加监听器。这里我们实例化一个匿名内部类对象,在addMouseListener()的参数部分加入这个对象以及随后给出监听器方法即可,代码为addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent){...}});这就添加并实例化了一个匿名内部类对象。

       然后就接着写关于小球的类,创建类ThreadBall,使它继承于Runnable类,并在类中定义球的属性,首先是球的初始位置x和y,以及横向和竖向的偏移量speedx和speedy,以及需要在run方法中使用画笔来完成对小球的绘制,所以设置画笔属性g,接着我们要实现产生随机值的话,需要创建一个Random类的对象random来实现随机值的产生,所以设置属性并实例化一个对象,代码为public Random random = new Random();接着我们就开始写run方法。

       首先,整体确定使用双指针循环,外围是一个5轮的循环,每一轮又包含着1000次的循环,共5000次,对应5000个小球,然后设置小球的颜色,大小,位置的偏移量,同时介绍一下生成随机数的方法,构造Random类的新对象random,然后random.nextInt(k)表示生成[0,k)的随机整数。于是接下来对于小球的代码为g.setColor(new Color(random.next(5000000)));g.filloval(x,y,random(50),random(50));speedx=random(7)-4;speedy=random(8)-3;x+=speedx;y+=speedy;这就完成了小球的线程run方法的书写。然后我们要设置一个构造方法,把小球初始位置x,y以及画笔对象传进来,即public ThreadBall(int x,int y,Graphics g){this.x=x;this.y=y;this.g=g;},以下是ThreadBall

类的代码

package com.ms.ThreadGameV1;

import java.awt.*;
import java.util.Random;

public class ThreadBall implements Runnable{
    private int x,y;
    private Graphics g;
    private int speedx,speedy;
    Random random = new Random();//如果没有赋值运算符,那么这个值就是null,这里实例化了一个Random类的对象

    public ThreadBall(int x,int y,Graphics g){
        this.x=x;
        this.y=y;
        this.g=g;
    }
    @Override
    public void run() {
        //我们想在鼠标点击处进行画圆,所以这里是需要画笔g,以及鼠标监听的x和y坐标。
        for(int i=0;i<5;i++){
            try {
                Thread.sleep(30);//延时30ms
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int j=0;j<1000;j++){
                g.setColor(new Color(random.nextInt(500000000)));//新创建一个Color对象
                g.fillOval(x,y, random.nextInt(50)-20, random.nextInt(50)-20);
                speedx = random.nextInt(5)-3;//生成随机数的方法
                speedy = random.nextInt(7)-4;
                x+=speedx;
                y+=speedy;
            }
        }
    }
}

       然后我们回到GameUI类的监听器方法mouseClick中补充方法体。每次点击,我们都创建一个新的ThreadBall线程对象,基于此创建Thread类新对象,然后调用它run方法即可。代码为ThreadBall threadball = new ThreadBall();Thread  tre = new Thread(threadball);tre.start();这就完成了监听器方法体的补充。附上GameUI的代码

package com.ms.ThreadGameV1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameUI extends JFrame {
    private Graphics g;
    public void showUI(){
        setSize(1000,800);
        setTitle("线程游戏V1");
        setVisible(true);
        g = getGraphics();
        //直接实例化一个匿名内部类对象,用Lamda来写更方便,先用第一种方法
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                ThreadBall threadball =new ThreadBall(e.getX(),e.getY(),g);
                Thread tf = new Thread(threadball);
                tf.start();
            }
        });
    }
    public void paint(Graphics g){
        super.paint(g);
        //如果是刚想打开窗体的时候就有球来回动,那么就就在这里的paint方法中进行方法的重写
        /**
         * for (int i=0;i<500;i++){
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            g.fillOval(100+i,100,50,50);
            g.fill3DRect(100+i,100+i,50,50,false);

        }
         **/
    }
    public static void main(String[] args) {
        GameUI gf = new GameUI();
        gf.showUI();
    }

}

,总体来说就是点一下创建一个线程,一个线程跑5000个球。最后跑一下看看效果。

 

       

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值