java實(shí)現(xiàn)彈球小游戲
GUI實(shí)現(xiàn)彈球小游戲,供大家參考,具體內(nèi)容如下
先看一下游戲效果圖。


一個(gè)簡(jiǎn)單的Demo。也比較簡(jiǎn)單,新手試著做一做完善改進(jìn)。
源代碼
import Com.Style.FontStyle;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* @Author: 冀十三
* @DescIption: 彈球小游戲
* @Date:2021--06--10--17:08
*/
public class Demo extends JFrame {
//創(chuàng)建游戲窗口
public Demo() {
init();
}
//桌面大小
private final int TABLE_WIDTH = 450;
private final int TABLE_HEIGHT = 600;
//球大小
private final int BALL_SIZE = 15;
//球拍大小
private final int RACKET_WIDTH = 120;
private final int RACKET_HEIGHT = 20;
//記錄小球坐標(biāo)
private double BallX = 100;
private double BallY = 200;
//記錄球拍坐標(biāo)
private double RACKET_X = 150;
private final double RACKET_Y = 380;
//記錄小球速度
private double speedX = 10;
private double speedY = 20;
//記錄游戲是否結(jié)束
private boolean isOver = false;
//聲明一個(gè)積分器
int score= 0;
//聲明一個(gè)計(jì)時(shí)器。
ActionListener run = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//更新小球坐標(biāo)讓小球動(dòng)起來(lái)
BallY+=speedY;
BallX+=speedX;
//重繪界面
mycanvas.repaint();
//碰到兩邊的時(shí)候
if (BallX<=0||BallX>=TABLE_WIDTH-BALL_SIZE){
speedX=-speedX;
}
//碰到上邊界的時(shí)候
if(BallY<=0){
speedY=-speedY;
}
//接住小球的時(shí)候
if ( BallY>=(RACKET_Y-BALL_SIZE)&&BallX>RACKET_X&&BallX<(RACKET_X+RACKET_WIDTH)){
//得10分
score+=10;
speedY=-speedY;
}
if ((BallY>(RACKET_Y-BALL_SIZE)&&(BallX<RACKET_X||BallX>RACKET_X+RACKET_WIDTH))){
timer.stop();
isOver=true;
mycanvas.repaint();
}
}
}
;
private Timer timer = new Timer(60, run);
//內(nèi)部類(lèi)繼承Canvas充當(dāng)畫(huà)布
private class myCanvas extends Canvas {
public void paint(Graphics g) {
//繪制內(nèi)容
//如果游戲結(jié)束
if (isOver) {
//給畫(huà)筆顏色
g.setColor(new Color(0xFF9A1B44, true));
//給畫(huà)筆字體
g.setFont(new Font("宋體", FontStyle.BOLD, 25));
g.drawString("Game Over!", 120, TABLE_HEIGHT / 4);
g.drawString("成績(jī)"+score+"分", 120, TABLE_HEIGHT / 3);
g.drawString("按空格再來(lái)一次", 120, TABLE_HEIGHT / 2);
} else {
//否則游戲中
//繪制小球
g.setColor(new Color(0xFF09FAA6, true));
g.fillOval((int) BallX, (int) BallY, BALL_SIZE, BALL_SIZE);
//畫(huà)一個(gè)積分系統(tǒng)
//上色
g.setColor(new Color(0xE8DC0C77,true));
//給畫(huà)筆字體
g.setFont(new Font("宋體", FontStyle.BOLD, 25));
g.drawString("得分:"+score, 25, 25);
//繪制球拍
g.setColor(new Color(0xFF0E51D7, true));
g.fillRect((int) RACKET_X, (int) RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);
timer.start();
}
}
}
//創(chuàng)建繪畫(huà)區(qū)
myCanvas mycanvas = new myCanvas();
//窗口初始化
public void init() {
JFrame jFrame = new JFrame();
jFrame.setTitle("彈球小游戲");//窗口名稱(chēng)
jFrame.pack();//自適應(yīng)布局
jFrame.setVisible(true);//可見(jiàn)
jFrame.add(mycanvas);
jFrame.setBounds(500, 200, TABLE_WIDTH, TABLE_HEIGHT);
jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//關(guān)閉
mycanvas.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));//畫(huà)布大小
jFrame.setResizable(false);//大小不可變
KeyListener keyListener = new KeyAdapter() {
//重寫(xiě)鍵盤(pán)被按壓的方法
@Override
public void keyPressed(KeyEvent e) {
//接收按下的是哪個(gè)鍵
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
if (RACKET_X >0) {
RACKET_X -= 30;
}
}
if (key == KeyEvent.VK_RIGHT) {
if (RACKET_X < (TABLE_WIDTH - RACKET_WIDTH )) {
RACKET_X += 30;
}
}
if (key == KeyEvent.VK_SPACE) {
if (isOver=true) {
Demo.main(null);
}
}
}
};
//窗口獲取鍵盤(pán)監(jiān)聽(tīng)
jFrame.addKeyListener(keyListener);
//鍵盤(pán)獲取鍵盤(pán)監(jiān)聽(tīng)
mycanvas.addKeyListener(keyListener);
}
public static void main(String[] args) {
new Demo();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis中執(zhí)行相關(guān)SQL語(yǔ)句的方法
本文主要介紹了MyBatis中執(zhí)行相關(guān)SQL語(yǔ)句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Mybatis?MappedStatement類(lèi)核心原理詳解
這篇文章主要介紹了Mybatis?MappedStatement類(lèi),mybatis的mapper文件最終會(huì)被解析器,解析成MappedStatement,其中insert|update|delete|select每一個(gè)標(biāo)簽分別對(duì)應(yīng)一個(gè)MappedStatement2022-11-11
SpringMvc/SpringBoot HTTP通信加解密的實(shí)現(xiàn)
這篇文章主要介紹了SpringMvc/SpringBoot HTTP通信加解密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
IDEA編譯報(bào)錯(cuò):Error:java:無(wú)效的源發(fā)行版:17的解決辦法
IDEA里面裝了幾個(gè)版本的JDK,導(dǎo)入工程后時(shí)不時(shí)提示一下錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于IDEA編譯報(bào)錯(cuò):Error:java:無(wú)效的源發(fā)行版:17的解決辦法,需要的朋友可以參考下2023-01-01
如何用java給文件加密的簡(jiǎn)單實(shí)現(xiàn)
文件加密,簡(jiǎn)單來(lái)說(shuō)就是把文件讀取出來(lái),把讀取出來(lái)的字節(jié)碼數(shù)組進(jìn)行遍歷,把每一個(gè)碼值和一個(gè)秘鑰(隨便一個(gè)數(shù))進(jìn)行異或運(yùn)算,將運(yùn)算后的結(jié)果全部寫(xiě)入到文件里,這篇文章主要介紹了如何用java給文件加密的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2023-12-12
詳解application.properties和application.yml文件的區(qū)別
這篇文章主要介紹了詳解application.properties和application.yml文件的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Java之字節(jié)碼以及優(yōu)勢(shì)案例講解
這篇文章主要介紹了Java之字節(jié)碼以及優(yōu)勢(shì)案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
java中復(fù)雜查詢(xún)sql語(yǔ)句該怎么寫(xiě)
我們知道在java連接數(shù)據(jù)庫(kù)之后,需要數(shù)據(jù)庫(kù)的sql語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于java中復(fù)雜查詢(xún)sql語(yǔ)句該怎么寫(xiě)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
JAVA 文件監(jiān)控 WatchService的示例方法
本篇文章主要介紹了JAVA 文件監(jiān)控 WatchService的示例方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

