Contoh dalam artikel ini menjelaskan kode permainan berburu dan menembak yang diimplementasikan di Java berbasis Swing. Bagikan dengan semua orang untuk referensi Anda.
Kode implementasi spesifiknya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
paket Permainan;
impor java.awt.Grafik;
impor java.awt.Gambar;
impor javax.swing.JPanel;
BackgroundPanel kelas publik memperluas JPanel {
serialVersionUID panjang akhir statis pribadi = 1L;
gambar Gambar pribadi;// gambar latar belakang
Panel Latar Belakang publik() {
setOpaque(salah);
setLayout(null);
}
public void setImage(Gambar gambar) {
this.gambar = gambar;
}
/**
* Gambar latar belakangnya
*/
Komponen cat kosong yang dilindungi (Grafik g) {
jika (gambar != null) {
//lebar gambar
int lebar = getWidth();
// tinggi gambar
int tinggi = getHeight();
// menggambar
g.drawImage(gambar, 0, 0, lebar, tinggi, ini);
}
super.paintComponent(g);
}
}
Copy kode kodenya sebagai berikut:
paket Permainan;
impor java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
kelas publik BirdLabel memperluas implementasi JLabel Runnable {
serialVersionUID panjang akhir statis pribadi = 1L;
// Menghasilkan waktu tidur thread secara acak, yaitu mengontrol kecepatan pergerakan burung
private int sleepTime = (int) (Math.random() * 300) + 5;
pribadi int y = 100;
thread thread pribadi; // Gunakan thread sebagai variabel anggota
induk Kontainer pribadi;
skor private int = 15;//Skor yang sesuai dengan jenis peran ini
/**
*Metode konstruksi
*/
Label Burung publik() {
super();
//Membuat objek ikon burung
Ikon ImageIcon = ImageIcon baru(getClass().getResource("bird.gif"));
setIcon(icon);//Mengatur ikon kontrol
addMouseListener(new MouseAction());//Tambahkan pendengar acara mouse
//Tambahkan pendengar acara kontrol
addComponentListener(ComponentAction baru());
thread = new Thread(this);//Buat objek thread
}
/**
* Kontrol pendengar acara kontrol
*/
kelas akhir pribadi ComponentAction extends ComponentAdapter {
public void komponenResize(Final ComponentEvent e) {
thread.mulai();//utas mulai
}
}
/**
* Pendengar acara mouse Kontrol
*/
kelas akhir pribadi MouseAction extends MouseAdapter {
public void mousePressed(MouseEvent akhir e) {
if (!MainFrame.readyAmmo())// Jika peluru belum siap
kembali;//Tidak melakukan apa pun
MainFrame.useAmmo(); // Konsumsi peluru
skor aplikasi(); // Poin bonus
menghancurkan(); // Hancurkan komponen ini
}
}
menjalankan kekosongan publik() {
orang tua = nol;
int lebar = 0;
mencoba {
while (lebar <= 0 || induk == null) {
if (induk == null) {
parent = getParent(); // Dapatkan wadah induk
} kalau tidak {
width = parent.getWidth(); // Mendapatkan lebar container induk
}
Thread.tidur(10);
}
for (int i = lebar; i > 0 && induk != null; i -= 8) {
setLocation(i, y);//Pindahkan posisi komponen ini dari kanan ke kiri
Thread.sleep(sleepTime);//Tidur sebentar
}
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
if (induk != null) {
MainFrame.appScore(-score * 10); // Penghancuran alami akan mengurangi poin
}
destroy();// Setelah pemindahan selesai, hancurkan komponen ini
}
/**
* Metode untuk menghapus komponen ini dari wadah
*/
penghancuran kekosongan publik() {
jika (induk == null)
kembali;
parent.remove(this);//Hapus file ini dari container induk
induk.repaint();
parent = null; // Hentikan perulangan thread melalui pernyataan ini
}
/**
* Cara menambah poin
*/
kekosongan pribadi appScore() {
System.out.println("Burung itu tertabrak");
MainFrame.appScore(15);
}
}
Copy kode kodenya sebagai berikut:
paket Permainan;
impor java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
kelas publik PigLabel memperluas implementasi JLabel Runnable {
serialVersionUID panjang akhir statis pribadi = 1L;
// Hasilkan waktu tidur secara acak, yang merupakan kecepatan gerak babi hutan
private int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//Koordinat vertikal kontrol
skor private int = 10;//Skor yang sesuai dengan karakter ini
utas utas pribadi; // objek utas bawaan
private Container parent;//Objek container induk dari kontrol
/**
*Metode konstruksi
*/
publik PigLabel() {
super();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//Muat gambar babi hutan
setIcon(icon);//Mengatur ikon komponen ini
//Tambahkan adaptor peristiwa mouse
addMouseListener(MouseAdapter baru() {
// Cara menangani penekanan tombol mouse
public void mousePressed(MouseEvent akhir e) {
if (!MainFrame.readyAmmo())
kembali;
MainFrame.useAmmo(); // Konsumsi peluru
appScore(); // Tambahkan poin ke permainan
menghancurkan(); // Hancurkan komponen ini
}
});
//Tambahkan adaptor kejadian komponen
addComponentListener(ComponentAdapter baru() {
//Saat mengubah ukuran komponen
public void komponenResize(Final ComponentEvent e) {
thread.start();//Mulai thread
}
});
//Inisialisasi objek thread
utas = Utas baru (ini);
}
menjalankan kekosongan publik() {
orang tua = nol;
int lebar = 0;
while (width <= 0 || parent == null) {//Dapatkan lebar container induk
jika (induk == null)
induk = getParent();
kalau tidak
lebar = induk.getWidth();
}
//Pindahkan komponen ini dari kiri ke kanan
for (int i = 0; i < lebar && induk != null; i += 8) {
setLokasi(i, y);
mencoba {
Thread.sleep(sleepTime);//Tidur sebentar
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
}
if (induk != null) {
MainFrame.appScore(-score * 10); // Penghancuran alami akan mengurangi poin
}
menghancurkan();
}
/**
* Metode untuk menghapus komponen ini dari wadah
*/
penghancuran kekosongan publik() {
jika (induk == null)
kembali;
induk.hapus(ini);
induk.repaint();
parent = null; // Hentikan perulangan thread melalui pernyataan ini
}
/**
* Cara menambah poin
*/
kekosongan pribadi appScore() {
System.out.println("Babi hutan tertembak");
MainFrame.appScore(10);
}
}
Copy kode kodenya sebagai berikut:
paket Permainan;
import static java.lang.Math.random;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
MainFrame kelas publik memperluas JFrame {
serialVersionUID panjang akhir statis pribadi = 1L;
skor panjang statis pribadi = 0; // skor
private static Integer ammoNum = 5;//Jumlah peluru
skor JLabel statis pribadiLabel;// skor
Panel Latar Belakang Pribadi;
ammoLabel JLabel statis pribadi;
infoPane JPanel statis pribadi;
/**
*Metode konstruksi
*/
Bingkai Utama publik() {
super();
setResizable(false);//Menyesuaikan ukuran formulir
setTitle("Permainan Berburu");
infoPane = (JPanel) getGlassPane(); // Dapatkan panel kaca
JLabel label = new JLabel("Muat poin...");//Buat komponen label prompt
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(Font baru("楷体", Font.BOLD, 32));
label.setForeground(Warna.MERAH);
infoPane.setLayout(BorderLayout baru());
infoPane.add(label);//Tambahkan komponen label cepat ke panel kaca
setAlwaysOnTop(true);//Formulir tetap berada di tingkat atas
setBatas(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // Membuat panel dengan latar belakang
backgroundPanel.setImage(ImageIcon baru(getClass().getResource(
"background.jpg")).getImage());//Setel gambar latar belakang
getContentPane().add(backgroundPanel, BorderLayout.CENTER);
//Tambahkan adaptor peristiwa mouse
addMouseListener(FrameMouseListener());
scoreLabel = new JLabel(); // Komponen label yang menampilkan skor
scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
scoreLabel.setForeground(Warna.ORANGE);
scoreLabel.setText("Skor:");
scoreLabel.setBounds(25, 15, 120, 18);
backgroundPanel.tambahkan(scoreLabel);
ammoLabel = new JLabel(); // Menampilkan jumlah komponen label secara otomatis
ammoLabel.setForeground(Warna.ORANGE);
ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("Jumlah peluru : " + ammoNum);
ammoLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* Metode poin ekstra
*/
appScore kekosongan statis tersinkronisasi publik(int angka) {
skor += angka;
scoreLabel.setText("Nilai: " + skor);
}
/**
* Cara mengkonsumsi peluru
*/
kekosongan statis yang disinkronkan publik useAmmo() {
disinkronkan (amunisi) {
ammoNum--;// Kurangi jumlah peluru
ammoLabel.setText("Jumlah peluru : " + ammoNum);
if (ammoNum <= 0) {// Tentukan apakah poinnya kurang dari 0
Utas baru(yang baru Dapat Dijalankan() {
menjalankan kekosongan publik() {
//Tampilkan panel informasi cepat
infoPane.setVisible(benar);
mencoba {
// 1 detik untuk memuat peluru
Thread.tidur(1000);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
ammoNum = 5;//Kembalikan jumlah peluru
// Memodifikasi teks label kuantitas poin
ammoLabel.setText("Jumlah peluru : " + ammoNum);
infoPane.setVisible(false);//Sembunyikan panel informasi prompt
}
}).awal();
}
}
}
/**
* Tentukan apakah pelurunya cukup
*
*/
boolean statis tersinkronisasi publik readyAmmo() {
disinkronkan (amunisi) {
kembalikan amunisi> 0;
}
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
menjalankan kekosongan publik() {
mencoba {
Bingkai MainFrame = MainFrame baru();
frame.setVisible(benar);
frame.mulai();
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
});
}
/**
* Cara memulai permainan
*/
kekosongan publik mulai() {
PigThread baru().start();
BirdThread baru().start();
}
/**
* Mouse pendengar acara untuk formulir
*
*/
kelas akhir pribadi FrameMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent akhir e) {
Komponen di = backgroundPanel.getComponentAt(e.getPoint());
if (pada instanceof BackgroundPanel) {//Jika Anda mengklik panel, poin juga akan dikurangi
MainFrame.useAmmo(); // Konsumsi peluru
}
/*
* if (pada contoh BirdLabel) {//Jika Anda mengklik birdMainFrame.appScore(32);//
* Poin bonus} jika (misalnya PigLabel) {// Jika babi hutan diklik
* MainFrame.appScore(11);//Poin tambahan}
*/
}
}
/**
* Thread yang menghasilkan karakter babi
*
*/
kelas PigThread memperluas Thread {
@Mengesampingkan
menjalankan kekosongan publik() {
sementara (benar) {
//Buat kontrol label yang mewakili babi hutan
PigLabel babi = PigLabel baru();
pig.setSize(120, 80);//Menetapkan ukuran awal kontrol
backgroundPanel.add(pig);//Tambahkan kontrol ke panel latar belakang
mencoba {
//Thread secara acak tertidur selama jangka waktu tertentu
tidur((panjang) (acak() * 3000) + 500);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* Thread yang menghasilkan karakter burung
*
*/
kelas BirdThread memperluas Thread {
@Mengesampingkan
menjalankan kekosongan publik() {
sementara (benar) {
//Buat kontrol label yang mewakili burung
BirdLabel burung = BirdLabel baru();
bird.setSize(50, 50);//Menetapkan ukuran awal kontrol
backgroundPanel.add(bird);//Tambahkan kontrol ke panel latar belakang
mencoba {
//Thread secara acak tertidur selama jangka waktu tertentu
tidur((panjang) (Matematika.acak() * 3000) + 500);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.