文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java怎么打砖块小游戏

2023-05-30 21:27

关注

这篇文章主要介绍了Java怎么打砖块小游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

[程序中使用的数据结构和符号说明]

HitBrick类

GreenBallThread控制小球路线

xUp,yUp,bouncing定义变量存储16位数值形式

x,y小球坐标

xDx,yDy坐标增量

MAX_X,MAX_Y坐标最大值

renew初始化

label标签

Rx,Ry横板坐标

Brick[]砖块

ball小球

HitBrick()定义小球横板及砖块位置坐标

keyPressd(keyEent)定义小球启动键(按空格键启动)

keyReleased(keyEvent)接收键盘事件侦听器接口)

keyTyped(keyEvent)键入空格键时调用keyEvent

paint(Graphics)对砖块填充颜色

move定义小球的运动轨迹和砖块的消失

main主函数

BallThread类

通过继承Thread类使Ball类线程化,并把小球的弹跳动作放进Run()中执行

Brick类

定义砖块坐标位置和砖块按钮

Ball类

定义小球坐标位置

[程序设计流程]

程序中使用的部分方法解释

开始命令:空格键

privateJLabellabel;定义一个标签,label=newJLabel("按空格键开始");内容为空格键开始,addKeyListener(this);定义一个键盘监听器,

if (e.getKeyCode() ==e.VK_SPACE) {   if(renew){    greenBallThread=new BallThread(this);    bouncing = true;    greenBallThread.start();    label.setVisible(false);   }   renew=false;  }

重置并开始游戏

移动命令:方向键左键和右键

if(e.getKeyCode()==e.VK_LEFT){   Rx=Rx-20;   if(bouncing){    if(Rx<0){     Rx=0;    }   }   else{    if(Rx<0){     Rx=0;    }    else{     x=x-20;     ball.ball_x=x;    }   }   repaint();  }

同开始命令原理,如果键入左键,横版向左移动20个单位(Rx为横板坐标),如果小球还在运动,当横板移到最左侧(Rx=0),不能再向左移动,则横板靠在最左侧(Rx=0),

if(e.getKeyCode()==e.VK_RIGHT){   Rx=Rx+20;   if(bouncing){    if(Rx+80>300){     Rx=220;    }   }   else{    if(Rx+80>300){     Rx=220;    }    else{     x=x+20;     ball.ball_x=x;    }   }   repaint();  } }

向右移动同向左移动原理,因为定义界面横坐标最大值为300,横板长度80,故Rx=220时碰最右侧

砖块设定:

brick[0]=new Brick(0,60,50,20);  brick[1]=new Brick(50,60,50,20);  brick[2]=new Brick(100,60,50,20);……brick[16]=new Brick(200,160,50,20);  brick[17]=new Brick(250,160,50,20);  ball=new Ball(150,450,10,10);
public void paint(Graphics g){  super.paint(g);  ball.rect.setLocation(x,y);  if(bouncing){   for(int i=0;i<=17;i++){    if(brick[i].visible==true){     switch(i){      case 0 :g.setColor(Color.blue);          break;      case 1 :g.setColor(Color.cyan);          break;      case 2 :g.setColor(Color.gray);          break;       ……case 17 :g.setColor(Color.yellow);          break;      }    g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);    }   }   g.setColor(Color.red);   g.fillOval(x, y, 10, 10);   g.setColor(Color.blue);   g.fillRect(Rx,Ry,80,20);

brick[0]=newBrick(0,60,50,20);设置砖块坐标,ball=newBall(150,450,10,10);和小球的坐标

if(brick[i].visible==true)判断砖块存在,用switch语句,逐个对砖块填充颜色,最后四行代码是分别对小球和横板颜色坐标的定义

小球的移动:

try{    Thread.currentThread().sleep(25);   }   catch(InterruptedException exception){    System.err.println(exception.toString());   }

定义小球的速度,若发生错误,则执行catch语句,打印错误

for(int i=0;i<=17;i++){    if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){     brick[i].visible=false;     yUp=!yUp;/    }   }

当小球接触到砖块时,砖块不可见(消失)

if(x+5>Rx&&x+5<Rx+80&&y+10>=Ry){    yUp=false;    xDx=(int)(Math.random()*5+2);    yDy=(int)(Math.random()*5+2);   }

判断小球坐标和横板坐标,当小球落在横板坐标之内,小球反弹,小球横坐标和纵坐标都以一个随机值改变后运动

if(xUp==true){    x+=xDx;   }   else{    x-=xDx;   }   if(yUp==true){    y+=yDy;   }   else{    y-=yDy;   }

判断小球横坐标如果在增加,小球横坐标=小球原横坐标+小球横坐标增量,否则小球横坐标=小球原横坐标-小球横坐标增量;纵坐标同理

