Java swing(自己方法简化版):赛跑游戏,点击图片后图片会切换与跑动【诗书画唱】












paint方法会无限循环。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,执行有 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表示执行
// false表示不执行
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不返回任何数据只是单纯的结束方法
return;
}
// if部分要写在for等部分前面,不然会提前切换图片,执行顺序不同,效果就不同。
isRunNum = 1;
//
// 下面的for的代码之所以要再执行,是因为不执行的话,
// 在下面的for中仍然默认isRunNum = 2;
// 跑动的图片的调用不会出来,就不会有图片跑动了,
// 跑动的图片的调用与图片跑动的调用的条件是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表示执行
// false表示不执行
else if(isRunNum==2){
imgReady[i] =
Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}
}
// new GameJFrame();
new MyThread().start();
//start()为系统自带的启动线程函数
}
});
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];
//整数范围是[0,20)
//Java nextInt()函数 nextInt(int num)
//能接受一个整数作为它所产生的随机整数的上限,
//下限为零,比如: nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,
//注意这里不是0-4,而是0-3。
//但下限总是零,不能更改,所以若要达到非零下限的效果,
//必须把上限减去下限的结果传给 nextInt( ),然后把下限加入 nextInt( ) 返回的整数。
}
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会无限循环的
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,执行有 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表示执行
// false表示不执行
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不返回任何数据只是单纯的结束方法
return;
}
// if部分要写在for等部分前面,不然会提前切换图片,执行顺序不同,效果就不同。
isRunNum = 1;
//
// 下面的for的代码之所以要再执行,是因为不执行的话,
// 在下面的for中仍然默认isRunNum = 2;
// 跑动的图片的调用不会出来,就不会有图片跑动了,
// 跑动的图片的调用与图片跑动的调用的条件是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表示执行
// false表示不执行
else if(isRunNum==2){
imgReady[i] =
Toolkit.getDefaultToolkit().createImage(
"imgReady\\gif" + (i+1 ) + "2.gif");
}
}
// new GameJFrame();
new MyThread().start() ;
//start()为系统自带的启动线程函数
}
});
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];
//整数范围是[0,20)
//Java nextInt()函数 nextInt(int num)
//能接受一个整数作为它所产生的随机整数的上限,
//下限为零,比如: nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,
//注意这里不是0-4,而是0-3。
//但下限总是零,不能更改,所以若要达到非零下限的效果,
//必须把上限减去下限的结果传给 nextInt( ),然后把下限加入 nextInt( ) 返回的整数。
}
game_panel.repaint() ;
}
}}
}











