java实现简单的弹球游戏

 更新时间:2017年08月09日 09:10:33   作者:iT_txw  
这篇文章主要为大家详细介绍了java实现简单的弹球游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

弹球游戏实现原理:

  隔一定时间(小于1秒)重新绘制图像,因为Graphics类是一个抽象类,创建子类的时候需要把所有涉及的方法都得重写,所以这里使用的是创建Canvas的子类,只需要重写它的paint()方法来实现。这里我们用了键盘监听事件、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;
 //创建画布
 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);
  //定义键盘监听器
  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();
 }
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Servlet的线程安全问题

    Servlet的线程安全问题

    本文主要介绍了Servlet的线程安全问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Spring Boot 参数校验的具体实现方式

    Spring Boot 参数校验的具体实现方式

    这篇文章主要介绍了Spring Boot 参数校验的具体实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Flowable中定时器的玩法详解

    Flowable中定时器的玩法详解

    这篇文章主要为大家详细介绍了Flowable中定时器的各种玩法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-11-11
  • 完美解决request请求流只能读取一次的问题

    完美解决request请求流只能读取一次的问题

    这篇文章主要介绍了完美解决request请求流只能读取一次的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Springboot接收 Form 表单数据的示例详解

    Springboot接收 Form 表单数据的示例详解

    这篇文章主要介绍了Springboot接收 Form 表单数据的实例代码,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • java发送post请求使用multipart/form-data格式文件数据到接口代码示例

    java发送post请求使用multipart/form-data格式文件数据到接口代码示例

    这篇文章主要介绍了java发送post请求使用multipart/form-data格式文件数据到接口的相关资料,文中指定了数据编码格式为UTF-8,并强调了所需依赖工具类,需要的朋友可以参考下
    2024-12-12
  • Spring核心容器之BeanDefinition解析

    Spring核心容器之BeanDefinition解析

    这篇文章主要介绍了Spring核心容器之BeanDefinition解析,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition,需要的朋友可以参考下
    2023-11-11
  • 深入了解java中常见的五种比较方法

    深入了解java中常见的五种比较方法

    在程序的世界里面,比较也是必不可少的,通过比较可以确定对象的相对顺序、相等性以及其他比较条件,下面我们就来深入了解一下java中常见的五种比较方法吧
    2023-12-12
  • Java mysql详细讲解双数据源配置使用

    Java mysql详细讲解双数据源配置使用

    在开发过程中我们常常会用到两个数据库,一个数据用来实现一些常规的增删改查,另外一个数据库用来实时存数据。进行数据的统计分析。可以读写分离。可以更好的优化和提高效率;或者两个数据存在业务分离的时候也需要多个数据源来实现
    2022-06-06
  • Java发送带html标签内容的邮件实例代码

    Java发送带html标签内容的邮件实例代码

    下面小编就为大家带来一篇Java发送带html标签内容的邮件实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论