if(y<=0){    y=0;    ball.ball_y=y;    yUp=true;    xDx=(int)(Math.random()*5+2);    yDy=(int)(Math.random()*5+2);   }   else if(y>=MAX_Y-15){    yDy=(int)(Math.random()*5+2);    //yUp=false;    break;   }

判断小球到画面顶部(定义顶部的纵坐标为0),小球向下反弹,原理同小球和横板接触的反弹规则,否则,判断小球纵坐标是否大于MAX_Y-15(纵坐标最大值-15),反弹规则改变为横坐标不变,纵坐标随机改变

if(x<=0){    x=0;    ball.ball_x=x;    xUp=true;    xDx=(int)(Math.random()*5+2);    yDy=(int)(Math.random()*5+2);   }   else if(x>=MAX_X-10){    x=MAX_X-10;    ball.ball_x=x;    xDx=(int)(Math.random()*5+2);    yDy=(int)(Math.random()*5+2);    xUp=false;   }

判断小球到画面最左侧(定义最左侧横坐标为0),向右侧反弹,反弹规则同小球和横板接触的反弹规则,或者小球到画面最右侧,向左反弹,反弹规则同上,(if(x>=MAX_X-10)判断小球是否到右边侧,小球的直径为10)

int i;                        for(i=0;i<=17&&brick[i].visible==false;i++){     }   if(i==18){    break;   }

如果所有砖块都不可见,则重新玩

renew=true;     //初始化  bouncing=false;  for(int i=0;i<=17;i++){   brick[i].visible=true;  }  xUp=true;  yUp=false;  xDx=1;  yDy=1;  x=150;  y=450;  Rx=120;  Ry=460;       //

重新开始,初始化,小球静止,所有砖块可见,小球在横坐标方向,可随横板移动而移动,纵坐标在未开时游戏前不能改变,定义小球横坐标和纵坐标增量都为1,小球初始位置坐标(150,450)横板初始位置坐标(120,460)

[源程序]

import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.event.*;public class HitBrick extends JFrame implements KeyListener{private BallThread greenBallThread;//控制小球的线程private Boolean xUp,yUp,bouncing;private int x,y,xDx,yDy;//小球坐标,增量private final int MAX_X=300,MAX_Y=500;private Boolean renew;private JLabel label;private int Rx,Ry;//横板坐标private Brick brick[]=new Brick[18];//砖块private Ball ball;//小球public HitBrick(){super("打砖块");Container pane=getContentPane();//设置空白面板容器label=new JLabel("按空格键开始");//标签label.setHorizontalAlignment(JLabel.CENTER);//水平label.setVerticalAlignment(JLabel.BOTTOM);//垂直pane.add(label);//向面板里添加标签xUp=true;//横坐标可以移动yUp=false;//纵坐标不可以移动xDx=1;yDy=1;x=150;//小球坐标y=450;Rx=120;//横板坐标Ry=460;renew=true;bouncing=false;addKeyListener(this);//键盘监听器brick[0]=new Brick(0,60,50,20);//砖块坐标brick[1]=new Brick(50,60,50,20);brick[2]=new Brick(100,60,50,20);brick[3]=new Brick(150,60,50,20);brick[4]=new Brick(200,60,50,20);brick[5]=new Brick(250,60,50,20);brick[6]=new Brick(0,90,50,20);brick[7]=new Brick(50,110,50,20);brick[8]=new Brick(100,130,50,20);brick[9]=new Brick(150,130,50,20);brick[10]=new Brick(200,110,50,20);brick[11]=new Brick(250,90,50,20);brick[12]=new Brick(0,160,50,20);brick[13]=new Brick(50,160,50,20);brick[14]=new Brick(100,160,50,20);brick[15]=new Brick(150,160,50,20);brick[16]=new Brick(200,160,50,20);brick[17]=new Brick(250,160,50,20);ball=new Ball(150,450,10,10);//球的坐标setSize(MAX_X,MAX_Y);//窗口大小setResizable(false);setVisible( true );//可视化}public void keyPressed(KeyEvent e) {if (e.getKeyCode() ==e.VK_SPACE) {if(renew){greenBallThread=new BallThread(this);bouncing = true;greenBallThread.start();label.setVisible(false);}renew=false;}if(e.getKeyCode()==e.VK_LEFT){Rx=Rx-20;if(bouncing){if(Rx<0){Rx=0;}} else{if(Rx<0){Rx=0;} else{x=x-20;ball.ball_x=x;}}repaint();}if(e.getKeyCode()==e.VK_RIGHT){Rx=Rx+20;if(bouncing){if(Rx+80>300){Rx=220;}} else{if(Rx+80>300){Rx=220;} else{x=x+20;ball.ball_x=x;}}repaint();}}public void keyReleased (KeyEvent e) {}public void keyTyped (KeyEvent e){}public void paint(Graphics g){super.paint(g);ball.rect.setLocation(x,y);if(bouncing){for (int i=0;i<=17;i++){if(brick[i].visible==true){switch(i){case 0 :g.setColor(Color.blue);break;case 1 :g.setColor(Color.cyan);break;case 2 :g.setColor(Color.gray);break;case 3 :g.setColor(Color.green);break;case 4 :g.setColor(Color.magenta);break;case 5 :g.setColor(Color.yellow);break;case 6 :g.setColor(Color.white);break;case 7 :g.setColor(Color.black);break;case 8 :g.setColor(Color.orange);break;case 9 :g.setColor(Color.pink);break;case 10 :g.setColor(Color.darkGray);break;case 11 :g.setColor(Color.red);break;case 12 :g.setColor(Color.blue);break;case 13 :g.setColor(Color.cyan);break;case 14 :g.setColor(Color.gray);break;case 15 :g.setColor(Color.green);break;case 16 :g.setColor(Color.magenta);break;case 17 :g.setColor(Color.yellow);break;}g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);}}g.setColor(Color.red);g.fillOval(x, y, 10, 10);g.setColor(Color.blue);g.fillRect(Rx,Ry,80,20);} else{for (int i=0;i<=17;i++){switch(i){case 0 :g.setColor(Color.blue);break;case 1 :g.setColor(Color.cyan);break;case 2 :g.setColor(Color.gray);break;case 3 :g.setColor(Color.green);break;case 4 :g.setColor(Color.magenta);break;case 5 :g.setColor(Color.yellow);break;case 6 :g.setColor(Color.white);break;case 7 :g.setColor(Color.black);break;case 8 :g.setColor(Color.orange);break;case 9 :g.setColor(Color.pink);break;case 10 :g.setColor(Color.darkGray);break;case 11 :g.setColor(Color.red);break;case 12 :g.setColor(Color.blue);break;case 13 :g.setColor(Color.cyan);break;case 14 :g.setColor(Color.gray);break;case 15 :g.setColor(Color.green);break;case 16 :g.setColor(Color.magenta);break;case 17 :g.setColor(Color.yellow);break;}g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);}g.setColor(Color.red);g.fillOval(x, y, 10, 10);g.setColor(Color.blue);g.fillRect(Rx, Ry, 80, 20);}}public void move(){while(true){try{Thread.currentThread().sleep(25);}catch(InterruptedException exception){System.err.println(exception.toString());}for (int i=0;i<=17;i++){if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){brick[i].visible=false;yUp=!yUp;//打到球不可见}}if(x+5>Rx&&x+5<Rx+80&&y+10>=Ry){yUp=false;xDx=(int)(Math.random()*5+2);//小球坐标增量yDy=(int)(Math.random()*5+2);}if(xUp==true){x+=xDx;//小球左右移动坐标改变} else{x-=xDx;}if(yUp==true){y+=yDy;} else{y-=yDy;}if(y<=0){y=0;ball.ball_y=y;yUp=true;xDx=(int)(Math.random()*5+2);yDy=(int)(Math.random()*5+2);} else if(y>=MAX_Y-15){yDy=(int)(Math.random()*5+2);//yUp=false;break;}if(x<=0){x=0;ball.ball_x=x;xUp=true;xDx=(int)(Math.random()*5+2);yDy=(int)(Math.random()*5+2);} else if(x>=MAX_X-10){x=MAX_X-10;ball.ball_x=x;xDx=(int)(Math.random()*5+2);yDy=(int)(Math.random()*5+2);xUp=false;}ball.rect.setLocation(ball.ball_x,ball.ball_y);repaint();int i;//如果所有砖块都不可见for (i=0;i<=17&&brick[i].visible==false;i++){//则重新玩}if(i==18){break;}//}renew=true;//初始化bouncing=false;for (int i=0;i<=17;i++){brick[i].visible=true;}xUp=true;yUp=false;xDx=1;yDy=1;x=150;y=450;Rx=120;Ry=460;//repaint();repaint();label.setVisible(true);}public static void main(String[] args) {HitBrick mar=new HitBrick();}}class BallThread extends Thread{private HitBrick m;BallThread(HitBrick a){//super();m=a;}public void run(){m.move();m.repaint();}}class Brick{Rectangle rect=null;//长方形对象,砖块按钮的位置和宽高int brick_x,brick_y;//按扭的左上角坐标int brick_width,brick_height;//按扭的宽和高Boolean visible;public Brick(int x,int y,int w,int h)   {brick_x=x;brick_y=y;brick_width=w;brick_height=h;visible=true;rect=new Rectangle(x,y,w,h);//创建长方形对象---砖块按钮的位置和宽高。}}class Ball{Rectangle rect=null;int ball_x,ball_y;int ball_width,ball_height;public Ball(int x,int y,int w,int h){ball_x=x;ball_y=y;ball_width=w;ball_height=h;rect=new Rectangle(x,y,w,h);}}

运行结果:

Java怎么打砖块小游戏

空格键开始,方向键控制左右,死亡重新开始。

感谢你能够认真阅读完这篇文章,希望小编分享的“Java怎么打砖块小游戏”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