Java编程经典游戏设计-打砖块游戏源码
更新时间:2017年11月13日15:27:49 作者:LeoZhan
本文主要介绍经典的Java编程游戏设计——Brickbreaker游戏源码,相当不错,有一定的参考价值。 有需要的同学可以理解。
【程序中使用的数据结构和符号说明】
HitBrick类
GreenBallThread 控制球的路线
xUp、yUp、bouncing 定义变量存储 16 位值
x,y 球坐标
xDx、yDy 坐标增量
MAX_X、MAX_Y坐标最大值
更新初始化
标签 标签
Rx、Ry 傻瓜坐标
砖[]砖
球
HitBrick() 定义直拍球和砖块的位置坐标
keyPressd(keyEent) 定义球开始键(按空格键开始)
keyReleased(keyEvent) 接收按键风暴侦听器套接字)
keyTyped(keyEvent) keyEvent 在键入空格键时调用
油漆(图形)用颜色填充砖块
move 定义球的轨迹和砖块的消失
主要主要功能
球螺纹类
通过继承Thread类对Ball类进行线程化,将球的弹跳动作放入Run()中执行
砖类
定义砖块坐标和砖块按钮
球类
定义小球坐标的位置
【程序设计流程】
程序中使用的一些方法的解释
启动命令:空格键
私有JLabel标签; 定义一个标签,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);
砖[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=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; }
如果判定球的横坐标是递减的java小游戏源码带报告,则球的横坐标=球的原横坐标+球的横坐标的增量,否则球的横坐标=球的原横坐标-球的横坐标的增量球的横坐标; 原因
if(y=MAX_Y-15){ yDy=(int)(Math.random()*5+2); //yUp=false; break; }
判断小球是否到达屏幕底部(底部纵坐标定义为0),小球被向上拉。 其原理与球、直拍的回调规则相同。 否则,判断小球的纵坐标是否小于MAX_Y-15(垂直坐标最大值-15),改变回调规则,使横坐标不变,纵坐标随机变化
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; //
重启java小游戏源码带报告,初始化,小球静止,所有砖块可见,小球为横坐标方向,可与直拍连接。 在游戏打开之前,纵坐标无法更改。 定义球的横坐标和纵坐标增量为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(Rx300){ 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;iRx&&x+5=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=MAX_Y-15){ yDy=(int)(Math.random()*5+2); //yUp=false; break; } 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); } }
运行结果:
空格键开始,方向键控制左右,死亡再次开始。
虽然系统的基本功能已经实现,但仍然存在系统不稳定等诸多Bug有待解决。 在搭建系统的过程中,我遇到了很多问题,有的是知识储备不足,有的是考虑不够周到,所以学习之路永远不会结束。 作为一名程序程序员,你必须保持清醒的头脑,立足实际,让你的每一行代码都能实现自己的意义。
总结
以上就是本文关于Java编程经典游戏设计——打砖块游戏源码的全部内容,希望对您有所帮助。 有兴趣的同学可以继续参考本站:JavaWeb项目中dll文件的动态加载方法分析(详细步骤)、Python基础练习的几个简单游戏等,如有疑问可以留言随时回复,编辑会及时回复您。 感谢同学们对本站的支持!
发表评论