java實現(xiàn)簡單的彈球游戲
彈球游戲實現(xiàn)原理:
隔一定時間(小于1秒)重新繪制圖像,因為Graphics類是一個抽象類,創(chuàng)建子類的時候需要把所有涉及的方法都得重寫,所以這里使用的是創(chuàng)建Canvas的子類,只需要重寫它的paint()方法來實現(xiàn)。這里我們用了鍵盤監(jiān)聽事件、Timer類等。
游戲說明:
該彈球游戲中的小球會隨著時間增加速度且速度最多是橫向速度和垂直速度為10。當小球的y坐標(垂直坐標)大于球拍的y坐標(垂直坐標)即判斷游戲結束。控制臺顯示的是小球的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;
//小球的大小、運行速度、坐標
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)建畫布
private MyCanvas tableArea=new MyCanvas();
//定義時間類
Timer timer;
//游戲是否結束的旗標
private boolean isLose=false;
//設置游戲等級
private int time_times=1;
public void init(){
tableArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
f.add(tableArea);
//定義鍵盤監(jiān)聽器
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("游戲結束",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();
}
}



以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
將ResultSet中得到的一行或多行結果集封裝成對象的實例
這篇文章主要介紹了將ResultSet中得到的一行或多行結果集封裝成對象的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
springboot實現(xiàn)rabbitmq消息確認的示例代碼
RabbitMQ的消息確認有兩種, 一種是消息發(fā)送確認,第二種是消費接收確認,本文主要介紹了springboot實現(xiàn)rabbitmq消息確認的示例代碼,具有一定的參考價值,感興趣的可以了解一下2023-09-09
Springboot集成Elasticsearch的步驟與相關功能
ElasticSearch是開源搜索平臺領域的一個新成員,?ElasticSearch是一個基于Lucene構建的開源,分布式,RESTful搜索引擎,這篇文章主要給大家介紹了關于Springboot集成Elasticsearch的相關資料,需要的朋友可以參考下2021-12-12
servlet之cookie簡介_動力節(jié)點Java學院整理
Cookie技術誕生以來,它就成了廣大網(wǎng)絡用戶和Web開發(fā)人員爭論的一個焦點。下面這篇文章主要給大家介紹了關于servlet之cookie簡介的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07

