4.5打砖块游戏


package view;import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class GameFrame {public GameFrame(){Frame f=new Frame("Block Game");GamePanel gp=new GamePanel();Thread t=new Thread(gp);t.start();f.setLocation(100,100);f.setSize(500,500);f.add(gp);f.setVisible(true);}public static void main(String args[]){new GameFrame();}
}
class GamePanel extends Panel implements KeyListener,Runnable{private Pad p;private Block bl;private Ball bal;int width=500;int height=500;public boolean padMoveRight;public boolean padMoveLeft;public boolean ballMove;public GamePanel(){p=new Pad(this);bl=new Block(this);bal=new Ball(this,p,bl);addKeyListener(this);}public void gameUpdate(){p.update();bl.update();bal.update();}public void paint(Graphics g){p.draw(g);bl.draw(g);bal.draw(g);}@Overridepublic void keyTyped(KeyEvent e) {// TODO 自动生成的方法存根}@Overridepublic void keyPressed(KeyEvent e) {// TODO 自动生成的方法存根int keycode=e.getKeyCode();if(keycode==KeyEvent.VK_LEFT){padMoveLeft=true;}if(keycode==KeyEvent.VK_RIGHT){padMoveRight=true;}}@Overridepublic void keyReleased(KeyEvent e) {// TODO 自动生成的方法存根int keycode=e.getKeyCode();if(keycode==KeyEvent.VK_RIGHT){padMoveRight=false;}if(keycode==KeyEvent.VK_LEFT){padMoveLeft=false;}}@Overridepublic void run() {// TODO 自动生成的方法存根while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}gameUpdate();//游戏刷新repaint();//重绘}}
}
class Pad{public Point location;//挡板坐标public Point size;//挡板尺寸private GamePanel gameP;public Pad(GamePanel gp){gameP=gp;size=new Point(100,20);location =new Point((gp.width-size.x)/2,gp.height-size.y);//初始位置位于屏幕正下方}public void update(){if(gameP.padMoveRight){                   //如果玩家按下右键if(location.x+size.x<gameP.width){  //如果右边沿没有出界location.x+=10;                  //挡板向右移动}//if}//ifif(gameP.padMoveLeft){if(location.x>0){location.x-=10;}}}//updatepublic void draw(Graphics g){g.setColor(Color.BLACK);g.fillRoundRect(location.x,location.y,size.x,size.y,10,10);}
}
class Block{private GamePanel gameP;private Point allocation; //存放砖块的分布,行数*列数public Point location[];  //存放每个砖块的坐标public Point size;        //存放砖块的尺寸,长*宽public int num;             //存放砖块的数量public boolean exist[];    //标识砖块是否被敲击public Block(GamePanel gp){gameP=gp;num=20;allocation=new Point(4,5);//砖块分布为4行*5列size=new Point(50,20);location=new Point[num];for(int i=0;i<allocation.y;i++){for(int j=0;j<allocation.x;j++){//初始化各砖块的坐标值,让每个砖块均匀的分布在屏幕上部区域location[i*allocation.x+j]=new Point((gp.width/allocation.x-size.x)/2+j*(gp.width/allocation.x),(i*2+1)*size.y);}}exist=new boolean[num];//初始化exsit数组for(int i=0;i<num;i++){exist[i]=true;}}public void update(){for(int i=0;i<num;i++){if(exist[i]==false){//如果砖块被敲击,将其坐标设置在程序窗口范围之外location[i].setLocation(gameP.width+1,gameP.height+1);}}}public void draw(Graphics g){g.setColor(Color.gray);for(int i=0;i<num;i++){if(exist[i]==true){g.fillRect(location[i].x,location[i].y,size.x,size.y);}}}
}
class Ball{private GamePanel gameP;private Block blk;private Pad pd;private Point location;//小球的坐标private int diameter;private int dx;private int dy;public Ball(GamePanel gp,Pad p,Block bk){gameP=gp;blk=bk;pd=p;location=new Point(pd.location.x+(pd.size.x-diameter)/2,pd.location.y-pd.size.y);//小球初始值位于挡板正中央dx=10;dy=-5;diameter=20;}public void update(){if(gameP.ballMove){//若小球处于运动状态location.x+=dx;location.y+=dy;wallBounced();//小球与墙壁碰撞检测blockBounced();//小球与砖块碰撞检测padBounced();//小球与挡板碰撞检测  }else{          //若小球停止运动,回到挡板正中央location.setLocation(pd.location.x+(pd.size.x-diameter)/2,pd.location.y-pd.size.y);}}public void draw(Graphics g){g.setColor(Color.blue);g.fillOval(location.x, location.y, diameter, diameter);}
private boolean Bounce(Point bk_location,Point bk_size){if((location.x>bk_location.x-diameter) && (location.x<bk_location.x+bk_size.x) &&(location.y>bk_location.y-diameter) &&(location.y<bk_location.y+bk_size.y)){return true;}else{return false;}}
private void padBounced() {// TODO 自动生成的方法存根Point local1,local2,local3,size1,size2,size3;//水平方向按1:5:1的比例分割挡板,垂直方向只取挡板高度的1/4local1=pd.location;size1=new Point(pd.size.x*1/7,pd.size.y/4);local2=new Point(pd.location.x+pd.size.x*1/7,pd.location.y);size2=new Point(pd.size.x*5/7,pd.size.y/4);local3=new Point(pd.location.x+pd.size.x*6/7,pd.location.y);size3=new Point(pd.size.x*1/7,pd.size.y/4);if(Bounce(local2,size2)){dy=-dy;}else if(Bounce(local1,size1)){if(dx>0){dx=-dx;}dy=-dy;}else if(Bounce(local3,size3)){if(dx<0){dx=-dx;}dy=-dy;}}
private void blockBounced() {// TODO 自动生成的方法存根Point local1,local2,local3,size1,size2,size3;for(int i=0;i<blk.num;i++){//按照1:8:1的比例将每个砖块划分为三个区域R1、R2、R3local1=blk.location[i];size1=new Point(blk.size.x*1/10,blk.size.y);local2=new Point(blk.location[i].x+blk.size.x*1/10,blk.location[i].y);size2=new Point(blk.size.x*8/10,blk.size.y);local3=new Point(blk.location[i].x+blk.size.x*9/10,blk.location[i].y);size3=new Point(blk.size.x*1/10,blk.size.y);//分别对三个区域进行碰撞检测if(Bounce(local2,size2)){//若碰撞发生在R2区dy=-dy;               blk.exist[i]=false;}else if(Bounce(local1,size1)){if(dx>0){dx=-dx;}else {dy=-dy;}blk.exist[i]=false;}else if(Bounce(local3,size3)){if(dx<0){dx=-dx;}else{dy=-dy;}blk.exist[i]=false;}}}
 private void wallBounced() {// TODO 自动生成的方法存根if((location.x>gameP.width-diameter)||(location.x<0)){//小球碰撞到左边或右边墙壁,改变水平运动方向dx=-dx;}if(location.y<0){//小球碰到上方墙壁,改变垂直运动方向dy=-dy;}if(location.y>gameP.height){//小球落出窗口下边界,让小球停止运动gameP.ballMove=false;}}
}

Java游戏程序设计教程 4.5打砖块游戏相关推荐

  1. java游戏开发(java游戏开发教程)

    Java游戏开发绘图器是什么呢? 众所周知,Java GUI以paint进行绘图,以repaint进行图像刷新,而完成repaint及paint这一连贯过程中所用到绘图组件,我将其称为绘图器.就我个人 ...

  2. java语言程序设计教程翁恺第二版课后答案_《JAVA语言程序设计教程(第2版)/翁恺 肖少拥》翁恺,肖少拥著【摘要 书评 在线阅读】-苏宁易购图书...

    第1章  Java语言概述 1.1  Java的历史 1.2  Java程序运行环境与特点 1.2.1  跨平台(Cross Platform)/可移植性(Portablc) 1.2.2  运行效率 ...

  3. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day5,java面向对象程序设计教程课后答案

    行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类. 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能. 深入追问: 追问1:说一说你对抽象类 ...

  4. FXGL JAVA游戏引擎 教程 05.场景 (萌妹在线哭泣)

    上文中,我们已经有了一个漂亮的人物角色,但是对于一个游戏而言,除了可操控的游戏角色,各种弹出框也是必须设计考虑的一部分. 比如你希望播放一个过场动画,弹出一个对话框,打开背包栏目等等. 为了实现以上功 ...

  5. java语言程序设计教程课后题答案魏永红_《Java语言程序设计教程》习题参考答案...

    1 / 23 < Java 语 言 程 序 设 计 教 程 > 习 题 参 考 答 案 第 1 章 习题参考答案 一.选择题 1 . B 2 . D 3 . C 4 . B 5 . A 6 ...

  6. JAVA语言程序设计教程张席_Java语言程序设计教程

    第1章 预备知识 1 1.1 目前流行的编程语言简介 1 1.1.1 C/C 的一些概念 1 1.1.2 从C到C 2 1.1.3 面向对象初步知识 3 1.2 从C/C 到Java 4 习题 5 第 ...

  7. java语言程序设计教程第三版答案,看完跪了

    01 如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验. 我们常见的高并发场景有:淘宝的双11.春运时的抢票 ...

  8. FXGL JAVA游戏引擎 教程 03.游戏UI

    当我们拥有一个实体并且对其绑定了可移动的组件之后,我们拥有了一个可以自由操控控制的角色.但是距离成为一个真正的游戏还有几个必不可少的组件需要实现.其中游戏ui就是不可或缺的一个组件. 坐标系 对于所有 ...

  9. java语言程序设计教程课后题答案魏永红_Java语言程序设计教程习题答案

    < Java 语 言 程 序 设 计 教 程 > 习 题 参 考 答 案 第 1 章 习题参考答案 一.选择题 1 . B 2 . D 3 . C 4 . B 5 . A 6 . C 7 ...

  10. Java面试宝典!java语言程序设计教程魏永红

    字节跳动 面试前 头条的面试是三家里最专业的,每次面试前有专门的HR和你约时间,确定OK后再进行面试.每次都是通过视频面试,因为都是之前都是电话面或现场面,所以视频面试还是有点不自然.也有人觉得视频面 ...

最新文章

  1. c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...
  2. ansible配置zabbix自动化安装和配置
  3. mcq 队列_MCQ | 基础知识 免费和开源软件| 套装3
  4. 小米荣耀互怼:头部高管们神仙打架 到底谁是谁非?
  5. 兴城职高计算机,兴城学计算机,兴城学计算机去哪里,兴城学计算机一般工资能拿多少 - IT教育频道...
  6. 面试问题记录 2019.3.22(中国铁道科学研究院)
  7. linux 设置时间
  8. 如何部署WAR到tomcat?
  9. spring security 实现微信登录
  10. Qt简单实现UDP通信
  11. kjb文件 解析_十四期全国BIM一级考试真题及解析
  12. 香橙派 OrangPi PC 安装Lakka游戏系统及使用指南
  13. word小技巧 将图片批量居中
  14. 全面了解信贷业务流程
  15. ios 直播间点赞动画
  16. python定时开关机的代码_python实现Windows电脑定时关机
  17. 俞敏洪:度过有意义的生命
  18. 什么是 “VLAN” ?
  19. PV操作经典例题——哲学家进餐问题
  20. 动态规划(二)最优二分检索和0/1背包

热门文章

  1. 要看方兴东的博客 只能上Google去找他
  2. Symbols andSymbol Tables
  3. 凸优化第七章统计估计 作业题
  4. 性能测试之工具对比-ngrinder jmeter loadunner及ngrinder安装使用方法
  5. CrazyWing:Python自动化运维开发实战 七、Python数据类型之数字
  6. Oracle问题小记五:服务启动-索引-子查询-分页存储过程
  7. Linux下创建与解压zip, tar, tar.gz和tar.bz2文件--转 .
  8. javascript 之牛人感悟,必看学习
  9. Mad Libs游戏:熟悉python编程环境,基本输入输出
  10. 2017iOS开发最新的打包测试步骤(亲测)