Java實(shí)現(xiàn)簡單的彈球游戲
本文實(shí)例為大家分享了Java實(shí)現(xiàn)簡單的彈球游戲的具體代碼,供大家參考,具體內(nèi)容如下
該程序主要是用于對java圖形化界面編程進(jìn)行聯(lián)系,程序?qū)崿F(xiàn)全部采用的是AWT包下的類。
程序僅做參考,供學(xué)習(xí)使用。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Timer;
public class PinBallGame {
//創(chuàng)建窗口對象
private Frame frame = new Frame("彈球游戲");
//桌面寬度
private final int TABLE_WTDTH = 300;
//桌面高度
private final int TABLE_HEIGHT = 400;
//球拍的高度和寬度
private final int RACKET_WIDTH = 60;
private final int RACKET_HETGHT = 20;
//小球的大小
private final int BALL_SIZE = 16;
//定義變量,記錄小球的坐標(biāo)
private int ballX = 120;
private int ballY = 20;
//定義變量,記錄小球在x和y方向上分別移動的速度
private int speedY = 10;
private int speedX = 5;
//定義變量,記錄球拍的坐標(biāo)
private int racketX = 120;
private final int racketY = 340;
//定義變量,標(biāo)識當(dāng)前游戲是否已結(jié)束
private boolean isOver = false;
//聲明一個(gè)定時(shí)器
private Timer timer;
//自定義一個(gè)類,繼承Canvas,充當(dāng)畫布
@SuppressWarnings("serial")
private class MyCanvas extends Canvas{
@Override
public void paint(Graphics g) {
//TODO 在這里繪制內(nèi)容
if (isOver) {
//游戲結(jié)束
g.setColor(Color.BLUE);
g.setFont(new Font("Times",Font.BOLD,30));
g.drawString("游戲結(jié)束!", 50, 200);
}else{
//游戲中
//繪制小球
g.setColor(Color.RED);
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
//繪制球拍
g.setColor(Color.PINK);
g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HETGHT);
}
}
}
//創(chuàng)建繪畫區(qū)域
MyCanvas drawArea = new MyCanvas();
public void init() {
//組裝視圖,游戲邏輯的控制
//完成球拍坐標(biāo)的變化
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//獲取當(dāng)前按下的鍵
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT) {
//<- 應(yīng)該向左移動
if (racketX>0) {
racketX -= 10;
}
}
if (keyCode == KeyEvent.VK_RIGHT) {
//-> 應(yīng)該向右移動
if (racketX <(TABLE_WTDTH - RACKET_WIDTH)) {
racketX += 10;
}
}
}
};
//給Frame和drawArea注測監(jiān)聽器
frame.addKeyListener(listener);
drawArea.addKeyListener(listener);
//小球坐標(biāo)的控制
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//根據(jù)邊界范圍,修正速度
if (ballX<=0 || ballX>=(TABLE_WTDTH-BALL_SIZE)) {
speedX = -speedX;
}
if (ballY <= 0 || (ballY > racketY-BALL_SIZE && ballX>racketX && ballX < racketX+RACKET_WIDTH)) {
speedY = -speedY;
}
if (ballY > racketY-BALL_SIZE && (ballX < racketX || ballX > racketX+RACKET_WIDTH)) {
//當(dāng)前小球超出了球拍的范圍,游戲結(jié)束
//停止定時(shí)器
timer.stop();
//修改游戲是否結(jié)束的標(biāo)記
isOver = true;
//重繪界面
drawArea.repaint();
}
//更新小球的坐標(biāo),重繪界面
ballX += speedX;
ballY += speedY;
//重繪界面
drawArea.repaint();
}
};
timer = new Timer(100, task);
timer.start();
drawArea.setPreferredSize(new Dimension(TABLE_WTDTH,TABLE_HEIGHT));
frame.add(drawArea);
//設(shè)置frame最佳大小,并可視
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new PinBallGame().init();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式
Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式,需要的可以參考一下2022-09-09
struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例
本篇文章主要介紹了struts2+jsp+jquery+Jcrop實(shí)現(xiàn)圖片裁剪并上傳實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Java中StringBuffer和StringBuilder區(qū)別
這篇文章主要介紹了Java中StringBuffer和StringBuilder區(qū)別,本文只介紹了它們之間的核心區(qū)別,需要的朋友可以參考下2015-06-06
spring bean標(biāo)簽的primary屬性用法講解
這篇文章主要介紹了spring bean標(biāo)簽的primary屬性用法講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
詳解spring cloud config實(shí)現(xiàn)datasource的熱部署
這篇文章主要介紹了詳解spring cloud config實(shí)現(xiàn)datasource的熱部署,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Java實(shí)現(xiàn)生成二維碼展示到瀏覽器的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)生成二維碼展示到瀏覽器的示例代碼,要實(shí)現(xiàn)在瀏覽器展示二維碼,那么首先需要html文件,通過Java生成二維碼的工具類,在controller層調(diào)用接口,就可以實(shí)現(xiàn)在瀏覽器上展示二維碼,需要的朋友可以參考下2024-01-01
java 中用split分割字符串,最后的空格等不被拆分的方法
下面小編就為大家?guī)硪黄猨ava 中用split分割字符串,最后的空格等不被拆分的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
我在學(xué)習(xí)完順序表后一直對順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09

