是男人就坚持5秒
java小游戏——是男人就坚持20秒
给大家分享一个小游戏,这是一个Swing项目,先用代码画界面板,然后依次添加飞机、子弹、计时器等:
代码如下:
/*
* 程序的主窗体
*/
public class FrmMain extends JFrame {
/*
* 初始的一些全局变量 1是否存活 2方向 3子弹数量 4飞机
*/
// 1是否存活
public static boolean isRun = true;
// 2方向
public static boolean right, left, up, down;
// 3子弹数量
public static int num = 30;
// 4飞机
private JLabel plane;
public FrmMain() {
isRun=true;
// 设置大小
setSize(400, 600);
// 设置居中
setLocationRelativeTo(null);
// 设置点关闭时,程序退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 得到内容面板
final container c = getcontentPane();
c.setBackground(color.BLACK);
// 设置标题
settitle("是男人就坚持20秒");
// 设置绝对定位
c.setlayout(null);
// 添加标签
final JLabel lblDesc = new JLabel("是男人就坚持20秒");
lblDesc.setBounds(133, 175, 113, 31);
lblDesc.setForeground(Color.WHITE);
c.add(lblDesc);
// 添加按钮
final JButton btnStart = new JButton("开始");
btnStart.setBounds(133, 210, 113, 31);
c.add(btnStart);
// 设置可见
setVisible(true);
//设置内容面板获取焦点
c.setFocusable(true);
/*
* 增加键盘事件
*/
c.addKeyListener(new KeyAdapter() {
// 按下,具体实现,即为按钮把对应的方向设置为true
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left=true;
break;
case KeyEvent.VK_RIGHT:
right=true;
break;
case KeyEvent.VK_UP:
up=true;
break;
case KeyEvent.VK_DOWN:
down=true;
break;
}
}
// 释放,把当前方向再设置成false
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left=false;
break;
case KeyEvent.VK_RIGHT:
right=false;
break;
case KeyEvent.VK_UP:
up=false;
break;
case KeyEvent.VK_DOWN:
down=false;
break;
}
}
});
/*
* 增加鼠标的点击事件
*/
btnStart.addactionlistener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//把当前标签和按钮隐藏
btnStart.setVisible(false);
lblDesc.setVisible(false);
//飞机
plane = new JLabel(new ImageIcon("img/plane.png"));
plane.setBounds(150, 400, 33, 33);
c.add(plane);
//刷新页面
plane.updateUI();
//飞机实现 移动
new MoveThread(plane,c).start();
//计时器
new TimerThread(c).start();
//子弹
for(int i=0;i<num;i++){
new BulletThread(c,plane,FrmMain.this).start();
}
}
});
}
/*
* 程序的入口
*/
public static void main(String[] args) {
// new 就是一个对象
new FrmMain();
}
}
/*
* 飞机移动的线程类
*/
public class MoveThread extends Thread {
//飞行速度
private int speed=5;
//飞机
private JLabel plane;
//内容面板
private Container c;
public MoveThread(JLabel plane, Container c) {
this.plane=plane;
this.c=c;
}
/*
* 飞机运算的线程实现
* @see java.lang.Thread#run()
*/
@Override
public void run() {
while(FrmMain.isRun){
if(FrmMain.left){
//设置左飞机
plane.setIcon(new ImageIcon("img/planeLeft.png"));
//如果是超过左边边缘,x轴则设置为零
if(plane.getX()-speed<0){
plane.setLocation(0, plane.getY());
}else{
plane.setLocation(plane.getX()-speed, plane.getY());
}
}else if(FrmMain.right){
//设置成右飞机
plane.setIcon(new ImageIcon("img/planeRight.png"));
//如果x轴+飞宽+移动大小超过内容面板,则设置最靠右(内容面板-飞机宽的x轴大小)
if(plane.getX()+plane.getWidth()+speed>c.getWidth()){
plane.setLocation(c.getWidth()-plane.getWidth(), plane.getY());
}
else{
plane.setLocation(plane.getX()+speed, plane.getY());
}
}else if(FrmMain.up){
//正飞机
plane.setIcon(new ImageIcon("img/plane.png"));
//如果飞最上面,超过边界后,作的处理
if(plane.getY()-speed<0){
plane.setLocation(plane.getX(), 0);
}
else{
plane.setLocation(plane.getX(), plane.getY()-speed);
}
}else if(FrmMain.down){
//正飞机
plane.setIcon(new ImageIcon("img/plane.png"));
//如果飞最下面,超过边界后,作的处理
if(plane.getY()+speed+plane.getHeight()>c.getHeight()){
plane.setLocation(plane.getX(), c.getHeight()-plane.getHeight());
}else{
plane.setLocation(plane.getX(), plane.getY()+speed);
}
}
//在线程时,间隔50毫秒执行一回
try {
sleep(50);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
}
}
/*
* 子弹线程
*/
public class BulletThread extends Thread {
// 内容面板
private Container c;
// 飞机
private JLabel plane;
// 子弹
private JLabel lblBullet;
// x轴速度
private int xSpeed;
// y轴速度
private int ySpeed;
private FrmMain frmMain;
public BulletThread(Container c, JLabel plane, FrmMain frmMain) {
this.c = c;
this.plane = plane;
this.frmMain=frmMain;
// 随机类
Random random = new Random();
// 创建 子弹
lblBullet = new JLabel(new ImageIcon("img/bullet.png"));
lblBullet.setLocation(random.nextint(c.getWidth()), random.nextInt(c.getHeight()/2));
// 随机x轴速度
xSpeed = random.nextInt(5) + 1;
// 随机y轴速度
ySpeed = random.nextInt(5) + 1;
c.add(lblBullet);
}
// 张程实现
@Override
public void run() {
while (FrmMain.isRun) {
//子弹超过上下左右边缘的处理
if (lblBullet.getX() < 0 || lblBullet.getX() > c.getWidth()) {
xSpeed = -xSpeed;
}
if (lblBullet.getY() < 0 || lblBullet.getY() > c.getHeight()) {
ySpeed=-ySpeed;
}
lblBullet.setBounds(lblBullet.getX()+xSpeed, lblBullet.getY()+ySpeed, 12, 12);
//判断子弹与飞机的交集
if(lblBullet.getBounds().intersects(plane.getBounds())){
//结束
FrmMain.isRun=false;
//爆炸
int x = plane.getX()-plane.getWidth();
int y= plane.getY()-plane.getHeight();
//启动爆炸线程
new ExplosionThread(x,y,c,plane,frmMain).start();
}
try {
sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* 计时线程
*/
public class TimerThread extends Thread {
//内容面板
private Container c;
public TimerThread(Container c) {
this.c=c;
}
//线程实现
@Override
public void run() {
//1添加JLabel 00:
JLabel lblTime = new JLabel("00:00");
lblTime.setBounds(350, 0, 50, 20);
lblTime.setForeground(Color.YELLOW);
c.add(lblTime);
lblTime.updateUI();
//2获取当前时间
long start = system.currenttimemillis();
//3刷新
decimalformat df = new DecimalFormat("00");
while(FrmMain.isRun){
long x = System.currentTimeMillis()-start;
int second= (int)(x/1000);
int mSecond=(int)(x%1000/10);
lblTime.setText(df.format(second)+":"+df.format(mSecond));
//休眠50毫秒
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* 爆炸线程
*/
public class ExplosionThread extends Thread {
private int x;
private int y;
private Container c;
private JLabel plane;
//最先的窗体
private FrmMain frmMain;
public ExplosionThread(int x, int y, Container c, JLabel plane, FrmMain frmMain) {
this.x=x;
this.y=y;
this.c=c;
this.plane=plane;
this.frmMain=frmMain;
}
//线程实现
@Override
public void run() {
//爆炸的起始图片
JLabel lblExplosion =new JLabel(new ImageIcon("img/explosion2-1.png"));
lblExplosion.setBounds(x, y, 128, 128);
c.add(lblExplosion);
plane.setVisible(false);
//爆炸的动画图片
for(int i=1;i<72;i++){
lblExplosion.setIcon(new ImageIcon("img/explosion2-"+i+".png"));
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//提示消息
JLabel lblEnd = new JLabel("Game Over");
lblEnd.setForeground(Color.RED);
lblEnd.setBounds(160, 200, 100, 50);
c.add(lblEnd);
//再来一局
JButton btnAgain = new JButton("再来一局");
btnAgain.setBounds(150, 250, 100, 50);
c.add(btnAgain);
lblEnd.updateUI();
btnAgain.updateUI();
//再来一局的事件
btnAgain.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new FrmMain();
frmMain.setVisible(false);
}
});
}
}
以上就是这个小游戏的所有代码实现部分,总共不到400行代码,快写一个试试吧。
相关阅读
现在,越来越多的投资开始涌向金融行业,金融科技俨然成为目前全球最热门话题,金融科技迅猛发展,使得金融行业发生了巨大变化。金融是本
你是如何坚持读完《算法导论》这本书的? 《算法导论》不够猛,答者顺便补充 “你是如何坚持读完《计算机编程的艺术》这本书的?”
源代码加图片加背景音乐链接:https://pan.baidu.com/s/1Ll_vVsBC-lYNpLrSRAz5ew提取码:h2ds复制这段内容后打开百度网盘手机App,操作
三子棋:在3*3的棋盘中,谁先用自己的棋走出一条直线(横着三个/竖着三个/对角线三个),谁就算赢!下面我们就来一起编写一下这个小游戏吧!!!首
观察了蚂蚁森林有一阵子,说说我的看法。过去毕竟总戴着有色眼镜看支付宝,所以这个产品刚出来时,没有体验的欲望。过了一阵子,身边大家