Java:線程,swing賽跑小游戲(含個(gè)人詳細(xì)解析,理解等)【詩(shī)書畫唱】

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{
//在主窗體添加一個(gè)按鈕,添加點(diǎn)擊事件,點(diǎn)擊按鈕的時(shí)候,
//觸發(fā)該事件,改變圖片對(duì)象的x軸的位移就可以達(dá)到跑步的效果。每個(gè)圖片都是
//一個(gè)線程類,點(diǎn)擊開始按鈕的時(shí)候開啟線程,重繪窗體。
public static JButton startAnNiu,endAnNiu,
AnNiu1,AnNiu2,AnNiu3,AnNiu4;
public static void main(String[] args) {
new runGame();
JOptionPane.showMessageDialog
(null,"500px賽跑,點(diǎn)擊下方名字的按鈕,"
+ "\n就可以給這個(gè)人物開掛加速");
}
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:圖片對(duì)象
tuPianDuiXiang tuPianDuiXiang1,tuPianDuiXiang2,
tuPianDuiXiang3,tuPianDuiXiang4;
public paintClass(){
//在實(shí)例化paintClass的時(shí)候,給每個(gè)圖片進(jìn)行賦值
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);
}
//構(gòu)造方法里實(shí)例化,paint方法(畫圖方法)里畫:
public void paint(Graphics g){
// System.out.println("給詩(shī)書畫唱三連關(guān)注");
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);
//設(shè)置開始只能點(diǎn)擊一次,點(diǎn)擊開始按鈕后,
// 開始的按鈕就會(huì)變的不能夠編輯,隱藏掉,消失掉,如果
// 有“殘影”,就是用clearRect方法清空原來(lái)的范圍
// 沒(méi)有包括開始的按鈕。
}else if(e.getActionCommand().equals("暫停")){
tuPianDuiXiang1.zanTingFangFa();tuPianDuiXiang2.zanTingFangFa();
tuPianDuiXiang3.zanTingFangFa();
tuPianDuiXiang4.zanTingFangFa();
runGame.endAnNiu.setText("繼續(xù)");
}else if(e.getActionCommand().equals("繼續(xù)")){
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("帽子人");
}
}
//下面這個(gè)線程(的run方法的調(diào)用)是刷新面板的意思,
// 在刷新面板的時(shí)候,判斷x軸方向上的位移是否有達(dá)到500米目的地。
@Override
public void run() {
while(true){
try {
Thread.sleep(30);
//如果有一個(gè)人的x軸到達(dá)500的時(shí)候,
// 就調(diào)用含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,"蠟筆小新先到達(dá)終點(diǎn),勝利!");
}
if(tuPianDuiXiang2.x>=500){
JOptionPane.showMessageDialog(null,"飛仙先到達(dá)終點(diǎn),勝利!");
}
if(tuPianDuiXiang3.x>=500){
JOptionPane.showMessageDialog(null,"熊貓人先到達(dá)終點(diǎn),勝利!");
}
if(tuPianDuiXiang4.x>=500){
JOptionPane.showMessageDialog(null,"帽子人先到達(dá)終點(diǎn),勝利!");
}
break;
}
this.repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//使用面向?qū)ο蟮乃枷肴ヂ暶饕粋€(gè)圖片類:
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,
// 當(dāng)b=true時(shí),啟動(dòng)線程,讓圖片進(jìn)行移動(dòng)。
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;
}
}




