Java swing(自己方法簡化版):賽跑游戲,點擊圖片后圖片會切換與跑動【詩書畫唱】












paint方法會無限循環(huán)。visible可見的。

package myGameqieHuan;
import java.awt.BorderLayout;
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.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import runningMan4.GamePanel;
import runningMan4.RunningMan;
public class GameJFrame extends JFrame {
class GamePanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
//boolean isRun = false;
for (int i = 0; i < imgBack.length; i++) {
g.drawImage(imgBack[i], 0, (getHeight() * i) / 4, getWidth(),
getHeight() / 4, this);
//點擊按鈕后,一開始isRun默認為true,執(zhí)行有 xs[i]的部分
if (isRunNum==1) {
g.drawImage(imgRun[i], xs[i], (getHeight() * i) / 4 + 30,
getWidth()/8, getHeight() / 5, this);
}?
else if(isRunNum==2){
g.drawImage(imgReady[i], 30, (getHeight() * i) / 4 + 30,
getWidth()/8, getHeight() / 5, this);
}
}}
}
public static void main(String[] args) {
new GameJFrame();
}
RunningMan[] mans = new RunningMan[4] ;
//四個小人的名字
String[] names={"一號選手","二號選手","三號選手", "四號選手" } ;
//單選按鈕.
JRadioButton[] jr_mans=new JRadioButton[4];
ButtonGroup bg=new ButtonGroup() ;
Image[] imgBack = new Image[4];
Image[] imgReady = new Image[4];
Image[] imgRun = new Image[4];
//MyPanel jp=new MyPanel();
GamePanel game_panel = new GamePanel();
JPanel jp_control = new JPanel();
JButton bt_start = new JButton("開始");
JButton bt_restart=new JButton("重新開始");
//boolean isRun =false;
int isRunNum =2;
int[] xs = new int[4];
public GameJFrame() {
for (int i = 0; i < imgBack.length; i++) {
imgBack[i] = Toolkit.getDefaultToolkit().createImage(
"imgBack\\" + (i+1) + ".jpg");
//false為isRun
//isRun = false;
//if (false) {
//
//
//imgRun[i] = Toolkit.getDefaultToolkit().createImage(
//"imgRun\\" + (i + 1) + "3.jpg");
//
//
//
//
//} else?
//isRun = false;
if (isRunNum==1){
imgRun[i] = Toolkit.getDefaultToolkit().createImage(
"imgRun\\gif" + (i+1 ) + ".gif");
//
//
//"imgRun\\" + (i + 1) + "3.jpg");
}
// true表示執(zhí)行
// false表示不執(zhí)行
else if(isRunNum==2){
imgReady[i] = Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}jr_mans[i]=new JRadioButton (names[i]);
bg.add(jr_mans[i]) ;
//放到面板上
//放到面板上T
jp_control.add(jr_mans[i]) ;
}
bt_start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(! (jr_mans[0].isSelected() || jr_mans [1] . isSelected()
|| jr_mans [2] . isSelected()|| jr_mans [3] . isSelected())){
JOptionPane . showMessageDialog (GameJFrame. this, "親,選一個啊,要不你來玩啥了.. .",
"選人",JOptionPane.WARNING_MESSAGE) ;
//沒有返回值的方法可以直接寫一個return不返回任何數(shù)據(jù)只是單純的結(jié)束方法
return;
}
// if部分要寫在for等部分前面,不然會提前切換圖片,執(zhí)行順序不同,效果就不同。
isRunNum = 1;
//
// 下面的for的代碼之所以要再執(zhí)行,是因為不執(zhí)行的話,
// 在下面的for中仍然默認isRunNum = 2;
// 跑動的圖片的調(diào)用不會出來,就不會有圖片跑動了,
// 跑動的圖片的調(diào)用與圖片跑動的調(diào)用的條件是isRunNum 都為 1,
// 我直接鉆研較久才鉆研出來的。
for (int i = 0; i < imgBack.length; i++) {
imgBack[i] = Toolkit.getDefaultToolkit().createImage(
"imgBack\\" + (i+1) + ".jpg");
//false為isRun
//isRun = false;
//if (false) {
//
//
//imgRun[i] = Toolkit.getDefaultToolkit().createImage(
//"imgRun\\" + (i + 1) + "3.jpg");
//
//
//
//
//} else?
//isRun = false;
if (isRunNum==1){
imgRun[i] = Toolkit.getDefaultToolkit().createImage(
"imgRun\\gif" + (i+1 ) + ".gif");
//
//
//"imgRun\\" + (i + 1) + "3.jpg");
}
// true表示執(zhí)行
// false表示不執(zhí)行
else if(isRunNum==2){
imgReady[i] =?
Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}
}
// new GameJFrame();
new MyThread().start();
//start()為系統(tǒng)自帶的啟動線程函數(shù)
}
});
bt_restart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
new GameJFrame2();
}
});
jp_control.add(bt_start);
jp_control.add(bt_restart);
jp_control.setBorder(BorderFactory.
createTitledBorder("游戲控制器"));
add(game_panel, BorderLayout.CENTER);
add(jp_control, BorderLayout.SOUTH);
setTitle("賽馬游戲");
setSize(1100, 600);
setLocation(150, 100);
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
class MyThread extends Thread{
Random ran=new Random() ;
@Override
public void run() {
while (true) {
// while (true) {
try {
Thread.sleep(100) ;
}?
//捕捉異常
catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace() ;}
for(int i=0;i<xs. length; i++) {
xs[i]+=10+ran.nextInt (20);
//如果num=10+ran.nextInt (20),那么10<=num<10+20
//int[] a=new int[rand.nextint(20)+1];?
//整數(shù)范圍是[0,20)
//Java nextInt()函數(shù) nextInt(int num)?
//能接受一個整數(shù)作為它所產(chǎn)生的隨機整數(shù)的上限,
//下限為零,比如: nextInt(4)將產(chǎn)生0,1,2,3這4個數(shù)字中的任何一個數(shù)字,
//注意這里不是0-4,而是0-3。
//但下限總是零,不能更改,所以若要達到非零下限的效果,
//必須把上限減去下限的結(jié)果傳給 nextInt( ),然后把下限加入 nextInt( ) 返回的整數(shù)。
}
game_panel.repaint() ;
}
}}
}


