java實(shí)現(xiàn)簡(jiǎn)單的彈球游戲
彈球游戲?qū)崿F(xiàn)原理:
隔一定時(shí)間(小于1秒)重新繪制圖像,因?yàn)镚raphics類(lèi)是一個(gè)抽象類(lèi),創(chuàng)建子類(lèi)的時(shí)候需要把所有涉及的方法都得重寫(xiě),所以這里使用的是創(chuàng)建Canvas的子類(lèi),只需要重寫(xiě)它的paint()方法來(lái)實(shí)現(xiàn)。這里我們用了鍵盤(pán)監(jiān)聽(tīng)事件、Timer類(lèi)等。
游戲說(shuō)明:
該彈球游戲中的小球會(huì)隨著時(shí)間增加速度且速度最多是橫向速度和垂直速度為10。當(dāng)小球的y坐標(biāo)(垂直坐標(biāo))大于球拍的y坐標(biāo)(垂直坐標(biāo))即判斷游戲結(jié)束。控制臺(tái)顯示的是小球的x方向的速度和y方向的速度。
import java.awt.*; import java.util.Random; import javax.swing.Timer; import java.awt.event.*; public class PinBall { private Frame f=new Frame("彈球游戲"); Random rand=new Random(); //桌面的寬度以及高度 private final int TABLE_WIDTH=300; private final int TABLE_HEIGHT=400; //球拍的寬度以及高度以及水平位置、垂直位置 private final int RACKET_WIDTH=60; private final int RACKET_HEIGHT=20; private int racketX=rand.nextInt(24)*10; private int racketY=300; //小球的大小、運(yùn)行速度、坐標(biāo) private final int BALL_SIZE=16; private int ySpeed=1; private double xyRate=1; private int xSpeed=(int)(xyRate*ySpeed); private int ballX=rand.nextInt(284); private int ballY=1; //創(chuàng)建畫(huà)布 private MyCanvas tableArea=new MyCanvas(); //定義時(shí)間類(lèi) Timer timer; //游戲是否結(jié)束的旗標(biāo) private boolean isLose=false; //設(shè)置游戲等級(jí) private int time_times=1; public void init(){ tableArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT)); f.add(tableArea); //定義鍵盤(pán)監(jiān)聽(tīng)器 KeyAdapter keyProcessor=new KeyAdapter() { public void keyPressed(KeyEvent ke){ if(ke.getKeyCode()==KeyEvent.VK_LEFT){ if(racketX>0) racketX-=10; } if(ke.getKeyCode()==KeyEvent.VK_RIGHT){ if(racketX<TABLE_WIDTH-RACKET_WIDTH) racketX+=10; } } }; f.addKeyListener(keyProcessor); //tableArea.addKeyListener(keyProcessor); ActionListener taskPerformer=evt-> { //小球碰到左邊框或右邊框 if(ballX<=0||ballX>=TABLE_WIDTH-BALL_SIZE){ xSpeed=-xSpeed; } if(ballY>racketY-BALL_SIZE&&(ballX<racketX||ballX>racketX+RACKET_WIDTH-BALL_SIZE)){ timer.stop(); isLose=true; tableArea.repaint(); }else if(ballY<=0||(ballY>=racketY-BALL_SIZE&&ballX>racketX&&ballX<=racketX+RACKET_WIDTH)){ ySpeed=-ySpeed; } ballY+=ySpeed; ballX+=xSpeed; tableArea.repaint(); if((xSpeed<10&&xSpeed>-10)&&(ySpeed<10&&ySpeed>-10)){ time_times++; } if(time_times==10){ if(xSpeed>0){ xSpeed++; }else{ xSpeed--; } if(ySpeed>0){ ySpeed++; }else{ ySpeed--; } time_times-=10; System.out.println(xSpeed+" "+ySpeed); } }; timer=new Timer(100,taskPerformer); timer.start(); f.pack(); f.setVisible(true); } class MyCanvas extends Canvas { public void paint(Graphics g){ if(isLose){ g.setColor(new Color(255,0,0)); g.setFont(new Font("Times",Font.BOLD,30)); g.drawString("游戲結(jié)束",50,200); }else{ g.setColor(new Color(240,240,80)); g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE); g.setColor(new Color(80,80,200)); g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEIGHT); } } } public static void main(String[] args) { new PinBall().init(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例
這篇文章主要介紹了將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Java實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼
RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費(fèi)接收確認(rèn),本文主要介紹了springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Springboot集成Elasticsearch的步驟與相關(guān)功能
ElasticSearch是開(kāi)源搜索平臺(tái)領(lǐng)域的一個(gè)新成員,?ElasticSearch是一個(gè)基于Lucene構(gòu)建的開(kāi)源,分布式,RESTful搜索引擎,這篇文章主要給大家介紹了關(guān)于Springboot集成Elasticsearch的相關(guān)資料,需要的朋友可以參考下2021-12-12關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)
這篇文章主要介紹了關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java如何讀取某個(gè)文件夾中的全部文件(包括子文件夾)
這篇文章主要介紹了java如何讀取某個(gè)文件夾中的全部文件(包括子文件夾),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12servlet之cookie簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Cookie技術(shù)誕生以來(lái),它就成了廣大網(wǎng)絡(luò)用戶(hù)和Web開(kāi)發(fā)人員爭(zhēng)論的一個(gè)焦點(diǎn)。下面這篇文章主要給大家介紹了關(guān)于servlet之cookie簡(jiǎn)介的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07基于Feign實(shí)現(xiàn)異步調(diào)用
近期,需要對(duì)之前的接口進(jìn)行優(yōu)化,縮短接口的響應(yīng)時(shí)間,但是springcloud中的feign是不支持傳遞異步化的回調(diào)結(jié)果的,因此有了以下的解決方案,記錄一下,需要的朋友可以參考下2021-05-05