java fangfa_Java:线程,swing赛跑小游戏(含个人详细解析,理解等)【诗书画唱】...

1aeb3f77607308ad555fc2ba5e25fd62.png

219e615be4c8be1a6521904febcb7e72.png

package swing;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Random;

import javax.swing.*;

public class runGame extends JFrame{

//在主窗体添加一个按钮,添加点击事件,点击按钮的时候,

//触发该事件,改变图片对象的x轴的位移就可以达到跑步的效果。每个图片都是

//一个线程类,点击开始按钮的时候开启线程,重绘窗体。

public static JButton startAnNiu,endAnNiu,

AnNiu1,AnNiu2,AnNiu3,AnNiu4;

public static void main(String[] args) {

new runGame();

JOptionPane.showMessageDialog

(null,"500px赛跑,点击下方名字的按钮,"

+ "\n就可以给这个人物开挂加速");

}

public runGame(){

this.setLayout(null);

this.setSize(666,666);

this.setLocationRelativeTo(null);

paintClass paintClass=new paintClass();

paintClass.setBounds(0,0,555,555);

this.add(paintClass);

Thread Thread=new Thread(paintClass);

Thread.start();

startAnNiu=new JButton("开始");

endAnNiu=new JButton("暂停");

AnNiu1=new JButton("蜡笔小新");

AnNiu2=new JButton("飞仙");

AnNiu3=new JButton("熊猫人");

AnNiu4=new JButton("帽子人");

AnNiu1.setBounds(230,580, 100,30);

AnNiu2.setBounds(360,580, 70,30);

AnNiu3.setBounds(460,580, 80,30);

AnNiu4.setBounds(550,580, 80,30);

//__

//绑定事件的部分:

AnNiu1.addActionListener(paintClass);

AnNiu2.addActionListener(paintClass);

AnNiu3.addActionListener(paintClass);

AnNiu4.addActionListener(paintClass);

//__

this.add(AnNiu1);this.add(AnNiu2);

this.add(AnNiu3);this.add(AnNiu4);

startAnNiu.setBounds(30,580,70,30);

endAnNiu.setBounds(130,580,70,30);

startAnNiu.addActionListener(paintClass);

endAnNiu.addActionListener(paintClass);

this.add(startAnNiu);this.add(endAnNiu);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

}

class paintClass extends JPanel implements ActionListener,Runnable{

//tuPianDuiXiang:图片对象

tuPianDuiXiang tuPianDuiXiang1,tuPianDuiXiang2,

tuPianDuiXiang3,tuPianDuiXiang4;

public paintClass(){

//在实例化paintClass的时候,给每个图片进行赋值

Image Image1=Toolkit.getDefaultToolkit().getImage("gif1.gif");

Image Image2=Toolkit.getDefaultToolkit().getImage("gif2.gif");

Image Image3=Toolkit.getDefaultToolkit().getImage("gif3.gif");

Image Image4=Toolkit.getDefaultToolkit().getImage("gif4.gif");

tuPianDuiXiang1=new tuPianDuiXiang(0,80,Image1);

tuPianDuiXiang2=new tuPianDuiXiang(0,200,Image2);

tuPianDuiXiang3=new tuPianDuiXiang(0,320,Image3);

tuPianDuiXiang4=new tuPianDuiXiang(0,440,Image4);

}

//构造方法里实例化,paint方法(画图方法)里画:

public void paint(Graphics g){

//System.out.println("给诗书画唱三连关注");

g.clearRect(0,0,this.getWidth(),this.getHeight());

g.setColor(Color.red);

g.setFont(new Font("微软雅黑",Font.BOLD,30));

g.drawString("起跑线",5,30);

//用drawLine画线:

g.drawLine(110,0,110,555);

//用drawImage绘制图片:

g.drawImage(tuPianDuiXiang1.img,tuPianDuiXiang1.x,

tuPianDuiXiang1.y,100,100,this);

g.drawImage(tuPianDuiXiang2.img,tuPianDuiXiang2.x,

tuPianDuiXiang2.y,100,100,this);

g.drawImage(tuPianDuiXiang3.img,tuPianDuiXiang3.x,

tuPianDuiXiang3.y,100,100,this);

g.drawImage(tuPianDuiXiang4.img,tuPianDuiXiang4.x,

tuPianDuiXiang4.y,100,100,this);

}

@Override

public void actionPerformed(ActionEvent e) {

Thread Thread1=new Thread(tuPianDuiXiang1,"蜡笔小新");

Thread Thread2=new Thread(tuPianDuiXiang2,"飞仙");

Thread Thread3=new Thread(tuPianDuiXiang3,"熊猫人");

Thread Thread4=new Thread(tuPianDuiXiang4,"帽子人");

if(e.getActionCommand().equals("开始")){

Thread1.start();Thread2.start();Thread3.start();

Thread4.start();

runGame.startAnNiu.setEnabled(false);

//设置开始只能点击一次,点击开始按钮后,

//开始的按钮就会变的不能够编辑,隐藏掉,消失掉,如果

//有“残影”,就是用clearRect方法清空原来的范围

//没有包括开始的按钮。

}else if(e.getActionCommand().equals("暂停")){

tuPianDuiXiang1.zanTingFangFa();tuPianDuiXiang2.zanTingFangFa();

tuPianDuiXiang3.zanTingFangFa();

tuPianDuiXiang4.zanTingFangFa();

runGame.endAnNiu.setText("继续");

}else if(e.getActionCommand().equals("继续")){

tuPianDuiXiang1.kaiShiFangFa();tuPianDuiXiang2.kaiShiFangFa();

tuPianDuiXiang3.kaiShiFangFa();

Thread1.start();Thread2.start();Thread3.start();

runGame.endAnNiu.setText("暂停");

}

if(e.getActionCommand().equals("蜡笔小新")){

System.out.println("蜡笔小新");

Thread1.setPriority(10);

Thread2.setPriority(1);

Thread3.setPriority(1);

Thread4.setPriority(1);

tuPianDuiXiang1.fasterFangFa("蜡笔小新");

}else if(e.getActionCommand().equals("飞仙")){

System.out.println("飞仙");

Thread1.setPriority(1);

Thread2.setPriority(10);

Thread3.setPriority(1);

Thread4.setPriority(1);

tuPianDuiXiang2.fasterFangFa("飞仙");

}else if(e.getActionCommand().equals("熊猫人")){

System.out.println("熊猫人");

Thread1.setPriority(1);

Thread2.setPriority(1);

Thread3.setPriority(10);

Thread4.setPriority(1);

tuPianDuiXiang3.fasterFangFa("熊猫人");

}

else if(e.getActionCommand().equals("帽子人")){

System.out.println("帽子人");

Thread1.setPriority(1);

Thread2.setPriority(1);

Thread3.setPriority(1);

Thread4.setPriority(10);

tuPianDuiXiang4.fasterFangFa("帽子人");

}

}

//下面这个线程(的run方法的调用)是刷新面板的意思,

//在刷新面板的时候,判断x轴方向上的位移是否有达到500米目的地。

@Override

public void run() {

while(true){

try {

Thread.sleep(30);

//如果有一个人的x轴到达500的时候,

//就调用含b=false暂停的方法zanTingFangFa(),

//让他们所有的人停止掉。

if(tuPianDuiXiang1.x>=500||tuPianDuiXiang2.x>=500

||tuPianDuiXiang3.x>=500||tuPianDuiXiang4.x>=500){

tuPianDuiXiang1.zanTingFangFa();tuPianDuiXiang2.zanTingFangFa();

tuPianDuiXiang3.zanTingFangFa();tuPianDuiXiang4.zanTingFangFa();

if(tuPianDuiXiang1.x>=500){

JOptionPane.showMessageDialog(null,"蜡笔小新先到达终点,胜利!");

}

if(tuPianDuiXiang2.x>=500){

JOptionPane.showMessageDialog(null,"飞仙先到达终点,胜利!");

}

if(tuPianDuiXiang3.x>=500){

JOptionPane.showMessageDialog(null,"熊猫人先到达终点,胜利!");

}

if(tuPianDuiXiang4.x>=500){

JOptionPane.showMessageDialog(null,"帽子人先到达终点,胜利!");

}

break;

}

this.repaint();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//使用面向对象的思想去声明一个图片类:

class tuPianDuiXiang implements Runnable{

int x;

int y;

Image img;

boolean b=true;

String name;

public tuPianDuiXiang(int x,int y,Image img){

this.x=x;

this.y=y;

this.img=img;

}

@Override

public void run() {

//在人物的线程里,判断人是否小于500,

//当b=true时,启动线程,让图片进行移动。

while(this.x<=500&&b){

try {

if(this.name!=null){

if(this.name.equals(Thread.currentThread().getName())){

this.x+=5;

}

}

Thread.sleep(100);

this.x+=new Random().nextInt(15);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public  void zanTingFangFa(){

this.b=false;

}

//开始的方法:kaiShiFangFa

public  void kaiShiFangFa(){

this.b=true;

}

//加速的方法:fasterFangFa

public void fasterFangFa(String name){

this.name=name;

}

}

751be0c255496d2a6f6bf0412b398145.png

5563526e0aadce9fe7be9e2188aca727.png

ac77e6d9b5f2c0cdbd10e5ae2921f2cf.png

991e53ca7e78b176e60a3804d58aeed3.png

fdc1ab5b5e0dcd8b5c0fc56dda380cae.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值