用户界面如下 :

玩法:双方玩家可以分别控制A-D键和←-→键来进行各自球拍的位置,如果某方没有接住小球,则对方获胜,游戏结束。

代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class PinBall {//创建窗口对象private Frame frame = new Frame("弹球游戏");//桌面宽度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 final int BALL_SIZE = 16;//定义变量记录小球的坐标private  int ballX = 120;private  int ballY = 50;//定义变量记录小球在X和Y方向上分别移动的速度private  int speedX = 8;private  int speedY = 12;//定义变量记录球拍的坐标private int racketX = 120;private final int racketY = 370;//球拍位置在纵坐标不发生改变,只能横向移动//TODO 定义对手球拍的坐标private int OppracketX = 120;private final int OppracketY = 20;//定义变量标识当前游戏是否已经结束private boolean isOver = false;//TODO 定义上方失误或者下方事物标记private boolean upside = true;//声明一个定时器(重绘小球)private Timer timer;//自定义一个类,继承canvas,充当画布private class MyCanvas extends Canvas{@Overridepublic void paint(Graphics g){//TODO 在这里绘制内容if(isOver){//游戏结束g.setColor(Color.BLUE);//设置颜色g.setFont(new Font("Times",Font.BOLD,30));//设置一个字体if(upside){g.drawString("下方玩家获胜!",50,150);//设置字体位置//g.drawString("但台智聪依旧美丽!",20,230);//设置字体位置}else {g.drawString("上方玩家获胜!",50,150);//设置字体位置}}else {//还在游戏中//绘制小球g.setColor(Color.GREEN);//设置小球颜色g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);//fillOval-填充圆(椭圆)形,填充一个小球,四变量分变为x,y,高,宽;//绘制球拍g.setColor(Color.pink);g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEIGHT);//fillRect-绘制填充矩形//TODO 绘制对手球拍g.setColor(Color.orange);g.fillRect(OppracketX,OppracketY,RACKET_WIDTH,RACKET_HEIGHT);//fillRect-绘制填充矩形}}}//创建绘画区域MyCanvas drawArea = new MyCanvas();public void init(){//组装视图,游戏逻辑的控制//创建监听器,完成球拍坐标的变化KeyListener listener = new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {//获取当前按下的键int keyCode = e.getKeyCode();//物体和窗口的坐标都是左上角if(keyCode == KeyEvent.VK_LEFT){//接收到←箭头,应该向左移动if(racketX>0){racketX -= 10;}}if(keyCode == KeyEvent.VK_RIGHT){//接收到→箭头,应该向右移动if(racketX < (TABLE_WIDTH - RACKET_WIDTH)){racketX += 10;}}}};//TODO 创建对手监听器,完成球拍坐标的变化KeyListener Opplistener = new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {//获取当前按下的键int keyCode = e.getKeyCode();//物体和窗口的坐标都是左上角if(keyCode == KeyEvent.VK_A){//接收到a,应该向左移动if(OppracketX>0){OppracketX -= 10;}}if(keyCode == KeyEvent.VK_D){//接收到d,应该向右移动if(OppracketX < (TABLE_WIDTH - RACKET_WIDTH)){OppracketX += 10;}}}};//给Frame和drawArea注册监听器frame.addKeyListener(listener);drawArea.addKeyListener(listener);//TODO 给Frame和drawArea注册对手监听器frame.addKeyListener(Opplistener);drawArea.addKeyListener(Opplistener);//小球坐标的控制ActionListener task = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//根据边界范围,修正速度(即考虑到碰到墙壁以及球拍的反弹情况)if(ballX <= 0 || ballX >= (TABLE_WIDTH-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){speedY = -speedY;}if(ballY<=OppracketY+RACKET_HEIGHT && ballX>OppracketX && ballX<OppracketX+RACKET_WIDTH){speedY = -speedY;}if(ballY > racketY-BALL_SIZE && (ballX<racketX || ballX>racketX+RACKET_WIDTH)){//证明当前小球没有被下方球拍接住,掉到下方//停止定时器timer.stop();//修改游戏是否结束标记isOver = true;//标记下方失误upside = false;//重绘界面drawArea.repaint();}if(ballY<OppracketY+RACKET_HEIGHT && (ballX<OppracketX || ballX>OppracketX+RACKET_WIDTH)){//证明当前小球没有被上方球拍接住,掉到上方//停止定时器timer.stop();//修改游戏是否结束标记isOver = true;//标记上方失误upside = true;//重绘界面drawArea.repaint();}//更新小球的坐标,重绘界面ballX += speedX;ballY += speedY;//重绘界面drawArea.repaint();}};timer = new Timer(100,task);//每隔100毫秒更新tasktimer.start();drawArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));frame.add(drawArea);//设置frame最佳大小,并且可视frame.pack();frame.setVisible(true);}public static void main(String[] args) {new PinBall().init();}}

备注:此代码是对哔站“黑马程序员java进阶教程深入浅出讲解java的图形化界面编程p32”的改编。

双人弹球小游戏 (基于Java图形化界面编程)相关推荐

  1. Java图形化界面编程

    Java图形化界面编程(使用AWT) 文章目录  内容概述  容器Container   Window   Panel   ScrollPane   Box  布局管理器   FlowLayout   ...

  2. Java图形化界面编程之——AWT

    目录 1.AWT简介 2.AWT继承体系 3.Container容器 3.1.Container继承体系 3.2.常用API 3.2.1.Component的常用方法 3.2.2.Container的 ...

  3. java 图形化界面编程--awt编程

    二. AWT 编程 2.1 AWT简介 ​ 当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具 ...

  4. Java 图形化界面编程(Swing)入门实例

    本文目录 入门实例 先整一个图形化界面出来 常用布局 流式布局 网格布局 边界布局 边界布局 四个入门实例(附截图) 一个小demo(单词计数) 一个较为完整的demo Java (Swing)文件版 ...

  5. Java图形化界面编程超详细知识点(8)——列表框

    目录 5 JList.JCpmboBox实现列表框 5.1 简单列表框 5.2 不强制存储列表项的ListModel和ComboBoxMedel 5.3 强制存储列表项的DefaultListMode ...

  6. Java图形化界面编程超详细知识点(10)——Swing_表格

    目录 7 JTable.TableModel实现表格 7.1 创建简单表格 7.2 TableModel 7 JTable.TableModel实现表格 表格也是GUI程序中常用的组件,表格是一个由多 ...

  7. Java图形化界面编程超详细知识点(9)——Swing_树

    目录 6 JTree.TreeModel实现树 6.1 创建树 6.2 编辑树结点 6.3 监听结点事件 6.4 使用DefaultTreeCellRenderer改变结点外观 6.5 扩展Defau ...

  8. Java图形化界面编程超详细知识点(7)——进度条

    目录 4 JProgressBar.ProgressMonitor.BoundedRangeModel实现进度条 4.1 创建进度条 4 JProgressBar.ProgressMonitor.Bo ...

  9. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

最新文章

  1. 自旋锁spinlock解析
  2. gradle不能下载最新依赖包问题
  3. 视频目标跟踪算法综述
  4. 普大喜奔 | Azure 免费送网站SSL证书啦!
  5. 不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络!
  6. js中加“var”和不加“var”的区别,看完觉得这么多年js白学了
  7. 复杂性思维 中文第二版 翻译完成
  8. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)
  9. 小记一下:CentOS里用多个iso镜像安装Xen虚拟机
  10. 盛情难却:北京,QECon来了
  11. 93、App Links (应用程序链接)实例
  12. PHP 实现敏感词过滤(附敏感词库)
  13. 客户端配置ARP绑定防止ARP网关欺骗
  14. matlab 多项式画图,matlab多项式画图
  15. 观察数据时易出错的点
  16. php图书管理系统外文文献,JSP图书管理系统论文+源码+英文文献翻译+参考文献 第10页...
  17. 佩戴十字架项链有什么特殊含义?
  18. T0、T1、TS、D1是什么鬼?一文看懂POS机刷卡到账模式区别和利弊
  19. wi-fidns服务器未响应,192.168.31.1登录界面
  20. deepin提取DSDT

热门文章

  1. netbox 导出 csv 中文乱码、时区修改
  2. 浅识一下GFS分布式文件系统
  3. 阿里短信 ajax,阿里大于-短信验证码接口
  4. 绿色软件是怎么制作的?(转)
  5. 【Nmap使用详解】黑客渗透工具Nmap下载安装/实战使用,保姆级Namp教程
  6. python 读写json文件
  7. 华为p40pro手机计算机在哪里,华为p40pro手机返回键在哪里设置
  8. 群辉系统DS918+ DSM 7.11系统安装升级
  9. 秒杀系统如何防止超卖?
  10. 谈一谈|编程中的数学思维