package myGameqieHuan;
import java.awt.BorderLayout;
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.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import runningMan4.GamePanel;
import runningMan4.RunningMan;
public class GameJFrame2 extends JFrame {
class GamePanel extends JPanel {
// paint會無限循環(huán)的
public void paint(Graphics g) {
super.paint(g);
//boolean isRun = false;
for (int i = 0; i < imgBack.length; i++) {
g.drawImage(imgBack[i], 0, (getHeight() * i) / 4, getWidth(),
getHeight() / 4, this);
//點擊按鈕后,一開始isRun默認為true,執(zhí)行有 xs[i]的部分
if (isRunNum==1) {
g.drawImage(imgRun[i], xs[i], (getHeight() * i) / 4 + 30,
getWidth()/8, getHeight() / 5, this);
}?
else if(isRunNum==2){
g.drawImage(imgReady[i], 30, (getHeight() * i) / 4 + 30,
getWidth()/8, getHeight() / 5, this);
}
}}
}
public static void main(String[] args) {
new GameJFrame2();
}
RunningMan[] mans = new RunningMan[4] ;
//四個小人的名字
String[] names={"一號選手","二號選手","三號選手", "四號選手" } ;
//單選按鈕.
JRadioButton[] jr_mans=new JRadioButton[4];
ButtonGroup bg=new ButtonGroup() ;
Image[] imgBack = new Image[4];
Image[] imgReady = new Image[4];
Image[] imgRun = new Image[4];
//MyPanel jp=new MyPanel();
GamePanel game_panel = new GamePanel();
JPanel jp_control = new JPanel();
JButton bt_start = new JButton("開始");
JButton bt_restart=new JButton("重新開始");
//boolean isRun =false;
int isRunNum =2;
int[] xs = new int[4];
public GameJFrame2() {
for (int i = 0; i < imgBack.length; i++) {
imgBack[i] = Toolkit.getDefaultToolkit().createImage(
"imgBack\\" + (i+1) + ".jpg");
//false為isRun
//isRun = false;
//if (false) {
//
//
//imgRun[i] = Toolkit.getDefaultToolkit().createImage(
//"imgRun\\" + (i + 1) + "3.jpg");
//
//
//
//
//} else?
//isRun = false;
if (isRunNum==1){
imgRun[i] = Toolkit.getDefaultToolkit().createImage(
"imgRun\\gif" + (i+1 ) + ".gif");
//
//
//"imgRun\\" + (i + 1) + "3.jpg");
}
// true表示執(zhí)行
// false表示不執(zhí)行
else if(isRunNum==2){
imgReady[i] = Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}jr_mans[i]=new JRadioButton (names[i]);
bg.add(jr_mans[i]) ;
//放到面板上
//放到面板上T
jp_control.add(jr_mans[i]) ;
}
bt_start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(! (jr_mans[0].isSelected() || jr_mans [1] . isSelected()
|| jr_mans [2] . isSelected()|| jr_mans [3] . isSelected())){
JOptionPane . showMessageDialog (GameJFrame2. this, "親,選一個啊,要不你來玩啥了.. .",
"選人",JOptionPane.WARNING_MESSAGE) ;
//沒有返回值的方法可以直接寫一個return不返回任何數(shù)據(jù)只是單純的結(jié)束方法
return;
}
// if部分要寫在for等部分前面,不然會提前切換圖片,執(zhí)行順序不同,效果就不同。
isRunNum = 1;
//
// 下面的for的代碼之所以要再執(zhí)行,是因為不執(zhí)行的話,
// 在下面的for中仍然默認isRunNum = 2;
// 跑動的圖片的調(diào)用不會出來,就不會有圖片跑動了,
// 跑動的圖片的調(diào)用與圖片跑動的調(diào)用的條件是isRunNum 都為 1,
// 我直接鉆研較久才鉆研出來的。
for (int i = 0; i < imgBack.length; i++) {
imgBack[i] = Toolkit.getDefaultToolkit().createImage(
"imgBack\\" + (i+1) + ".jpg");
//false為isRun
//isRun = false;
//if (false) {
//
//
//imgRun[i] = Toolkit.getDefaultToolkit().createImage(
//"imgRun\\" + (i + 1) + "3.jpg");
//
//
//
//
//} else?
//isRun = false;
if (isRunNum==1){
imgRun[i] = Toolkit.getDefaultToolkit().createImage(
"imgRun\\gif" + (i+1 ) + ".gif");
//
//
//"imgRun\\" + (i + 1) + "3.jpg");
}
// true表示執(zhí)行
// false表示不執(zhí)行
else if(isRunNum==2){
imgReady[i] =?
Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}
}
// new GameJFrame();
new MyThread().start() ;
//start()為系統(tǒng)自帶的啟動線程函數(shù)
}
});
bt_restart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
new GameJFrame();
}
});
jp_control.add(bt_start);
jp_control.add(bt_restart);
jp_control.setBorder(BorderFactory.
createTitledBorder("游戲控制器"));
add(game_panel, BorderLayout.CENTER);
add(jp_control, BorderLayout.SOUTH);
setTitle("賽馬游戲");
setSize(1100, 600);
setLocation(150, 100);
//
//
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
class MyThread extends Thread{
Random ran=new Random() ;
@Override
public void run() {
while (true) {
// while (true) {
try {
Thread.sleep(100) ;
}?
//捕捉異常
catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace() ;}
for(int i=0;i<xs. length; i++) {
xs[i]+=10+ran.nextInt (20);
//如果num=10+ran.nextInt (20),那么10<=num<10+20
//int[] a=new int[rand.nextint(20)+1];?
//整數(shù)范圍是[0,20)
//Java nextInt()函數(shù) nextInt(int num)?
//能接受一個整數(shù)作為它所產(chǎn)生的隨機整數(shù)的上限,
//下限為零,比如: nextInt(4)將產(chǎn)生0,1,2,3這4個數(shù)字中的任何一個數(shù)字,
//注意這里不是0-4,而是0-3。
//但下限總是零,不能更改,所以若要達到非零下限的效果,
//必須把上限減去下限的結(jié)果傳給 nextInt( ),然后把下限加入 nextInt( ) 返回的整數(shù)。
}
game_panel.repaint() ;
}
}}
}











