问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求解答以下的java源代码,详细点,说明这个程序的设计思路,还有比如运用了多线程的话运用了多线程的什么

发布网友 发布时间:2022-05-21 08:34

我来回答

3个回答

热心网友 时间:2023-10-20 23:11

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.Timer;
public class PinBall
{
private final int TABLE_WIDTH = 300;//桌面宽度
private final int TABLE_HEIGHT = 400;//桌面高度
private final int RACKET_Y = 340;//球拍的垂直位置
private final int RACKET_HEIGHT = 20;//球拍高度
private final int RACKET_WIDTH = 60;//球拍宽度
private final int BALL_SIZE = 16;//球的大小
private Frame f = new Frame("弹球游戏");//实例化一个窗口
Random rand = new Random();//实例化一个随机数生成器
private int ySpeed = 10;//小球的纵向运动数度、
private double xyRate = rand.nextDouble() - 0.5;//返回一个-0.5到0.5之间的比率用控制小球运动方向
private int xSpeed = (int)(ySpeed*xyRate*2);//这个横向速度在-10到10之间,产生左右摆动运动效果
private int ballX = rand.nextInt(200)+20;//小球开始的横坐标位置,200表示产生0到100之间的随机数
private int ballY = rand.nextInt(10)+20;//小球开始的纵坐标位置
private int racketX = rand.nextInt(200);//球拍开始时的横坐标位置
private MyCanvas tableArea = new MyCanvas();//实力化一个画布工具,集成Canvas类
private String shape = "";//保存需要绘制图形的字符串属性
Timer timer;//声明一个时间变量
private boolean isLose = false;//表示游戏是否结束

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;//按一左键次向左移动10个像素
}
if(ke.getKeyCode()==KeyEvent.VK_RIGHT)//按下键盘右键时
{
if(racketX < TABLE_WIDTH - RACKET_WIDTH)//球拍右边框不能出画布的右边框
racketX +=10;//按一次右键移动向右移动10个像素
}
}
};
f.addKeyListener(keyProcessor);//给窗口添加键盘*
tableArea.addKeyListener(keyProcessor);//给画布添加键盘*
ActionListener taskPerformer = new ActionListener()//这里是实例化了一个监听接口,这个接口里面只有一个方法
{
public void actionPerformed(ActionEvent evt)//重写这个接口里面的方法,判断小球的位置
{
if(ballX<=0 || ballX>=TABLE_WIDTH-BALL_SIZE)//保证小球横向上在画布之内运动
{
xSpeed = -xSpeed;//触发反方向运动
}
if(ballY>=RACKET_Y-BALL_SIZE&&(ballX<racketX||ballX>racketX+RACKET_WIDTH))//出了球拍的可击打范围
{
timer.stop();//停止对*的触发
isLose=true;//将标志isLose变量置为true
tableArea.repaint();//调用画布的重绘方法
}
else if(ballY<=0||(ballY>=RACKET_Y-BALL_SIZE&&ballY>racketX&&ballX<=racketX+RACKET_WIDTH))//小球在球拍之内,而其到达球拍的高度
{
ySpeed=-ySpeed;//上下方向改变,小球反弹
}
ballY+=ySpeed;//小球的坐标在纵向上增加
ballX+=xSpeed;//小球的坐标在横向上的增加
tableArea.repaint();//调用画布的重绘方法3
}
};
timer = new Timer(100,taskPerformer);//每隔0.1秒运行一次*
timer.start();//计时器开始运行
f.addWindowListener(new MyListener());//关闭窗口事件
f.pack();//设置窗口最佳大小
f.setVisible(true);//显示窗口
}
class MyListener extends WindowAdapter//关闭窗口的类
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
public static void main(String[] args)//程序入口
{
new PinBall().init();//调用PinBall类里面的init()方法
}
class MyCanvas extends Canvas//建一个集成Canvas类的类
{
public void paint(Graphics g)//重写父类的绘图方法
{
if(isLose)//如果isLose为真,则在画布里打印“游戏已结束”
{
g.setColor(new Color(255,0,0));//当前颜色
g.setFont(new Font("黑体",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,RACKET_Y,RACKET_WIDTH,RACKET_HEIGHT);//填充颜色,根据坐标和长宽填充矩形
}
}
}
}追问就是这个源码,求解

热心网友 时间:2023-10-20 23:11

很简单的一个碰撞事件监听程序
一堆private静态属性定义了桌面的宽高,球拍Y坐标,球拍的高宽以及球的大小,加final表示静态数值不可变
Frame f = new Frame("弹球游戏");实例化窗口,即运行程序时所见到的窗口
随机数的生成应该算是本程序的精华了,这个你得注意

Random rand = new Random();//实例化一个随机数生成器
private int ySpeed = 10;//小球的纵向运动数度、
这两行没什么
private double xyRate = rand.nextDouble() - 0.5;
rand.nextDouble()只是从0到1之间的小数,xyRate的取值范围在-0.5到0.5之间,通过正负判断移动方向
private int xSpeed = (int)(ySpeed*xyRate*2);X方向上的移动方向和速度,同样方向通过正负判断
private int ballX = rand.nextInt(200)+20;//小球开始的横坐标位置,200表示产生0到100之间的随机数
private int ballY = rand.nextInt(10)+20;//小球开始的纵坐标位置
通过(ballX,ballY)坐标显示小球的初始位置
private int racketX = rand.nextInt(200);球拍初始位置,Y坐标固定X随机取值
Timer timer;//声明一个时间变量 这是一个记时器,后面会用到

init()方法初始化
有注释就不一一说明了,加了个键盘事件*,ke.getKeyCode()==KeyEvent.VK_RIGHT通过ke值判断按下的左或右键控制球拍的左右移动

ActionListener taskPerformer = new ActionListener()//这里是实例化了一个监听接口并重写了接口里的actionPerformed(ActionEvent evt)方法
actionPerformed(ActionEvent evt)判断小球的位置
if(ballX<=0 || ballX>=TABLE_WIDTH-BALL_SIZE) if语句控制xSpeed的正负,保证小球在水平方向上不跑出画布
if(ballY<=0||(ballY>=RACKET_Y-BALL_SIZE&&ballY>racketX&&ballX<=racketX+RACKET_WIDTH))判断小球与画布上边界或球拍碰撞ySpeed改变正负,小球反方向运动

timer = new Timer(100,taskPerformer);记时器在这里起作用了,每100毫秒触发taskPerformer里的actionPerformed(ActionEvent evt)方法执行一次,产生小球的移动效果

热心网友 时间:2023-10-20 23:12

解答的java源码在哪儿呢?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
铁锅怎么样才能不生锈 机油型号为10w40冬天能用吗 10w40机油是什么季节机油 冬季可以使用什么机油 240280420什么意思_240280350420是什么 如何安曲线锯 这个是情侣头像吗?另一半在哪? 哪位大神有作业帮2021署期高一化学尖端班林森资源链接分享万分感谢亲 ... wpsppt怎么做柱状图 ppt添加柱状图教程一览 ppt如何获得数据柱状图 请问什么是炎症反应性细胞改变? 谁能发给我Java23种设计模式的经典源码? Java语言程序设计源代码?求程序代码 用JAVA 编程的源代码 急需:一篇写“我和XXX之间”的作文180字!!!小学水平!!! 幂级数的展开 给出详细过程 谢谢 函数幂级数展开式: 幂级数的展开式 高数,求展开幂级数。 父母结婚纪念日diy礼物哪里可以制作?具有收藏意义的! 结婚纪念日的礼物 结婚纪念日送什么礼物给老婆? 给结婚14年的父母diy什么结婚纪念日礼物比较好 滴进双氧水后耳朵里没有一点响声 用过双氧水后,耳朵闷是怎么回事?有相同经历的朋友请说下你们是怎么处理的? 过几天就是我和老婆结婚二周年纪念日了,送花太俗了,有什么创意的东西可以给她惊喜呢? 我掏耳朵受伤用双氧水洗后出现耳鸣怎么治疗 得了中耳炎,为什么用双氧水洗反而有一个耳朵到听不 耳朵进水了接着出脓水听不清而且头发翁头疼怎么办?用双氧水洗了,洗了几次后疼不敢洗了,滴耳液消炎药都吃 我有中耳炎用了双氧水洗耳,怎么感觉耳朵听 用双氧水洗过耳朵,现一边耳朵听力差是什么原因 刷机必须用update.zip文件名? 内存卡里面一个这个能删吗?update.zip 请问去哪办韩国留学签证 重庆双色球开奖在哪个电视台直播几点? 办理韩国留学签证在哪个城市办都行的吗? 重庆双色球开奖时间频道,究竟是几频道哟!重庆的 深圳的著名景点有什么 优酷视频能不能看教育频道直播? 重庆的小学生在家上网课上哪个网课比较好? 未按时交货的违约条款怎么赔偿 快递迟迟不送货可以要求赔偿吗么? 运输合同违约金赔偿标准是什么 莱珀妮塑身衣真的有效果吗? 昆明有没有莱珀妮塑身内衣卖,有人试过没有?吸脂效果好不好? 老师,我想对你说400字作文 坐月子可以吃凉的东西吗 坐月子为什么不能喝凉水 坐月子不能着凉,为什么产妇不能贪凉? 月子期间不可以吃凉性的食物? 坐月子能吃凉的东西吗